diff options
| author | gingerBill <bill@gingerbill.org> | 2017-11-03 23:11:06 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-11-03 23:11:06 +0000 |
| commit | 0b29e42adb1a9eebec6c5ecc630be91a41af07f1 (patch) | |
| tree | f908cc1a2489ff30ab69bc444bf4dfad98868adb /src/checker.cpp | |
| parent | fcc8b89e6b8f2df503ff19abbca67f8cbddf11dc (diff) | |
`link_prefix`; `thread_local`; fix `link_name` for file-scope variables
Diffstat (limited to 'src/checker.cpp')
| -rw-r--r-- | src/checker.cpp | 22 |
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; |