Commit 0d40cb6255
Changed files (2)
src
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",
+ });
}