aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp22
-rw-r--r--src/entity.cpp6
-rw-r--r--src/ir.cpp9
3 files changed, 30 insertions, 7 deletions
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;
}
}
}