Add clang patch corresponding to r281046.

This commit is contained in:
Dimitry Andric 2015-04-03 18:42:38 +00:00
parent de460a4881
commit 1f26983742
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=281047

View File

@ -0,0 +1,50 @@
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;
+}