fix crash on runtime index into slice of comptime type

closes #1435
This commit is contained in:
Andrew Kelley 2018-09-25 12:03:39 -04:00
parent 839492d0e8
commit 2e562a5f36
No known key found for this signature in database
GPG Key ID: 4E7CD66038A4D47C
3 changed files with 27 additions and 2 deletions

View File

@ -1187,8 +1187,11 @@ ZigType *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
if ((err = type_resolve(g, type_entry, ResolveStatusZeroBitsKnown)))
return g->builtin_types.entry_invalid;
if (is_c_abi)
if (is_c_abi) {
if ((err = type_resolve(g, type_entry, ResolveStatusSizeKnown)))
return g->builtin_types.entry_invalid;
continue;
}
if (type_has_bits(type_entry)) {
ZigType *gen_type;
@ -4464,7 +4467,7 @@ bool handle_is_ptr(ZigType *type_entry) {
return type_has_bits(type_entry->data.maybe.child_type) &&
!type_is_codegen_pointer(type_entry->data.maybe.child_type);
case ZigTypeIdUnion:
assert(type_entry->data.unionation.complete);
assert(type_entry->data.unionation.zero_bits_known);
if (type_entry->data.unionation.gen_field_count == 0)
return false;
if (!type_has_bits(type_entry))

View File

@ -14640,6 +14640,12 @@ static ZigType *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstructionEle
} else {
// runtime known element index
if (type_requires_comptime(return_type)) {
ir_add_error(ira, elem_index,
buf_sprintf("values of type '%s' must be comptime known, but index value is runtime known",
buf_ptr(&return_type->data.pointer.child_type->name)));
return ira->codegen->builtin_types.entry_invalid;
}
if (ptr_align < abi_align) {
if (elem_size >= ptr_align && elem_size % ptr_align == 0) {
return_type = adjust_ptr_align(ira->codegen, return_type, ptr_align);

View File

@ -1,6 +1,22 @@
const tests = @import("tests.zig");
pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.add(
"runtime index into comptime type slice",
\\const Struct = struct {
\\ a: u32,
\\};
\\fn getIndex() usize {
\\ return 2;
\\}
\\export fn entry() void {
\\ const index = getIndex();
\\ const field = @typeInfo(Struct).Struct.fields[index];
\\}
,
".tmp_source.zig:9:51: error: values of type 'StructField' must be comptime known, but index value is runtime known",
);
cases.add(
"compile log statement inside function which must be comptime evaluated",
\\fn Foo(comptime T: type) type {