This revision was automatically updated to reflect the committed changes.
Closed by commit rL313569: [Sema] Fix a pair of crashes when generating 
exception specifiers with an (authored by erichkeane).

Changed prior to commit:
  https://reviews.llvm.org/D37865?vs=115278&id=115726#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D37865

Files:
  cfe/trunk/lib/Sema/SemaDeclCXX.cpp
  cfe/trunk/test/SemaCXX/init-expr-crash.cpp


Index: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp
@@ -12436,7 +12436,8 @@
       assert(Pattern && "We must have set the Pattern!");
     }
 
-    if (InstantiateInClassInitializer(Loc, Field, Pattern,
+    if (!Pattern->hasInClassInitializer() ||
+        InstantiateInClassInitializer(Loc, Field, Pattern,
                                       getTemplateInstantiationArgs(Field))) {
       // Don't diagnose this again.
       Field->setInvalidDecl();
Index: cfe/trunk/test/SemaCXX/init-expr-crash.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/init-expr-crash.cpp
+++ cfe/trunk/test/SemaCXX/init-expr-crash.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
+
+// Test reproduces a pair of crashes that were caused by code attempting
+// to materialize a default constructor's exception specifier.
+
+template <class T> struct A {
+  static T tab[];
+
+  const int M = UNDEFINED; // expected-error {{use of undeclared identifier}}
+
+  int main()
+  {
+    A<char> a;
+
+    return 0;
+  }
+};
+
+template <class T> struct B {
+  static T tab[];
+
+  // expected-error@+1 {{invalid application of 'sizeof' to an incomplete 
type}}
+  const int N = sizeof(B<char>::tab) / sizeof(char);
+
+  int main()
+  {
+    B<char> b;
+
+    return 0;
+  }
+};


Index: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp
@@ -12436,7 +12436,8 @@
       assert(Pattern && "We must have set the Pattern!");
     }
 
-    if (InstantiateInClassInitializer(Loc, Field, Pattern,
+    if (!Pattern->hasInClassInitializer() ||
+        InstantiateInClassInitializer(Loc, Field, Pattern,
                                       getTemplateInstantiationArgs(Field))) {
       // Don't diagnose this again.
       Field->setInvalidDecl();
Index: cfe/trunk/test/SemaCXX/init-expr-crash.cpp
===================================================================
--- cfe/trunk/test/SemaCXX/init-expr-crash.cpp
+++ cfe/trunk/test/SemaCXX/init-expr-crash.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
+
+// Test reproduces a pair of crashes that were caused by code attempting
+// to materialize a default constructor's exception specifier.
+
+template <class T> struct A {
+  static T tab[];
+
+  const int M = UNDEFINED; // expected-error {{use of undeclared identifier}}
+
+  int main()
+  {
+    A<char> a;
+
+    return 0;
+  }
+};
+
+template <class T> struct B {
+  static T tab[];
+
+  // expected-error@+1 {{invalid application of 'sizeof' to an incomplete type}}
+  const int N = sizeof(B<char>::tab) / sizeof(char);
+
+  int main()
+  {
+    B<char> b;
+
+    return 0;
+  }
+};
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to