r243343 - [sema] Fix infinite loop when using a boolean value as designated initializer.

Hans Wennborg hans at chromium.org
Wed Jul 29 10:40:07 PDT 2015


+Richard for owner's approval.

On Wed, Jul 29, 2015 at 10:35 AM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
> It’s safe enough to merge.
>
>> On Jul 29, 2015, at 10:10 AM, Hans Wennborg <hans at chromium.org> wrote:
>>
>> Should this be merged to 3.7?
>>
>> On Mon, Jul 27, 2015 at 4:16 PM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:
>>> Author: akirtzidis
>>> Date: Mon Jul 27 18:16:53 2015
>>> New Revision: 243343
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=243343&view=rev
>>> Log:
>>> [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
>>>
>>> Added:
>>>    cfe/trunk/test/CodeGenObjCXX/designated-initializers.mm
>>> Modified:
>>>    cfe/trunk/lib/Sema/SemaInit.cpp
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=243343&r1=243342&r2=243343&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaInit.cpp Mon Jul 27 18:16:53 2015
>>> @@ -2372,14 +2372,12 @@ InitListChecker::CheckDesignatedInitiali
>>>       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);
>>>   }
>>>
>>> Added: cfe/trunk/test/CodeGenObjCXX/designated-initializers.mm
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/designated-initializers.mm?rev=243343&view=auto
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGenObjCXX/designated-initializers.mm (added)
>>> +++ cfe/trunk/test/CodeGenObjCXX/designated-initializers.mm Mon Jul 27 18:16:53 2015
>>> @@ -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]




More information about the cfe-commits mailing list