Commit 9050a07540

Andrew Kelley <andrew@ziglang.org>
2019-06-18 17:31:05
when resolving slice types, might need to...
...resolve alignment if custom alignment is provided fixes #2689
1 parent 8ed8828
Changed files (2)
src
test
stage1
behavior
src/ir.cpp
@@ -16794,7 +16794,9 @@ static IrInstruction *ir_analyze_instruction_slice_type(IrAnalyze *ira,
         case ZigTypeIdPromise:
         case ZigTypeIdVector:
             {
-                if ((err = type_resolve(ira->codegen, child_type, ResolveStatusZeroBitsKnown)))
+                ResolveStatus needed_status = (align_bytes == 0) ?
+                    ResolveStatusZeroBitsKnown : ResolveStatusAlignmentKnown;
+                if ((err = type_resolve(ira->codegen, child_type, needed_status)))
                     return ira->codegen->invalid_instruction;
                 ZigType *slice_ptr_type = get_pointer_to_type_extra(ira->codegen, child_type,
                         is_const, is_volatile, PtrLenUnknown, align_bytes, 0, 0, is_allow_zero);
test/stage1/behavior/slice.zig
@@ -54,3 +54,14 @@ test "comptime slices are disambiguated" {
     expect(sliceSum([_]u8{ 1, 2 }) == 3);
     expect(sliceSum([_]u8{ 3, 4 }) == 7);
 }
+
+test "slice type with custom alignment" {
+    const LazilyResolvedType = struct {
+        anything: i32,
+    };
+    var slice: []align(32) LazilyResolvedType = undefined;
+    var array: [10]LazilyResolvedType align(32) = undefined;
+    slice = &array;
+    slice[1].anything = 42;
+    expect(array[1].anything == 42);
+}