Commit 2e562a5f36

Andrew Kelley <superjoe30@gmail.com>
2018-09-25 18:03:39
fix crash on runtime index into slice of comptime type
closes #1435
1 parent 839492d
Changed files (3)
src/analyze.cpp
@@ -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))
src/ir.cpp
@@ -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);
test/compile_errors.zig
@@ -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 {