Fix assert instantiating string init of static variable

... when the variable's type is a typedef of a ConstantArrayType. Just
look through the typedef (and any other sugar).  We only use the
constant array type here to get the element count.

llvm-svn: 227115
This commit is contained in:
Ben Langmuir 2015-01-26 19:04:10 +00:00
parent 611dfed99f
commit 577b39349e
2 changed files with 15 additions and 3 deletions

View File

@ -149,9 +149,9 @@ static void updateStringLiteralType(Expr *E, QualType Ty) {
static void CheckStringInit(Expr *Str, QualType &DeclT, const ArrayType *AT,
Sema &S) {
// Get the length of the string as parsed.
uint64_t StrLength =
cast<ConstantArrayType>(Str->getType())->getSize().getZExtValue();
auto *ConstantArrayTy =
cast<ConstantArrayType>(Str->getType()->getUnqualifiedDesugaredType());
uint64_t StrLength = ConstantArrayTy->getSize().getZExtValue();
if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) {
// C99 6.7.8p14. We have an array of character type with unknown size

View File

@ -114,3 +114,15 @@ namespace PR6449 {
template class X1<char>;
}
typedef char MyString[100];
template <typename T>
struct StaticVarWithTypedefString {
static MyString str;
};
template <typename T>
MyString StaticVarWithTypedefString<T>::str = "";
void testStaticVarWithTypedefString() {
(void)StaticVarWithTypedefString<int>::str;
}