From: Argyrios Kyrtzidis Date: Mon, 27 Jul 2015 23:16:53 +0000 (+0000) Subject: [sema] Fix infinite loop when using a boolean value as designated initializer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eec29eea850a99a414d2bdfb0b401df01e99ae24;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243343 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 25d091f1d8..ed56963584 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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); } diff --git a/test/CodeGenObjCXX/designated-initializers.mm b/test/CodeGenObjCXX/designated-initializers.mm new file mode 100644 index 0000000000..41a4271bc8 --- /dev/null +++ b/test/CodeGenObjCXX/designated-initializers.mm @@ -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]