forked from OSchip/llvm-project
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 llvm-svn: 293596
This commit is contained in:
parent
d6cc198d53
commit
bc332648e8
|
@ -2394,7 +2394,14 @@ static unsigned getBaseIndex(const CXXRecordDecl *Derived,
|
|||
/// 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);
|
||||
|
|
|
@ -180,3 +180,14 @@ const char g14[] = @encode(__typeof__(*test_id));
|
|||
|
||||
// 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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue