[cfe-commits] r104150 - in /cfe/trunk: lib/Sema/SemaExpr.cpp lib/Sema/SemaLookup.cpp test/CXX/temp/temp.names/p2.cpp

Daniel Dunbar daniel at zuster.org
Wed May 19 14:07:14 PDT 2010


Author: ddunbar
Date: Wed May 19 16:07:14 2010
New Revision: 104150

URL: http://llvm.org/viewvc/llvm-project?rev=104150&view=rev
Log:
Revert r104117, "Provide a naming class for UnresolvedLookupExprs, even when
occuring on..." which breaks some Objective-C code. Working on getting a test
case...

Removed:
    cfe/trunk/test/CXX/temp/temp.names/p2.cpp
Modified:
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaLookup.cpp

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=104150&r1=104149&r2=104150&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed May 19 16:07:14 2010
@@ -1077,12 +1077,17 @@
   // 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);

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=104150&r1=104149&r2=104150&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed May 19 16:07:14 2010
@@ -665,8 +665,6 @@
   //
   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 @@
     }
     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

Removed: cfe/trunk/test/CXX/temp/temp.names/p2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.names/p2.cpp?rev=104149&view=auto
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.names/p2.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.names/p2.cpp (removed)
@@ -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>); }
-  };
-}





More information about the cfe-commits mailing list