r293596 - Handle ObjCEncodeExpr in extractStringLiteralCharacter.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 31 09:38:32 PST 2017


Merged in r293653.

Thanks,
Hans

On Mon, Jan 30, 2017 at 7:16 PM, Akira Hatanaka <ahatanaka at apple.com> wrote:
> Hans, can this be merged to 4.0? This fixes a regression from 3.9 (the part I touched was committed a few years ago, but didn’t cause an assert until recently).
>
>> On Jan 30, 2017, at 6:31 PM, Akira Hatanaka via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: ahatanak
>> Date: Mon Jan 30 20:31:39 2017
>> New Revision: 293596
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=293596&view=rev
>> Log:
>> Handle ObjCEncodeExpr in extractStringLiteralCharacter.
>>
>> This fixes an assertion failure that occurs later in the function when
>> an ObjCEncodeExpr is cast to StringLiteral.
>>
>> rdar://problem/30111207
>>
>> Modified:
>>    cfe/trunk/lib/AST/ExprConstant.cpp
>>    cfe/trunk/test/CodeGenObjC/encode-test.m
>>
>> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=293596&r1=293595&r2=293596&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
>> +++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Jan 30 20:31:39 2017
>> @@ -2394,7 +2394,14 @@ static unsigned getBaseIndex(const CXXRe
>> /// Extract the value of a character from a string literal.
>> static APSInt extractStringLiteralCharacter(EvalInfo &Info, const Expr *Lit,
>>                                             uint64_t Index) {
>> -  // FIXME: Support ObjCEncodeExpr, MakeStringConstant
>> +  // FIXME: Support MakeStringConstant
>> +  if (const auto *ObjCEnc = dyn_cast<ObjCEncodeExpr>(Lit)) {
>> +    std::string Str;
>> +    Info.Ctx.getObjCEncodingForType(ObjCEnc->getEncodedType(), Str);
>> +    assert(Index <= Str.size() && "Index too large");
>> +    return APSInt::getUnsigned(Str.c_str()[Index]);
>> +  }
>> +
>>   if (auto PE = dyn_cast<PredefinedExpr>(Lit))
>>     Lit = PE->getFunctionName();
>>   const StringLiteral *S = cast<StringLiteral>(Lit);
>>
>> Modified: cfe/trunk/test/CodeGenObjC/encode-test.m
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/encode-test.m?rev=293596&r1=293595&r2=293596&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenObjC/encode-test.m (original)
>> +++ cfe/trunk/test/CodeGenObjC/encode-test.m Mon Jan 30 20:31:39 2017
>> @@ -180,3 +180,14 @@ const char g14[] = @encode(__typeof__(*t
>>
>> // CHECK: @g15 = constant [2 x i8] c":\00"
>> const char g15[] = @encode(SEL);
>> +
>> +typedef typeof(sizeof(int)) size_t;
>> +size_t strlen(const char *s);
>> +
>> +// CHECK-LABEL: @test_strlen(
>> +// CHECK: %[[i:.*]] = alloca i32
>> +// CHECK: store i32 1, i32* %[[i]]
>> +void test_strlen() {
>> +  const char array[] = @encode(int);
>> +  int i = strlen(array);
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


More information about the cfe-commits mailing list