aboutsummaryrefslogtreecommitdiff
path: root/src/checker.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-03 23:11:06 +0000
committergingerBill <bill@gingerbill.org>2017-11-03 23:11:06 +0000
commit0b29e42adb1a9eebec6c5ecc630be91a41af07f1 (patch)
treef908cc1a2489ff30ab69bc444bf4dfad98868adb /src/checker.cpp
parentfcc8b89e6b8f2df503ff19abbca67f8cbddf11dc (diff)
`link_prefix`; `thread_local`; fix `link_name` for file-scope variables
Diffstat (limited to 'src/checker.cpp')
-rw-r--r--src/checker.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 4d7b7e83a..5e77dc90f 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -424,6 +424,7 @@ struct CheckerContext {
DeclInfo * curr_proc_decl;
AstNode * curr_foreign_library;
ProcCallingConvention default_foreign_cc;
+ String foreign_link_prefix;
bool in_foreign_export;
bool collect_delayed_decls;
@@ -1920,6 +1921,17 @@ void check_foreign_block_decl_attributes(Checker *c, AstNodeForeignBlockDecl *fb
} else {
error(elem, "Expected a string value for `%.*s`", LIT(name));
}
+ } else if (name == "link_prefix") {
+ if (ev.kind == ExactValue_String) {
+ String link_prefix = ev.value_string;
+ if (!is_foreign_name_valid(link_prefix)) {
+ error(elem, "Invalid link prefix: `%.*s`\n", LIT(link_prefix));
+ } else {
+ c->context.foreign_link_prefix = link_prefix;
+ }
+ } else {
+ error(elem, "Expected a string value for `%.*s`", LIT(name));
+ }
} else {
error(elem, "Unknown attribute element name `%.*s`", LIT(name));
}
@@ -2024,11 +2036,6 @@ void check_collect_value_decl(Checker *c, AstNode *decl) {
di->type_expr = vd->type;
di->init_expr = vd->values[0];
di->init_expr_list = vd->values;
-
-
- if (vd->flags & VarDeclFlag_thread_local) {
- error(decl, "#thread_local variable declarations cannot have initialization values");
- }
}
@@ -2044,7 +2051,6 @@ void check_collect_value_decl(Checker *c, AstNode *decl) {
continue;
}
Entity *e = make_entity_variable(c->allocator, c->context.scope, name->Ident.token, nullptr, false);
- e->Variable.is_thread_local = (vd->flags & VarDeclFlag_thread_local) != 0;
e->identifier = name;
if (vd->flags & VarDeclFlag_using) {
@@ -2058,6 +2064,8 @@ void check_collect_value_decl(Checker *c, AstNode *decl) {
e->Variable.is_foreign = true;
e->Variable.foreign_library_ident = fl;
+ e->Variable.link_prefix = c->context.foreign_link_prefix;
+
} else if (c->context.in_foreign_export) {
e->Variable.is_export = true;
}
@@ -2131,6 +2139,8 @@ void check_collect_value_decl(Checker *c, AstNode *decl) {
cc = c->context.default_foreign_cc;
}
}
+ e->Procedure.link_prefix = c->context.foreign_link_prefix;
+
GB_ASSERT(cc != ProcCC_Invalid);
pl->type->ProcType.calling_convention = cc;