mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
Sema: implement @export for arbitrary values
This commit is contained in:
parent
5e161c102d
commit
f9b5829508
18
src/Sema.zig
18
src/Sema.zig
@ -5668,7 +5668,15 @@ fn zirExportValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
|
||||
};
|
||||
const decl_index = switch (operand.val.tag()) {
|
||||
.function => operand.val.castTag(.function).?.data.owner_decl,
|
||||
else => return sema.fail(block, operand_src, "TODO implement exporting arbitrary Value objects", .{}), // TODO put this Value into an anonymous Decl and then export it.
|
||||
else => blk: {
|
||||
var anon_decl = try block.startAnonDecl();
|
||||
defer anon_decl.deinit();
|
||||
break :blk try anon_decl.finish(
|
||||
try operand.ty.copy(anon_decl.arena()),
|
||||
try operand.val.copy(anon_decl.arena()),
|
||||
0,
|
||||
);
|
||||
},
|
||||
};
|
||||
try sema.analyzeExport(block, src, options, decl_index);
|
||||
}
|
||||
@ -5704,6 +5712,14 @@ pub fn analyzeExport(
|
||||
return sema.failWithOwnedErrorMsg(msg);
|
||||
}
|
||||
|
||||
// TODO: some backends might support re-exporting extern decls
|
||||
if (exported_decl.isExtern()) {
|
||||
return sema.fail(block, src, "export target cannot be extern", .{});
|
||||
}
|
||||
|
||||
// This decl is alive no matter what, since it's being exported
|
||||
mod.markDeclAlive(exported_decl);
|
||||
|
||||
const gpa = mod.gpa;
|
||||
|
||||
try mod.decl_exports.ensureUnusedCapacity(gpa, 1);
|
||||
|
||||
@ -70,3 +70,22 @@ test "exporting using field access" {
|
||||
|
||||
_ = S.Inner.x;
|
||||
}
|
||||
|
||||
test "exporting comptime-known value" {
|
||||
const x: u32 = 10;
|
||||
@export(x, .{ .name = "exporting_comptime_known_value_foo" });
|
||||
const S = struct {
|
||||
extern const exporting_comptime_known_value_foo: u32;
|
||||
};
|
||||
try expect(S.exporting_comptime_known_value_foo == 10);
|
||||
}
|
||||
|
||||
test "exporting comptime var" {
|
||||
comptime var x: u32 = 5;
|
||||
@export(x, .{ .name = "exporting_comptime_var_foo" });
|
||||
x = 7; // modifying this now shouldn't change anything
|
||||
const S = struct {
|
||||
extern const exporting_comptime_var_foo: u32;
|
||||
};
|
||||
try expect(S.exporting_comptime_var_foo == 5);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user