[Sema] PR25181 Fix crash when method declaration with throw spec fails to parse correctly
authorReid Kleckner <rnk@google.com>
Fri, 19 Feb 2016 01:15:08 +0000 (01:15 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 19 Feb 2016 01:15:08 +0000 (01:15 +0000)
Fixes crash referenced in PR25181 where dyn_cast is called on a null
instance of LM.Method.

Reviewers: majnemer, rnk

Patch by Don Hinton

Differential Revision: http://reviews.llvm.org/D17072

llvm-svn: 261292

clang/lib/Parse/ParseCXXInlineMethods.cpp
clang/test/SemaCXX/pr25181-crash-on-invalid.cpp [new file with mode: 0644]

index 89ef35c..07e32b7 100644 (file)
@@ -52,7 +52,8 @@ NamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS,
     }
   }
 
-  HandleMemberFunctionDeclDelays(D, FnD);
+  if (FnD)
+    HandleMemberFunctionDeclDelays(D, FnD);
 
   D.complete(FnD);
 
diff --git a/clang/test/SemaCXX/pr25181-crash-on-invalid.cpp b/clang/test/SemaCXX/pr25181-crash-on-invalid.cpp
new file mode 100644 (file)
index 0000000..41178c9
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// Don't crash (PR25181).
+
+template <typename T> class Foo { // expected-note {{template parameter is declared here}}
+  template <typename T> // expected-error {{declaration of 'T' shadows template parameter}}
+  void Foo<T>::method(T *) const throw() {} // expected-error {{nested name specifier 'Foo<T>::' for declaration does not refer into a class, class template or class template partial specialization}}
+};