| author | |
| committer | |
| log | 30688c341b9bf247dd72601f760a7a98adcd55d9 |
| tree | ed9952da95a692edba7eea178065f50e1d93d65d |
| parent | aba8d4f62c5643333ca50a884c0fa1898a31dfed |
closes #184613 files changed, 21 insertions(+), 1 deletions(-)
src/codegen/llvm.zig+6-1| ... | @@ -3256,7 +3256,12 @@ pub const Object = struct { | ... | @@ -3256,7 +3256,12 @@ pub const Object = struct { |
| 3256 | 128 => .fp128, | 3256 | 128 => .fp128, |
| 3257 | else => unreachable, | 3257 | else => unreachable, |
| 3258 | }, | 3258 | }, |
| 3259 | .anyopaque_type => unreachable, | 3259 | .anyopaque_type => { |
| 3260 | // This is unreachable except when used as the type for an extern global. | ||
| 3261 | // For example: `@extern(*anyopaque, .{ .name = "foo"})` should produce | ||
| 3262 | // @foo = external global i8 | ||
| 3263 | return .i8; | ||
| 3264 | }, | ||
| 3260 | .bool_type => .i1, | 3265 | .bool_type => .i1, |
| 3261 | .void_type => .void, | 3266 | .void_type => .void, |
| 3262 | .type_type => unreachable, | 3267 | .type_type => unreachable, |
test/behavior.zig+1| ... | @@ -32,6 +32,7 @@ test { | ... | @@ -32,6 +32,7 @@ test { |
| 32 | _ = @import("behavior/eval.zig"); | 32 | _ = @import("behavior/eval.zig"); |
| 33 | _ = @import("behavior/export_builtin.zig"); | 33 | _ = @import("behavior/export_builtin.zig"); |
| 34 | _ = @import("behavior/export_self_referential_type_info.zig"); | 34 | _ = @import("behavior/export_self_referential_type_info.zig"); |
| 35 | _ = @import("behavior/extern.zig"); | ||
| 35 | _ = @import("behavior/field_parent_ptr.zig"); | 36 | _ = @import("behavior/field_parent_ptr.zig"); |
| 36 | _ = @import("behavior/floatop.zig"); | 37 | _ = @import("behavior/floatop.zig"); |
| 37 | _ = @import("behavior/fn.zig"); | 38 | _ = @import("behavior/fn.zig"); |
test/behavior/extern.zig created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | const builtin = @import("builtin"); | ||
| 2 | const std = @import("std"); | ||
| 3 | const expect = std.testing.expect; | ||
| 4 | |||
| 5 | test "anyopaque extern symbol" { | ||
| 6 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 7 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 8 | |||
| 9 | const a = @extern(*anyopaque, .{ .name = "a_mystery_symbol" }); | ||
| 10 | const b: *i32 = @alignCast(@ptrCast(a)); | ||
| 11 | try expect(b.* == 1234); | ||
| 12 | } | ||
| 13 | |||
| 14 | export var a_mystery_symbol: i32 = 1234; | ||