Allow for default parameters that are non-constant entities, but not any non-constant expression

This commit is contained in:
gingerBill
2018-08-28 20:03:27 +01:00
parent adbb3bb75f
commit ae2af8315e
3 changed files with 30 additions and 7 deletions
+16 -6
View File
@@ -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 {