aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-19 21:45:04 +0100
committergingerBill <bill@gingerbill.org>2020-04-19 21:45:04 +0100
commit97f7a558faaf206bb7d10eaf3adce99322fd9541 (patch)
tree2a3e8f91525692f14de4064751efae62699f10bb /src/check_type.cpp
parent2c91c21021e1c4d1d675ee430e0d7ccf88e882be (diff)
`#optional_ok` tag for procedures
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 6df824ec1..73f732b45 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -2530,6 +2530,22 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node,
}
GB_ASSERT(cc > 0);
+ bool optional_ok = (pt->tags & ProcTag_optional_ok) != 0;
+ if (optional_ok) {
+ if (result_count != 2) {
+ error(proc_type_node, "A procedure type with the #optional_ok tag requires 2 return values, got %td", result_count);
+ } else {
+ Entity *second = results->Tuple.variables[1];
+ if (is_type_polymorphic(second->type)) {
+ // ignore
+ } else if (is_type_boolean(second->type)) {
+ // GOOD
+ } else {
+ error(second->token, "Second return value of an #optional_ok procedure must be a boolean, got %s", type_to_string(second->type));
+ }
+ }
+ }
+
type->Proc.node = proc_type_node;
type->Proc.scope = c->scope;
type->Proc.params = params;
@@ -2542,6 +2558,7 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node,
type->Proc.is_polymorphic = pt->generic;
type->Proc.specialization_count = specialization_count;
type->Proc.diverging = pt->diverging;
+ type->Proc.optional_ok = optional_ok;
type->Proc.tags = pt->tags;
if (param_count > 0) {