From a522693f66f631c54057d77271aedfbab2f950e6 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 4 Feb 2011 13:35:07 +0000 Subject: Improve our handling of the current instantiation for qualified id-expression, e.g., CurrentClass::member Previously, if CurrentClass was dependent and not complete, we would treat it as a dependent-scoped declaration reference expression, even if CurrentClass referred to the current instantiation. Fixes PR8966 and improves type checking of templates. llvm-svn: 124867 --- clang/lib/Sema/SemaExpr.cpp | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) (limited to 'clang/lib/Sema') diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0d4950fd16c..a4649777792 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1035,28 +1035,6 @@ static void DecomposeUnqualifiedId(Sema &SemaRef, } } -/// Determines whether the given record is "fully-formed" at the given -/// location, i.e. whether a qualified lookup into it is assured of -/// getting consistent results already. -static bool IsFullyFormedScope(Sema &SemaRef, CXXRecordDecl *Record) { - if (!Record->hasDefinition()) - return false; - - for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(), - E = Record->bases_end(); I != E; ++I) { - CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType()); - CanQual BaseRT = BaseT->getAs(); - if (!BaseRT) return false; - - CXXRecordDecl *BaseRecord = cast(BaseRT->getDecl()); - if (!BaseRecord->hasDefinition() || - !IsFullyFormedScope(SemaRef, BaseRecord)) - return false; - } - - return true; -} - /// Determines if the given class is provably not derived from all of /// the prospective base classes. static bool IsProvablyNotDerivedFrom(Sema &SemaRef, @@ -1489,9 +1467,6 @@ ExprResult Sema::ActOnIdExpression(Scope *S, if (DC) { if (RequireCompleteDeclContext(SS, DC)) return ExprError(); - // FIXME: We should be checking whether DC is the current instantiation. - if (CXXRecordDecl *RD = dyn_cast(DC)) - DependentID = !IsFullyFormedScope(*this, RD); } else { DependentID = true; } @@ -1513,10 +1488,21 @@ ExprResult Sema::ActOnIdExpression(Scope *S, bool MemberOfUnknownSpecialization; LookupTemplateName(R, S, SS, QualType(), /*EnteringContext=*/false, MemberOfUnknownSpecialization); + + if (MemberOfUnknownSpecialization || + (R.getResultKind() == LookupResult::NotFoundInCurrentInstantiation)) + return ActOnDependentIdExpression(SS, NameInfo, isAddressOfOperand, + TemplateArgs); } else { IvarLookupFollowUp = (!SS.isSet() && II && getCurMethodDecl()); LookupParsedName(R, S, &SS, !IvarLookupFollowUp); + // If the result might be in a dependent base class, this is a dependent + // id-expression. + if (R.getResultKind() == LookupResult::NotFoundInCurrentInstantiation) + return ActOnDependentIdExpression(SS, NameInfo, isAddressOfOperand, + TemplateArgs); + // If this reference is in an Objective-C method, then we need to do // some special Objective-C lookup, too. if (IvarLookupFollowUp) { -- cgit v1.2.3