stage1: fix crash on slice byte reinterpretation
parent
c405844b0a
commit
0d40cb6255
13
src/ir.cpp
13
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: {
|
||||
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: {
|
||||
|
|
|
@ -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",
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue