From 0ff396c34f93b60a000e1ee50e881a8c25122b79 Mon Sep 17 00:00:00 2001 From: Vexu <15308111+Vexu@users.noreply.github.com> Date: Sat, 17 Aug 2019 22:51:25 +0300 Subject: [PATCH] add compile error for incorrect atomic ordering in fence #3082 --- src/ir.cpp | 6 ++++++ test/compile_errors.zig | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/ir.cpp b/src/ir.cpp index 15c570ddd9..51f849ce19 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -20860,6 +20860,12 @@ static IrInstruction *ir_analyze_instruction_fence(IrAnalyze *ira, IrInstruction if (!ir_resolve_atomic_order(ira, order_value, &order)) return ira->codegen->invalid_instruction; + if (order < AtomicOrderAcquire) { + ir_add_error(ira, order_value, + buf_sprintf("atomic ordering must be Acquire or stricter")); + return ira->codegen->invalid_instruction; + } + IrInstruction *result = ir_build_fence(&ira->new_irb, instruction->base.scope, instruction->base.source_node, order_value, order); result->value.type = ira->codegen->builtin_types.entry_void; diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 2088b32d98..d0c12e7cf6 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -14,6 +14,15 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { "tmp.zig:4:21: error: expected type '[]align(16) u8', found '*[64]u8'", ); + cases.add( + "atomic orderings of fence Acquire or stricter", + \\export fn entry() void { + \\ @fence(.Monotonic); + \\} + , + "tmp.zig:2:12: error: atomic ordering must be Acquire or stricter", + ); + cases.add( "bad alignment in implicit cast from array pointer to slice", \\export fn a() void {