Commit 0d40cb6255

xackus <14938807+xackus@users.noreply.github.com>
2020-06-08 19:06:37
stage1: fix crash on slice byte reinterpretation
1 parent c405844
Changed files (2)
src/ir.cpp
@@ -29043,11 +29043,24 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou
         case ZigTypeIdStruct:
             switch (val->type->data.structure.layout) {
                 case ContainerLayoutAuto: {
-                    ErrorMsg *msg = opt_ir_add_error_node(ira, codegen, source_node,
-                        buf_sprintf("non-extern, non-packed struct '%s' cannot have its bytes reinterpreted",
-                            buf_ptr(&val->type->name)));
-                    add_error_note(codegen, msg, val->type->data.structure.decl_node,
-                            buf_sprintf("declared here"));
+                    switch(val->type->data.structure.special){
+                        case StructSpecialNone:
+                        case StructSpecialInferredTuple:
+                        case StructSpecialInferredStruct: {
+                            ErrorMsg *msg = opt_ir_add_error_node(ira, codegen, source_node,
+                                buf_sprintf("non-extern, non-packed struct '%s' cannot have its bytes reinterpreted",
+                                    buf_ptr(&val->type->name)));
+                            add_error_note(codegen, msg, val->type->data.structure.decl_node,
+                                    buf_sprintf("declared here"));
+                            break;
+                        }
+                        case StructSpecialSlice: {
+                            opt_ir_add_error_node(ira, codegen, source_node,
+                                buf_sprintf("slice '%s' cannot have its bytes reinterpreted",
+                                    buf_ptr(&val->type->name)));
+                            break;
+                        }
+                    }
                     return ErrorSemanticAnalyzeFail;
                 }
                 case ContainerLayoutExtern: {
test/compile_errors.zig
@@ -7495,4 +7495,13 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
         ":22:12: error: cannot compare types '?[3]i32' and '[3]i32'",
         ":22:12: note: operator not supported for type '[3]i32'",
     });
+
+    cases.add("slice cannot have its bytes reinterpreted",
+        \\export fn foo() void {
+        \\    const bytes = [1]u8{ 0xfa } ** 16;
+        \\    var value = @ptrCast(*const []const u8, &bytes).*;
+        \\}
+    , &[_][]const u8{
+        ":3:52: error: slice '[]const u8' cannot have its bytes reinterpreted",
+    });
 }