]> granicus.if.org Git - clang/commitdiff
Don't build invalid AST nodes during recovery
authorReid Kleckner <reid@kleckner.net>
Wed, 17 Dec 2014 19:34:15 +0000 (19:34 +0000)
committerReid Kleckner <reid@kleckner.net>
Wed, 17 Dec 2014 19:34:15 +0000 (19:34 +0000)
A DependentScopeDeclRefExpr should always have a nested name specifier.
During template instantiation, if we found that the named context was
incomplete, we would previously build a DependentScopeDeclRefExpr with
an empty qualifier.

This error recovery path has been asserting for some time. The other
error codepaths use ExprError, so we can do the same.

Fixes PR21864.

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

lib/Sema/SemaTemplate.cpp
test/SemaTemplate/instantiate-dependent-nested-name.cpp

index 07e3137f845d14ea6a5cfeecc16798236bbb5e29..f2e951e5749b3ba134f905c34724fab73825b542 100644 (file)
@@ -2877,7 +2877,7 @@ Sema::BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS,
   if (!(DC = computeDeclContext(SS, false)) ||
       DC->isDependentContext() ||
       RequireCompleteDeclContext(SS, DC))
-    return BuildDependentDeclRefExpr(SS, TemplateKWLoc, NameInfo, TemplateArgs);
+    return ExprError();
 
   bool MemberOfUnknownSpecialization;
   LookupResult R(*this, NameInfo, LookupOrdinaryName);
index 06a1ed4119d2603cd5e8e3362c774594237bc5bf..cb2c946edee0623dea3e00dc5f558159e7d1f81b 100644 (file)
@@ -1,8 +1,19 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
-// expected-no-diagnostics
+
 // PR4382
 template<typename T> struct X { static const T A = 1; };
 template<typename T, bool = X<T>::A> struct Y { typedef T A; };
 template<typename T> struct Z { typedef typename Y<T>::A A; };
 extern int x;
 extern Z<int>::A x;
+
+namespace pr21964 {
+struct H;
+template <class> struct T {
+  struct A; // expected-note {{member is declared here}}
+  static void B() {
+    A::template N<H>; // expected-error {{implicit instantiation of undefined member 'pr21964::T<pr21964::H>::A'}}
+  }
+};
+template struct T<H>; // expected-note {{requested here}}
+}