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}} +} _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits