[llvm-branch-commits] [cfe-branch] r293653 - Merging r293596:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Jan 31 09:27:08 PST 2017


Author: hans
Date: Tue Jan 31 11:27:07 2017
New Revision: 293653

URL: http://llvm.org/viewvc/llvm-project?rev=293653&view=rev
Log:
Merging r293596:
------------------------------------------------------------------------
r293596 | ahatanak | 2017-01-30 18:31:39 -0800 (Mon, 30 Jan 2017) | 7 lines

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/branches/release_40/   (props changed)
    cfe/branches/release_40/lib/AST/ExprConstant.cpp
    cfe/branches/release_40/test/CodeGenObjC/encode-test.m

Propchange: cfe/branches/release_40/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 31 11:27:07 2017
@@ -1,4 +1,4 @@
 /cfe/branches/type-system-rewrite:134693-134817
-/cfe/trunk:291850,291853,291865,291871,291877,291879,291881,291907,291955,291964,292032,292052,292183,292247,292265,292497,292555,292558-292559,292561,292590,292800,292847,292874,292991,293134
+/cfe/trunk:291850,291853,291865,291871,291877,291879,291881,291907,291955,291964,292032,292052,292183,292247,292265,292497,292555,292558-292559,292561,292590,292800,292847,292874,292991,293134,293596
 /cfe/trunk/test:170344
 /cfe/trunk/test/SemaTemplate:126920

Modified: cfe/branches/release_40/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_40/lib/AST/ExprConstant.cpp?rev=293653&r1=293652&r2=293653&view=diff
==============================================================================
--- cfe/branches/release_40/lib/AST/ExprConstant.cpp (original)
+++ cfe/branches/release_40/lib/AST/ExprConstant.cpp Tue Jan 31 11:27:07 2017
@@ -2362,7 +2362,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/branches/release_40/test/CodeGenObjC/encode-test.m
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_40/test/CodeGenObjC/encode-test.m?rev=293653&r1=293652&r2=293653&view=diff
==============================================================================
--- cfe/branches/release_40/test/CodeGenObjC/encode-test.m (original)
+++ cfe/branches/release_40/test/CodeGenObjC/encode-test.m Tue Jan 31 11:27:07 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);
+}




More information about the llvm-branch-commits mailing list