stage1: fix crash on slice byte reinterpretation
parent
c405844b0a
commit
0d40cb6255
23
src/ir.cpp
23
src/ir.cpp
|
@ -29043,11 +29043,24 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou
|
||||||
case ZigTypeIdStruct:
|
case ZigTypeIdStruct:
|
||||||
switch (val->type->data.structure.layout) {
|
switch (val->type->data.structure.layout) {
|
||||||
case ContainerLayoutAuto: {
|
case ContainerLayoutAuto: {
|
||||||
ErrorMsg *msg = opt_ir_add_error_node(ira, codegen, source_node,
|
switch(val->type->data.structure.special){
|
||||||
buf_sprintf("non-extern, non-packed struct '%s' cannot have its bytes reinterpreted",
|
case StructSpecialNone:
|
||||||
buf_ptr(&val->type->name)));
|
case StructSpecialInferredTuple:
|
||||||
add_error_note(codegen, msg, val->type->data.structure.decl_node,
|
case StructSpecialInferredStruct: {
|
||||||
buf_sprintf("declared here"));
|
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;
|
return ErrorSemanticAnalyzeFail;
|
||||||
}
|
}
|
||||||
case ContainerLayoutExtern: {
|
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: error: cannot compare types '?[3]i32' and '[3]i32'",
|
||||||
":22:12: note: operator not supported for type '[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