aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniele Cocca <daniele.cocca@gmail.com>2022-03-20 20:50:59 +0000
committerVeikka Tuominen <git@vexu.eu>2022-03-30 11:57:15 +0300
commit633fe41a2c2310d8cfab53ee9d87bb50ac4efc41 (patch)
tree131d009bf31145ed8185f3a9fd4d7914de361a35
parent5d5282b5f18b33489187a9a9e23a1aa2d301b4e8 (diff)
downloadzig-633fe41a2c2310d8cfab53ee9d87bb50ac4efc41.tar.gz
zig-633fe41a2c2310d8cfab53ee9d87bb50ac4efc41.zip
Sema: allow comptime blocks for global assembly
An assembly expression in a comptime block is legal Zig in the case of global assembly [^1]. Instead of unconditionally asserting that the expression lives in a runtime block, here we assert that if the expression lives in a comptime block it must be outside of function scope. [^1]: https://ziglang.org/documentation/0.9.1/#Global-Assembly
-rw-r--r--src/Sema.zig6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 9fc54f805b..f13f97bbbb 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -10253,6 +10253,11 @@ fn zirAsm(
const inputs_len = @truncate(u5, extended.small >> 5);
const clobbers_len = @truncate(u5, extended.small >> 10);
const is_volatile = @truncate(u1, extended.small >> 15) != 0;
+ const is_global_assembly = sema.func == null;
+
+ if (block.is_comptime and !is_global_assembly) {
+ try sema.requireRuntimeBlock(block, src);
+ }
if (extra.data.asm_source == 0) {
// This can move to become an AstGen error after inline assembly improvements land
@@ -10317,7 +10322,6 @@ fn zirAsm(
needed_capacity += (asm_source.len + 3) / 4;
const gpa = sema.gpa;
- try sema.requireRuntimeBlock(block, src);
try sema.air_extra.ensureUnusedCapacity(gpa, needed_capacity);
const asm_air = try block.addInst(.{
.tag = .assembly,