aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp19
-rw-r--r--src/checker.cpp13
-rw-r--r--src/parser.cpp2
-rw-r--r--src/parser.hpp2
-rw-r--r--src/types.cpp1
5 files changed, 14 insertions, 23 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 66417f97e..c024e0842 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -2006,22 +2006,21 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node,
}
}
}
- if (pt->tags & ProcTag_optional_second) {
+ if (pt->tags & ProcTag_optional_allocator_error) {
if (optional_ok) {
- error(proc_type_node, "A procedure type cannot have both an #optional_ok tag and #optional_second");
+ error(proc_type_node, "A procedure type cannot have both an #optional_ok tag and #optional_allocator_error");
}
optional_ok = true;
if (result_count != 2) {
- error(proc_type_node, "A procedure type with the #optional_second tag requires 2 return values, got %td", result_count);
+ error(proc_type_node, "A procedure type with the #optional_allocator_error tag requires 2 return values, got %td", result_count);
} else {
- bool ok = false;
- AstFile *file = proc_type_node->file();
- if (file && file->pkg) {
- ok = file->pkg->scope == ctx->info->runtime_package->scope;
- }
+ init_mem_allocator(c->checker);
- if (!ok) {
- error(proc_type_node, "A procedure type with the #optional_second may only be allowed within 'package runtime'");
+ Type *type = results->Tuple.variables[1]->type;
+ if (!are_types_identical(type, t_allocator_error)) {
+ gbString t = type_to_string(type);
+ error(proc_type_node, "A procedure type with the #optional_allocator_error expects a `runtime.Allocator_Error`, got '%s'", t);
+ gb_string_free(t);
}
}
}
diff --git a/src/checker.cpp b/src/checker.cpp
index 16e480786..cdc0630bf 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -2809,17 +2809,9 @@ void init_mem_allocator(Checker *c) {
if (t_allocator != nullptr) {
return;
}
- AstPackage *pkg = get_core_package(&c->info, str_lit("runtime"));
-
- String name = str_lit("Allocator");
- Entity *e = scope_lookup_current(pkg->scope, name);
- if (e == nullptr) {
- compiler_error("Could not find type declaration for '%.*s'\n", LIT(name));
- // NOTE(bill): This will exit the program as it's cannot continue without it!
- }
-
- t_allocator = e->type;
+ t_allocator = find_core_type(c, str_lit("Allocator"));
t_allocator_ptr = alloc_type_pointer(t_allocator);
+ t_allocator_error = find_core_type(c, str_lit("Allocator_Error"));
}
void init_core_context(Checker *c) {
@@ -2827,7 +2819,6 @@ void init_core_context(Checker *c) {
return;
}
t_context = find_core_type(c, str_lit("Context"));
- GB_ASSERT(t_context != nullptr);
t_context_ptr = alloc_type_pointer(t_context);
}
diff --git a/src/parser.cpp b/src/parser.cpp
index 70a87d2a5..2109945ec 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -1857,7 +1857,7 @@ void parse_proc_tags(AstFile *f, u64 *tags) {
if (false) {}
ELSE_IF_ADD_TAG(optional_ok)
- ELSE_IF_ADD_TAG(optional_second)
+ ELSE_IF_ADD_TAG(optional_allocator_error)
ELSE_IF_ADD_TAG(require_results)
ELSE_IF_ADD_TAG(bounds_check)
ELSE_IF_ADD_TAG(no_bounds_check)
diff --git a/src/parser.hpp b/src/parser.hpp
index 7433744e6..e384f1e7e 100644
--- a/src/parser.hpp
+++ b/src/parser.hpp
@@ -232,7 +232,7 @@ enum ProcTag {
ProcTag_require_results = 1<<4,
ProcTag_optional_ok = 1<<5,
- ProcTag_optional_second = 1<<6,
+ ProcTag_optional_allocator_error = 1<<6,
};
enum ProcCallingConvention : i32 {
diff --git a/src/types.cpp b/src/types.cpp
index b7cb4dd2c..e917d30fa 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -681,6 +681,7 @@ gb_global Type *t_allocator = nullptr;
gb_global Type *t_allocator_ptr = nullptr;
gb_global Type *t_context = nullptr;
gb_global Type *t_context_ptr = nullptr;
+gb_global Type *t_allocator_error = nullptr;
gb_global Type *t_source_code_location = nullptr;
gb_global Type *t_source_code_location_ptr = nullptr;