Commit c828c23f71

Andrea Orru <andrea@orru.io>
2018-03-14 06:07:40
Tests for zero-bit field compiler error
1 parent 7ac4403
Changed files (2)
src/ir.cpp
@@ -15223,10 +15223,10 @@ static TypeTableEntry *ir_analyze_instruction_offset_of(IrAnalyze *ira,
     }
 
     if (field->type_entry->zero_bits) {
-      ir_add_error(ira, field_name_value,
-                   buf_sprintf("zero-bit field '%s' in struct '%s' has no offset",
-                               buf_ptr(field_name), buf_ptr(&container_type->name)));
-      return ira->codegen->builtin_types.entry_invalid;
+        ir_add_error(ira, field_name_value,
+                     buf_sprintf("zero-bit field '%s' in struct '%s' has no offset",
+                                 buf_ptr(field_name), buf_ptr(&container_type->name)));
+        return ira->codegen->builtin_types.entry_invalid;
     }
     size_t byte_offset = LLVMOffsetOfElement(ira->codegen->target_data_ref, container_type->type_ref, field->gen_index);
     ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base);
test/compile_errors.zig
@@ -3141,4 +3141,14 @@ pub fn addCases(cases: &tests.CompileErrorContext) void {
         \\}
     ,
         ".tmp_source.zig:4:9: error: type 'S' is not copyable; cannot pass by value");
+
+    cases.add("taking offset of void field in struct",
+        \\const Empty = struct {
+        \\    val: void,
+        \\};
+        \\export fn foo() void {
+        \\    const fieldOffset = @offsetOf(Empty, "val");
+        \\}
+    ,
+        ".tmp_source.zig:5:42: error: zero-bit field 'val' has no offset in struct 'Empty'");
 }