Commit 30688c341b

Andrew Kelley <andrew@ziglang.org>
2024-01-11 01:56:38
LLVM: fix lowering of extern anyopaque
closes #18461
1 parent aba8d4f
Changed files (3)
src
codegen
test
src/codegen/llvm.zig
@@ -3256,7 +3256,12 @@ pub const Object = struct {
                 128 => .fp128,
                 else => unreachable,
             },
-            .anyopaque_type => unreachable,
+            .anyopaque_type => {
+                // This is unreachable except when used as the type for an extern global.
+                // For example: `@extern(*anyopaque, .{ .name = "foo"})` should produce
+                // @foo = external global i8
+                return .i8;
+            },
             .bool_type => .i1,
             .void_type => .void,
             .type_type => unreachable,
test/behavior/extern.zig
@@ -0,0 +1,14 @@
+const builtin = @import("builtin");
+const std = @import("std");
+const expect = std.testing.expect;
+
+test "anyopaque extern symbol" {
+    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
+
+    const a = @extern(*anyopaque, .{ .name = "a_mystery_symbol" });
+    const b: *i32 = @alignCast(@ptrCast(a));
+    try expect(b.* == 1234);
+}
+
+export var a_mystery_symbol: i32 = 1234;
test/behavior.zig
@@ -32,6 +32,7 @@ test {
     _ = @import("behavior/eval.zig");
     _ = @import("behavior/export_builtin.zig");
     _ = @import("behavior/export_self_referential_type_info.zig");
+    _ = @import("behavior/extern.zig");
     _ = @import("behavior/field_parent_ptr.zig");
     _ = @import("behavior/floatop.zig");
     _ = @import("behavior/fn.zig");