| ... | @@ -498,7 +498,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void { | ... | @@ -498,7 +498,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void { |
| 498 | _ = try transRecordDecl(c, @ptrCast(*const ZigClangRecordDecl, decl)); | 498 | _ = try transRecordDecl(c, @ptrCast(*const ZigClangRecordDecl, decl)); |
| 499 | }, | 499 | }, |
| 500 | .Var => { | 500 | .Var => { |
| 501 | return visitVarDecl(c, @ptrCast(*const ZigClangVarDecl, decl)); | 501 | return visitVarDecl(c, @ptrCast(*const ZigClangVarDecl, decl), null); |
| 502 | }, | 502 | }, |
| 503 | .Empty => { | 503 | .Empty => { |
| 504 | // Do nothing | 504 | // Do nothing |
| ... | @@ -679,12 +679,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { | ... | @@ -679,12 +679,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { |
| 679 | return addTopLevelDecl(c, fn_name, &proto_node.base); | 679 | return addTopLevelDecl(c, fn_name, &proto_node.base); |
| 680 | } | 680 | } |
| 681 | | 681 | |
| 682 | fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { | 682 | /// if mangled_name is not null, this var decl was declared in a block scope. |
| 683 | const var_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, var_decl))); | 683 | fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl, mangled_name: ?[]const u8) Error!void { |
| | 684 | const var_name = mangled_name orelse try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, var_decl))); |
| 684 | if (c.global_scope.sym_table.contains(var_name)) | 685 | if (c.global_scope.sym_table.contains(var_name)) |
| 685 | return; // Avoid processing this decl twice | 686 | return; // Avoid processing this decl twice |
| 686 | const rp = makeRestorePoint(c); | 687 | const rp = makeRestorePoint(c); |
| 687 | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); | 688 | const visib_tok = if (mangled_name) |_| null else try appendToken(c, .Keyword_pub, "pub"); |
| 688 | | 689 | |
| 689 | const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None) | 690 | const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None) |
| 690 | null | 691 | null |
| ... | @@ -1582,15 +1583,22 @@ fn transDeclStmtOne( | ... | @@ -1582,15 +1583,22 @@ fn transDeclStmtOne( |
| 1582 | .Var => { | 1583 | .Var => { |
| 1583 | const var_decl = @ptrCast(*const ZigClangVarDecl, decl); | 1584 | const var_decl = @ptrCast(*const ZigClangVarDecl, decl); |
| 1584 | | 1585 | |
| 1585 | const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None) | | |
| 1586 | null | | |
| 1587 | else | | |
| 1588 | try appendToken(c, .Keyword_threadlocal, "threadlocal"); | | |
| 1589 | const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); | 1586 | const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); |
| 1590 | const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( | 1587 | const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( |
| 1591 | @ptrCast(*const ZigClangNamedDecl, var_decl), | 1588 | @ptrCast(*const ZigClangNamedDecl, var_decl), |
| 1592 | )); | 1589 | )); |
| 1593 | const mangled_name = try block_scope.makeMangledName(c, name); | 1590 | const mangled_name = try block_scope.makeMangledName(c, name); |
| | 1591 | |
| | 1592 | switch (ZigClangVarDecl_getStorageClass(var_decl)) { |
| | 1593 | .Extern, .Static => { |
| | 1594 | // This is actually a global variable, put it in the global scope and reference it. |
| | 1595 | // `_ = mangled_name;` |
| | 1596 | try visitVarDecl(rp.c, var_decl, mangled_name); |
| | 1597 | return try maybeSuppressResult(rp, scope, .unused, try transCreateNodeIdentifier(rp.c, mangled_name)); |
| | 1598 | }, |
| | 1599 | else => {}, |
| | 1600 | } |
| | 1601 | |
| 1594 | const mut_tok = if (ZigClangQualType_isConstQualified(qual_type)) | 1602 | const mut_tok = if (ZigClangQualType_isConstQualified(qual_type)) |
| 1595 | try appendToken(c, .Keyword_const, "const") | 1603 | try appendToken(c, .Keyword_const, "const") |
| 1596 | else | 1604 | else |
| ... | @@ -1618,7 +1626,6 @@ fn transDeclStmtOne( | ... | @@ -1618,7 +1626,6 @@ fn transDeclStmtOne( |
| 1618 | .mut_token = mut_tok, | 1626 | .mut_token = mut_tok, |
| 1619 | .semicolon_token = semicolon_token, | 1627 | .semicolon_token = semicolon_token, |
| 1620 | }, .{ | 1628 | }, .{ |
| 1621 | .thread_local_token = thread_local_token, | | |
| 1622 | .eq_token = eq_token, | 1629 | .eq_token = eq_token, |
| 1623 | .type_node = type_node, | 1630 | .type_node = type_node, |
| 1624 | .init_node = init_node, | 1631 | .init_node = init_node, |