r224526 - Revert "Don't build invalid AST nodes during recovery"

Reid Kleckner reid at kleckner.net
Thu Dec 18 10:17:42 PST 2014


Author: rnk
Date: Thu Dec 18 12:17:42 2014
New Revision: 224526

URL: http://llvm.org/viewvc/llvm-project?rev=224526&view=rev
Log:
Revert "Don't build invalid AST nodes during recovery"

This reverts commit r224451. It caused us to reject some valid existing
code.

This code appears to run in non-error cases as well as error cases. If
the scope of a DependentScopeDeclRefExpr is still incomplete it probably
means we still have more instantiation to do.

Modified:
    cfe/trunk/lib/Sema/SemaTemplate.cpp
    cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=224526&r1=224525&r2=224526&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Thu Dec 18 12:17:42 2014
@@ -2874,7 +2874,7 @@ Sema::BuildQualifiedTemplateIdExpr(CXXSc
   if (!(DC = computeDeclContext(SS, false)) ||
       DC->isDependentContext() ||
       RequireCompleteDeclContext(SS, DC))
-    return ExprError();
+    return BuildDependentDeclRefExpr(SS, TemplateKWLoc, NameInfo, TemplateArgs);
 
   bool MemberOfUnknownSpecialization;
   LookupResult R(*this, NameInfo, LookupOrdinaryName);

Modified: cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp?rev=224526&r1=224525&r2=224526&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp Thu Dec 18 12:17:42 2014
@@ -1,19 +1,8 @@
 // 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}}
-}





More information about the cfe-commits mailing list