diff options
| author | David Rubin <87927264+Rexicon226@users.noreply.github.com> | 2024-08-16 09:41:58 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-16 09:41:58 -0700 |
| commit | f1eed99f3d2d355054c6cf36d6f332d83b2ec595 (patch) | |
| tree | 286d1eb20b6d52ad1a5d75569cc45407a62c0064 /src/Sema.zig | |
| parent | 11176d22f82861b4b6967b77f753414f214bc632 (diff) | |
| download | zig-f1eed99f3d2d355054c6cf36d6f332d83b2ec595.tar.gz zig-f1eed99f3d2d355054c6cf36d6f332d83b2ec595.zip | |
add an error for stack allocations in naked functions (#21082)
closes #72
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index cdcbee42a5..fd824fd0cf 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3626,8 +3626,7 @@ fn zirAllocExtended( const alignment = if (small.has_align) blk: { const align_ref: Zir.Inst.Ref = @enumFromInt(sema.code.extra[extra_index]); extra_index += 1; - const alignment = try sema.resolveAlign(block, align_src, align_ref); - break :blk alignment; + break :blk try sema.resolveAlign(block, align_src, align_ref); } else .none; if (block.is_comptime or small.is_comptime) { @@ -3652,6 +3651,10 @@ fn zirAllocExtended( } const target = pt.zcu.getTarget(); try var_ty.resolveLayout(pt); + if (sema.func_is_naked and try sema.typeHasRuntimeBits(var_ty)) { + const var_src = block.src(.{ .node_offset_store_ptr = extra.data.src_node }); + return sema.fail(block, var_src, "local variable in naked function", .{}); + } const ptr_type = try sema.pt.ptrTypeSema(.{ .child = var_ty.toIntern(), .flags = .{ @@ -4087,10 +4090,15 @@ fn zirAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I const inst_data = sema.code.instructions.items(.data)[@intFromEnum(inst)].un_node; const ty_src = block.src(.{ .node_offset_var_decl_ty = inst_data.src_node }); + const var_ty = try sema.resolveType(block, ty_src, inst_data.operand); if (block.is_comptime) { return sema.analyzeComptimeAlloc(block, var_ty, .none); } + if (sema.func_is_naked and try sema.typeHasRuntimeBits(var_ty)) { + const mut_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node }); + return sema.fail(block, mut_src, "local variable in naked function", .{}); + } const target = pt.zcu.getTarget(); const ptr_type = try pt.ptrTypeSema(.{ .child = var_ty.toIntern(), @@ -4115,6 +4123,10 @@ fn zirAllocMut(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai if (block.is_comptime) { return sema.analyzeComptimeAlloc(block, var_ty, .none); } + if (sema.func_is_naked and try sema.typeHasRuntimeBits(var_ty)) { + const var_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node }); + return sema.fail(block, var_src, "local variable in naked function", .{}); + } try sema.validateVarType(block, ty_src, var_ty, false); const target = pt.zcu.getTarget(); const ptr_type = try pt.ptrTypeSema(.{ @@ -4248,7 +4260,10 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com // TODO: source location of runtime control flow return sema.fail(block, src, "value with comptime-only type '{}' depends on runtime control flow", .{final_elem_ty.fmt(pt)}); } - + if (sema.func_is_naked and try sema.typeHasRuntimeBits(final_elem_ty)) { + const mut_src = block.src(.{ .node_offset_store_ptr = inst_data.src_node }); + return sema.fail(block, mut_src, "local variable in naked function", .{}); + } // Change it to a normal alloc. sema.air_instructions.set(@intFromEnum(ptr_inst), .{ .tag = .alloc, |
