r224451 - Don't build invalid AST nodes during recovery
Reid Kleckner
reid at kleckner.net
Wed Dec 17 11:34:15 PST 2014
Author: rnk
Date: Wed Dec 17 13:34:15 2014
New Revision: 224451
URL: http://llvm.org/viewvc/llvm-project?rev=224451&view=rev
Log:
Don't build invalid AST nodes during recovery
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.
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=224451&r1=224450&r2=224451&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Dec 17 13:34:15 2014
@@ -2877,7 +2877,7 @@ Sema::BuildQualifiedTemplateIdExpr(CXXSc
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);
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=224451&r1=224450&r2=224451&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-dependent-nested-name.cpp Wed Dec 17 13:34:15 2014
@@ -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}}
+}
More information about the cfe-commits
mailing list