From 643ab90ace52d6d752a12ece9d6a8655ca2ca596 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 23 Oct 2017 22:33:00 -0400 Subject: [PATCH] add maximum value for @setAlignStack --- src/ir.cpp | 5 +++++ test/cases/align.zig | 2 +- test/compile_errors.zig | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ir.cpp b/src/ir.cpp index 0879942b3e..787d58442e 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -15312,6 +15312,11 @@ static TypeTableEntry *ir_analyze_instruction_set_align_stack(IrAnalyze *ira, Ir if (!ir_resolve_align(ira, align_bytes_inst, &align_bytes)) return ira->codegen->builtin_types.entry_invalid; + if (align_bytes > 256) { + ir_add_error(ira, &instruction->base, buf_sprintf("attempt to @setAlignStack(%" PRIu32 "); maximum is 256", align_bytes)); + return ira->codegen->builtin_types.entry_invalid; + } + FnTableEntry *fn_entry = exec_fn_entry(ira->new_irb.exec); if (fn_entry == nullptr) { ir_add_error(ira, &instruction->base, buf_sprintf("@setAlignStack outside function")); diff --git a/test/cases/align.zig b/test/cases/align.zig index cd806a5dc6..3bf0d9c9af 100644 --- a/test/cases/align.zig +++ b/test/cases/align.zig @@ -188,6 +188,6 @@ test "alignstack" { } fn fnWithAlignedStack() -> i32 { - @setAlignStack(1024); + @setAlignStack(256); return 1234; } diff --git a/test/compile_errors.zig b/test/compile_errors.zig index dd25886d2b..efab136d7e 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2187,6 +2187,13 @@ pub fn addCases(cases: &tests.CompileErrorContext) { ".tmp_source.zig:3:5: error: alignstack set twice", ".tmp_source.zig:2:5: note: first set here"); + cases.add("@setAlignStack too big", + \\export fn entry() { + \\ @setAlignStack(511 + 1); + \\} + , + ".tmp_source.zig:2:5: error: attempt to @setAlignStack(512); maximum is 256"); + cases.add("storing runtime value in compile time variable then using it", \\const Mode = @import("builtin").Mode; \\