[sema] Fix infinite loop when using a boolean value as designated initializer.
For designated indices use the max array size type bitwidth, not the bitwidth of the index value itself. rdar://21942503 llvm-svn: 243343
This commit is contained in:
parent
a90d0992b7
commit
4746c2fcdb
|
@ -2372,14 +2372,12 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
|
|||
return true;
|
||||
}
|
||||
} else {
|
||||
// Make sure the bit-widths and signedness match.
|
||||
if (DesignatedStartIndex.getBitWidth() > DesignatedEndIndex.getBitWidth())
|
||||
DesignatedEndIndex
|
||||
= DesignatedEndIndex.extend(DesignatedStartIndex.getBitWidth());
|
||||
else if (DesignatedStartIndex.getBitWidth() <
|
||||
DesignatedEndIndex.getBitWidth())
|
||||
DesignatedStartIndex
|
||||
= DesignatedStartIndex.extend(DesignatedEndIndex.getBitWidth());
|
||||
unsigned DesignatedIndexBitWidth =
|
||||
ConstantArrayType::getMaxSizeBits(SemaRef.Context);
|
||||
DesignatedStartIndex =
|
||||
DesignatedStartIndex.extOrTrunc(DesignatedIndexBitWidth);
|
||||
DesignatedEndIndex =
|
||||
DesignatedEndIndex.extOrTrunc(DesignatedIndexBitWidth);
|
||||
DesignatedStartIndex.setIsUnsigned(true);
|
||||
DesignatedEndIndex.setIsUnsigned(true);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
// RUN: %clang_cc1 -triple arm64 %s -verify -emit-llvm -o - | FileCheck %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
// Make sure we don't enter an infinite loop (rdar://21942503)
|
||||
|
||||
int vals1[] = {
|
||||
[__objc_yes] = 1,
|
||||
[__objc_no] = 2
|
||||
};
|
||||
// CHECK: @vals1 = global [2 x i32] [i32 2, i32 1]
|
||||
|
||||
int vals2[] = {
|
||||
[true] = 3,
|
||||
[false] = 4
|
||||
};
|
||||
// CHECK: @vals2 = global [2 x i32] [i32 4, i32 3]
|
||||
|
||||
int vals3[] = {
|
||||
[false] = 1,
|
||||
[true] = 2,
|
||||
5
|
||||
};
|
||||
// CHECK: @vals3 = global [3 x i32] [i32 1, i32 2, i32 5]
|
||||
|
||||
int vals4[2] = {
|
||||
[true] = 5,
|
||||
[false] = 6
|
||||
};
|
||||
// CHECK: @vals4 = global [2 x i32] [i32 6, i32 5]
|
||||
|
||||
int vals5[3] = {
|
||||
[false] = 1,
|
||||
[true] = 2,
|
||||
6
|
||||
};
|
||||
// CHECK: @vals5 = global [3 x i32] [i32 1, i32 2, i32 6]
|
Loading…
Reference in New Issue