diff --git a/src/check_type.cpp b/src/check_type.cpp index 5997a110a..f3ebf50a0 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1038,7 +1038,8 @@ ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_type, Type * param_value.value = exact_value_procedure(expr); } else { Entity *e = nullptr; - if (o.mode == Addressing_Value && is_type_proc(o.type)) { + // if (o.mode == Addressing_Value && is_type_proc(o.type)) { + if (o.mode == Addressing_Value || o.mode == Addressing_Variable) { Operand x = {}; if (expr->kind == Ast_Ident) { e = check_ident(ctx, &x, expr, nullptr, nullptr, false); @@ -1047,12 +1048,21 @@ ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_type, Type * } } - if (e != nullptr && e->kind == Entity_Procedure) { - param_value.kind = ParameterValue_Constant; - param_value.value = exact_value_procedure(e->identifier); - add_entity_use(ctx, e->identifier, e); + if (e != nullptr) { + if (e->kind == Entity_Procedure) { + param_value.kind = ParameterValue_Constant; + param_value.value = exact_value_procedure(e->identifier); + add_entity_use(ctx, e->identifier, e); + } else { + param_value.kind = ParameterValue_Value; + param_value.ast_value = expr; + add_entity_use(ctx, e->identifier, e); + } + } else if (allow_caller_location && o.mode == Addressing_Context) { + param_value.kind = ParameterValue_Value; + param_value.ast_value = expr; } else { - error(expr, "Default parameter must be a constant %d", o.mode); + error(expr, "Default parameter must be a constant"); } } } else { diff --git a/src/entity.cpp b/src/entity.cpp index ea2f8c119..5a112e5a2 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -62,11 +62,15 @@ enum ParameterValueKind { ParameterValue_Constant, ParameterValue_Nil, ParameterValue_Location, + ParameterValue_Value, }; struct ParameterValue { ParameterValueKind kind; - ExactValue value; + union { + ExactValue value; + Ast *ast_value; + }; }; diff --git a/src/ir.cpp b/src/ir.cpp index 476a7fba0..daa0770d2 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -5128,6 +5128,9 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { // args[i] = GB_PANIC("TODO ParameterValue_Location"); break; + case ParameterValue_Value: + args[i] = ir_build_expr(proc, e->Variable.param_value.ast_value); + break; } } else { args[i] = ir_emit_conv(proc, args[i], e->type); @@ -5221,6 +5224,9 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { case ParameterValue_Location: args[arg_index++] = ir_emit_source_code_location(proc, proc_name, pos); break; + case ParameterValue_Value: + args[arg_index++] = ir_build_expr(proc, e->Variable.param_value.ast_value); + break; } } } @@ -5312,6 +5318,9 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { case ParameterValue_Location: args[i] = ir_emit_source_code_location(proc, proc_name, pos); break; + case ParameterValue_Value: + args[i] = ir_build_expr(proc, e->Variable.param_value.ast_value); + break; } } }