diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index a0871d52a6..f557e716a5 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -469,6 +469,7 @@ pub fn formatType( .Fn => { return format(context, Errors, output, "{}@{x}", .{ @typeName(T), @ptrToInt(value) }); }, + .Type => return output(context, @typeName(T)), else => @compileError("Unable to format type '" ++ @typeName(T) ++ "'"), } } diff --git a/src/ir.cpp b/src/ir.cpp index 0f66965a80..59fd21aace 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -17359,8 +17359,18 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod } } - bool comptime_arg = param_decl_node->data.param_decl.is_comptime || - casted_arg->value->type->id == ZigTypeIdComptimeInt || casted_arg->value->type->id == ZigTypeIdComptimeFloat; + bool comptime_arg = param_decl_node->data.param_decl.is_comptime; + if (!comptime_arg) { + switch (type_requires_comptime(ira->codegen, casted_arg->value->type)) { + case ReqCompTimeInvalid: + return false; + case ReqCompTimeYes: + comptime_arg = true; + break; + case ReqCompTimeNo: + break; + } + } ZigValue *arg_val; @@ -17395,17 +17405,6 @@ static bool ir_analyze_fn_call_generic_arg(IrAnalyze *ira, AstNode *fn_proto_nod } if (!comptime_arg) { - switch (type_requires_comptime(ira->codegen, casted_arg->value->type)) { - case ReqCompTimeYes: - ir_add_error(ira, casted_arg, - buf_sprintf("parameter of type '%s' requires comptime", buf_ptr(&casted_arg->value->type->name))); - return false; - case ReqCompTimeInvalid: - return false; - case ReqCompTimeNo: - break; - } - casted_args[fn_type_id->param_count] = casted_arg; FnTypeParamInfo *param_info = &fn_type_id->param_info[fn_type_id->param_count]; param_info->type = casted_arg->value->type; diff --git a/test/stage1/behavior/fn.zig b/test/stage1/behavior/fn.zig index 0e9e379f01..385b8bc418 100644 --- a/test/stage1/behavior/fn.zig +++ b/test/stage1/behavior/fn.zig @@ -255,3 +255,20 @@ test "function call with anon list literal" { S.doTheTest(); comptime S.doTheTest(); } + +test "ability to give comptime types and non comptime types to same parameter" { + const S = struct { + fn doTheTest() void { + var x: i32 = 1; + expect(foo(x) == 10); + expect(foo(i32) == 20); + } + + fn foo(arg: var) i32 { + if (@typeInfo(@typeOf(arg)) == .Type and arg == i32) return 20; + return 9 + arg; + } + }; + S.doTheTest(); + comptime S.doTheTest(); +}