Revert r104117, "Provide a naming class for UnresolvedLookupExprs, even when
occuring on..." which breaks some Objective-C code. Working on getting a test case... llvm-svn: 104150
This commit is contained in:
parent
5d4c134a94
commit
fd5ed84873
|
@ -1077,12 +1077,17 @@ Sema::OwningExprResult Sema::ActOnIdExpression(Scope *S,
|
|||
// Perform the required lookup.
|
||||
LookupResult R(*this, Name, NameLoc, LookupOrdinaryName);
|
||||
if (TemplateArgs) {
|
||||
// Lookup the template name again to correctly establish the context in
|
||||
// which it was found. This is really unfortunate as we already did the
|
||||
// lookup to determine that it was a template name in the first place. If
|
||||
// this becomes a performance hit, we can work harder to preserve those
|
||||
// results until we get here but it's likely not worth it.
|
||||
LookupTemplateName(R, S, SS, QualType(), /*EnteringContext=*/false);
|
||||
// Just re-use the lookup done by isTemplateName.
|
||||
DecomposeTemplateName(R, Id);
|
||||
|
||||
// Re-derive the naming class.
|
||||
if (SS.isSet()) {
|
||||
NestedNameSpecifier *Qualifier
|
||||
= static_cast<NestedNameSpecifier *>(SS.getScopeRep());
|
||||
if (const Type *Ty = Qualifier->getAsType())
|
||||
if (CXXRecordDecl *NamingClass = Ty->getAsCXXRecordDecl())
|
||||
R.setNamingClass(NamingClass);
|
||||
}
|
||||
} else {
|
||||
bool IvarLookupFollowUp = (!SS.isSet() && II && getCurMethodDecl());
|
||||
LookupParsedName(R, S, &SS, !IvarLookupFollowUp);
|
||||
|
|
|
@ -665,8 +665,6 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) {
|
|||
//
|
||||
DeclContext *OutsideOfTemplateParamDC = 0;
|
||||
for (; S && !isNamespaceOrTranslationUnitScope(S); S = S->getParent()) {
|
||||
DeclContext *Ctx = static_cast<DeclContext*>(S->getEntity());
|
||||
|
||||
// Check whether the IdResolver has anything in this scope.
|
||||
bool Found = false;
|
||||
for (; I != IEnd && S->isDeclScope(DeclPtrTy::make(*I)); ++I) {
|
||||
|
@ -677,11 +675,10 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) {
|
|||
}
|
||||
if (Found) {
|
||||
R.resolveKind();
|
||||
if (S->isClassScope())
|
||||
R.setNamingClass(dyn_cast<CXXRecordDecl>(Ctx));
|
||||
return true;
|
||||
}
|
||||
|
||||
DeclContext *Ctx = static_cast<DeclContext*>(S->getEntity());
|
||||
if (!Ctx && S->isTemplateParamScope() && OutsideOfTemplateParamDC &&
|
||||
S->getParent() && !S->getParent()->isTemplateParamScope()) {
|
||||
// We've just searched the last template parameter scope and
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// Ensure that when enforcing access control an unqualified template name with
|
||||
// explicit template arguments, we don't loose the context of the name lookup
|
||||
// because of the required early lookup to determine if it names a template.
|
||||
namespace PR7163 {
|
||||
template <typename R, typename P> void h(R (*func)(P)) {}
|
||||
class C {
|
||||
template <typename T> static void g(T*) {};
|
||||
public:
|
||||
void f() { h(g<int>); }
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue