]> granicus.if.org Git - clang/commitdiff
Don't enter a qualified scope for an invalid decl.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 22 Apr 2011 18:52:25 +0000 (18:52 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 22 Apr 2011 18:52:25 +0000 (18:52 +0000)
Fixes assertion later on. rdar://9122937 & http://llvm.org/PR9459

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/PR9459.cpp [new file with mode: 0644]

index 88193f54642f2815ce8af7ad1d4a382eb7e3ec8f..53a7c73998efd6e7ac1abdc376e281c9c4a67d52 100644 (file)
@@ -7639,7 +7639,7 @@ bool Sema::CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange) {
 /// class X.
 void Sema::ActOnCXXEnterDeclInitializer(Scope *S, Decl *D) {
   // If there is no declaration, there was an error parsing it.
-  if (D == 0) return;
+  if (D == 0 || D->isInvalidDecl()) return;
 
   // We should only get called for declarations with scope specifiers, like:
   //   int foo::bar;
@@ -7651,7 +7651,7 @@ void Sema::ActOnCXXEnterDeclInitializer(Scope *S, Decl *D) {
 /// initializer for the out-of-line declaration 'D'.
 void Sema::ActOnCXXExitDeclInitializer(Scope *S, Decl *D) {
   // If there is no declaration, there was an error parsing it.
-  if (D == 0) return;
+  if (D == 0 || D->isInvalidDecl()) return;
 
   assert(D->isOutOfLine());
   ExitDeclaratorContext(S);
diff --git a/test/SemaCXX/PR9459.cpp b/test/SemaCXX/PR9459.cpp
new file mode 100644 (file)
index 0000000..33cb2e5
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// Don't crash.
+
+template<typename>struct ae_same; // expected-note {{declared here}}
+template<typename>struct ts{}ap()
+{ts<a>::ap<ae_same<int>::&ae_same<>>::p(a); }; // expected-error 2 {{undeclared identifier}} \
+    // expected-error 2 {{expected}} expected-error {{a space is required}} \
+    // expected-error 2 {{global}} expected-error {{too few}}