Fix InitListExpr::isStringLiteralInit so it handles various edge cases correctly. PR13643.

llvm-svn: 162226
This commit is contained in:
Eli Friedman 2012-08-20 20:55:45 +00:00
parent c40c9851b1
commit cf4ab0891d
2 changed files with 18 additions and 3 deletions

View File

@ -1723,10 +1723,10 @@ void InitListExpr::setArrayFiller(Expr *filler) {
bool InitListExpr::isStringLiteralInit() const {
if (getNumInits() != 1)
return false;
const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(getType());
if (!CAT || !CAT->getElementType()->isIntegerType())
const ArrayType *AT = getType()->getAsArrayTypeUnsafe();
if (!AT || !AT->getElementType()->isIntegerType())
return false;
const Expr *Init = getInit(0)->IgnoreParenImpCasts();
const Expr *Init = getInit(0)->IgnoreParens();
return isa<StringLiteral>(Init) || isa<ObjCEncodeExpr>(Init);
}

View File

@ -144,3 +144,18 @@ void g28() {
static v12i16 b = (v2f80){1,2};
static v2f80 c = (v12i16){0,0,0,-32768,16383,0,0,0,0,-32768,16384,0};
}
// PR13643
void g29() {
typedef char DCC_PASSWD[2];
typedef struct
{
DCC_PASSWD passwd;
} DCC_SRVR_NM;
// CHECK: @g29.a = internal global %struct.DCC_SRVR_NM { [2 x i8] c"@\00" }, align 1
// CHECK: @g29.b = internal global [1 x i32] [i32 ptrtoint ([5 x i8]* @.str to i32)], align 4
// CHECK: @g29.c = internal global [1 x i32] [i32 97], align 4
static DCC_SRVR_NM a = { {"@"} };
static int b[1] = { "asdf" };
static int c[1] = { L"a" };
}