aboutsummaryrefslogtreecommitdiff
path: root/src/parseh.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-01 00:01:30 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-01 00:01:30 -0700
commit6b2e29c6ac58d5f4370828bfa0f54b83d1931a97 (patch)
tree9d562684b949af519f5013234b910a1a0fd23a02 /src/parseh.cpp
parentc1b5518a65acd646c23e763a57c9eb78e533d61a (diff)
downloadzig-6b2e29c6ac58d5f4370828bfa0f54b83d1931a97.tar.gz
zig-6b2e29c6ac58d5f4370828bfa0f54b83d1931a97.zip
parseh: do not create macro alias for extern vars
Diffstat (limited to 'src/parseh.cpp')
-rw-r--r--src/parseh.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/parseh.cpp b/src/parseh.cpp
index 3633c0d497..b8945c3741 100644
--- a/src/parseh.cpp
+++ b/src/parseh.cpp
@@ -26,6 +26,11 @@ struct MacroSymbol {
Buf *value;
};
+struct GlobalValue {
+ TypeTableEntry *type;
+ bool is_const;
+};
+
struct Context {
ImportTableEntry *import;
ZigList<ErrorMsg *> *errors;
@@ -34,7 +39,7 @@ struct Context {
TypeTableEntry *c_void_type;
AstNode *root;
HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> global_type_table;
- HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> global_value_table;
+ HashMap<Buf *, GlobalValue, buf_hash, buf_eql_buf> global_value_table;
HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> struct_type_table;
HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> struct_decl_table;
HashMap<Buf *, TypeTableEntry *, buf_hash, buf_eql_buf> enum_type_table;
@@ -737,7 +742,7 @@ static void visit_enum_decl(Context *c, const EnumDecl *enum_decl) {
AstNode *field_access_node = create_field_access_node(c, buf_ptr(full_type_name), buf_ptr(field_name));
AstNode *var_node = create_var_decl_node(c, buf_ptr(enum_val_name), field_access_node);
var_decls.append(var_node);
- c->global_value_table.put(enum_val_name, enum_type);
+ c->global_value_table.put(enum_val_name, {enum_type, true});
}
// create llvm type for root struct
@@ -1036,7 +1041,7 @@ static void visit_var_decl(Context *c, const VarDecl *var_decl) {
AstNode *type_node = make_type_node(c, var_type);
AstNode *var_node = create_typed_var_decl_node(c, true, buf_ptr(name), type_node, init_node);
c->root->data.root.top_level_decls.append(var_node);
- c->global_value_table.put(name, var_type);
+ c->global_value_table.put(name, {var_type, true});
return;
}
@@ -1045,7 +1050,7 @@ static void visit_var_decl(Context *c, const VarDecl *var_decl) {
AstNode *var_node = create_typed_var_decl_node(c, is_const, buf_ptr(name), type_node, nullptr);
var_node->data.variable_declaration.is_extern = true;
c->root->data.root.top_level_decls.append(var_node);
- c->global_value_table.put(name, var_type);
+ c->global_value_table.put(name, {var_type, is_const});
return;
}
@@ -1095,6 +1100,22 @@ static bool name_exists(Context *c, Buf *name) {
return false;
}
+static bool name_exists_and_const(Context *c, Buf *name) {
+ if (c->global_type_table.maybe_get(name)) {
+ return true;
+ }
+ if (c->fn_table.maybe_get(name)) {
+ return true;
+ }
+ if (c->macro_table.maybe_get(name)) {
+ return true;
+ }
+ if (auto entry = c->global_value_table.maybe_get(name)) {
+ return entry->value.is_const;
+ }
+ return false;
+}
+
static void render_aliases(Context *c) {
for (int i = 0; i < c->aliases.length; i += 1) {
AstNode *alias_node = c->aliases.at(i);
@@ -1232,7 +1253,7 @@ static void process_macro(Context *c, Buf *name, Buf *value) {
static void process_symbol_macros(Context *c) {
for (int i = 0; i < c->macro_symbols.length; i += 1) {
MacroSymbol ms = c->macro_symbols.at(i);
- if (name_exists(c, ms.value)) {
+ if (name_exists_and_const(c, ms.value)) {
AstNode *var_node = create_var_decl_node(c, buf_ptr(ms.name),
create_symbol_node(c, buf_ptr(ms.value)));
c->macro_table.put(ms.name, var_node);