51 lines
1.9 KiB
Diff
51 lines
1.9 KiB
Diff
|
Pull in r227115 from upstream clang trunk (by Ben Langmuir):
|
||
|
|
||
|
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.
|
||
|
|
||
|
This fixes an assertion failure when building the games/redeclipse port.
|
||
|
|
||
|
Introduced here: http://svnweb.freebsd.org/changeset/base/281046
|
||
|
|
||
|
Index: tools/clang/lib/Sema/SemaInit.cpp
|
||
|
===================================================================
|
||
|
--- tools/clang/lib/Sema/SemaInit.cpp
|
||
|
+++ tools/clang/lib/Sema/SemaInit.cpp
|
||
|
@@ -149,10 +149,10 @@ static void updateStringLiteralType(Expr *E, QualT
|
||
|
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
|
||
|
// being initialized to a string literal.
|
||
|
Index: tools/clang/test/SemaTemplate/instantiate-static-var.cpp
|
||
|
===================================================================
|
||
|
--- tools/clang/test/SemaTemplate/instantiate-static-var.cpp
|
||
|
+++ tools/clang/test/SemaTemplate/instantiate-static-var.cpp
|
||
|
@@ -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;
|
||
|
+}
|