authorgravatar for mail@linusgroh.deLinus Groh <mail@linusgroh.de> 2024-07-27 22:08:05+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-07-28 02:58:49+03:00
loga84951465b409495095a9598db0cae745f34fa7b
treeb894e8c1ed03b96de8d09642e51038ae715cd2d5
parent66b71273a2555da23f6d706c22e3d85f43fe602b

translate-c: Use mangled name for local extern in condition/loop


3 files changed, 8 insertions(+), 3 deletions(-)

lib/compiler/aro_translate_c.zig+3-2
......@@ -1469,7 +1469,7 @@ pub fn ScopeExtra(comptime ScopeExtraContext: type, comptime ScopeExtraType: typ
14691469
14701470 pub fn getAlias(scope: *ScopeExtraScope, name: []const u8) []const u8 {
14711471 return switch (scope.id) {
1472 .root => return name,
1472 .root => name,
14731473 .block => @as(*Block, @fieldParentPtr("base", scope)).getAlias(name),
14741474 .loop, .do_loop, .condition => scope.parent.?.getAlias(name),
14751475 };
......@@ -1477,11 +1477,12 @@ pub fn ScopeExtra(comptime ScopeExtraContext: type, comptime ScopeExtraType: typ
14771477
14781478 pub fn getLocalExternAlias(scope: *ScopeExtraScope, name: []const u8) ?[]const u8 {
14791479 return switch (scope.id) {
1480 .root => null,
14801481 .block => ret: {
14811482 const block = @as(*Block, @fieldParentPtr("base", scope));
14821483 break :ret block.getLocalExternAlias(name);
14831484 },
1484 .root, .loop, .do_loop, .condition => null,
1485 .loop, .do_loop, .condition => scope.parent.?.getLocalExternAlias(name),
14851486 };
14861487 }
14871488
src/translate_c.zig+1-1
......@@ -1897,7 +1897,7 @@ fn transDeclRefExpr(
18971897 const name = try c.str(@as(*const clang.NamedDecl, @ptrCast(value_decl)).getName_bytes_begin());
18981898 const mangled_name = scope.getAlias(name);
18991899 const decl_is_var = @as(*const clang.Decl, @ptrCast(value_decl)).getKind() == .Var;
1900 const potential_local_extern = if (decl_is_var) ((@as(*const clang.VarDecl, @ptrCast(value_decl)).getStorageClass() == .Extern) and (scope.id == .block)) else false;
1900 const potential_local_extern = if (decl_is_var) ((@as(*const clang.VarDecl, @ptrCast(value_decl)).getStorageClass() == .Extern) and (scope.id != .root)) else false;
19011901
19021902 var confirmed_local_extern = false;
19031903 var ref_expr = val: {
test/cases/run_translated_c/extern_typedef_variables_in_functions.c+4
......@@ -4,6 +4,10 @@ static int func(void)
44{
55 typedef int test_type_t;
66 extern const test_type_t ev;
7 // Ensure mangled name is also being used for conditions and loops, see #20828
8 if (ev == 0);
9 while (ev == 0);
10 do; while (ev == 0);
711 return ev + 2;
812}
913