[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:
Argyrios Kyrtzidis 2015-07-27 23:16:53 +00:00
parent a90d0992b7
commit 4746c2fcdb
2 changed files with 42 additions and 8 deletions

View File

@ -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);
}

View File

@ -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]