From ae2af8315ee8538774efe2cf608d4be50be5305a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 28 Aug 2018 20:03:27 +0100 Subject: Allow for default parameters that are non-constant entities, but not any non-constant expression --- src/check_type.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/check_type.cpp') 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 { -- cgit v1.2.3