auto foo() {
   immutable int[] arr = [0, 1, 0, 3];
   return arr;
}
---
produces (with optimizations on, but just for brevity)
---
define { i64, i32* } @_D4test3fooFZyAi() #0 {
ret { i64, i32* } { i64 4, i32* getelementptr inbounds ([4 x i32]* @.immutablearray, i32 0, i32 0) }
}
---

Indeed. But

bool blub()
{
        immutable int[] arr = [0,0,0,0,0,0,0,0];
        return arr == [1,1,1,1,1,1,1,1];
}

yields

@.immutablearray = internal constant [8 x i32] zeroinitializer
@.arrayliteral = internal unnamed_addr constant [8 x i32] [i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1]

define i1 @_D13arrayliterals4blubFZb() #0 {
%.gc_mem = tail call { i64, i8* } @_d_newarrayvT(%object.TypeInfo* @_D11TypeInfo_Ai6__initZ, i64 8)
  %.ptr = extractvalue { i64, i8* } %.gc_mem, 1
tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %.ptr, i8* bitcast ([8 x i32]* @.arrayliteral to i8*), i64 32, i32 1, i1 false) %tmp27 = tail call i32 @_adEq2({ i64, i8* } { i64 8, i8* bitcast ([8 x i32]* @.immutablearray to i8*) }, { i64, i8* } %.gc_mem, %object.TypeInfo* bitcast (%"typeid(immutable(int)[])"* @_D12TypeInfo_Ayi6__initZ to %object.TypeInfo*)) #2
  %tmp28 = icmp ne i32 %tmp27, 0
  ret i1 %tmp28
}

Reply via email to