]> granicus.if.org Git - clang/commitdiff
During C++ name lookup, use DeclContext::Equals() rather than
authorDouglas Gregor <dgregor@apple.com>
Mon, 15 Mar 2010 15:26:48 +0000 (15:26 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 15 Mar 2010 15:26:48 +0000 (15:26 +0000)
comparing DeclContext pointers, to avoid having to remember to call
getPrimaryContext() everywhere. This is the last part PR6594.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98546 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclBase.h
lib/Sema/SemaLookup.cpp
test/CXX/temp/temp.res/temp.local/p8.cpp

index 0bdc6f54b7ca1562b76e0362b86c269e7fe89935..6f8284458f2bea11de0ad67d2c2632e92c0eed46 100644 (file)
@@ -660,7 +660,7 @@ public:
   /// \brief Determine whether this declaration context is equivalent
   /// to the declaration context DC.
   bool Equals(DeclContext *DC) {
-    return this->getPrimaryContext() == DC->getPrimaryContext();
+    return DC && this->getPrimaryContext() == DC->getPrimaryContext();
   }
 
   /// \brief Determine whether this declaration context encloses the
index 615f2f1d84c47491f405c7e4e0868b222b247b30..6caeec620d018165403b55a97214c1044b94e7b7 100644 (file)
@@ -603,8 +603,7 @@ static std::pair<DeclContext *, bool> findOuterContext(Scope *S) {
   for (Scope *OuterS = S->getParent(); OuterS; 
        OuterS = OuterS->getParent()) {
     if (OuterS->getEntity()) {
-      Lexical
-        = static_cast<DeclContext *>(OuterS->getEntity())->getPrimaryContext();
+      Lexical = static_cast<DeclContext *>(OuterS->getEntity());
       break;
     }
   }
@@ -722,8 +721,7 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) {
       if (SearchAfterTemplateScope)
         OutsideOfTemplateParamDC = OuterCtx;
 
-      for (; Ctx && Ctx->getPrimaryContext() != OuterCtx; 
-           Ctx = Ctx->getLookupParent()) {
+      for (; Ctx && !Ctx->Equals(OuterCtx); Ctx = Ctx->getLookupParent()) {
         // We do not directly look into transparent contexts, since
         // those entities will be found in the nearest enclosing
         // non-transparent context.
@@ -2307,7 +2305,7 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result,
     Entity = (DeclContext *)S->getEntity();
     DeclContext *OuterCtx = findOuterContext(S).first; // FIXME
     
-    for (DeclContext *Ctx = Entity; Ctx && Ctx->getPrimaryContext() != OuterCtx;
+    for (DeclContext *Ctx = Entity; Ctx && !Ctx->Equals(OuterCtx);
          Ctx = Ctx->getLookupParent()) {
       if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(Ctx)) {
         if (Method->isInstanceMethod()) {
index a90c78cd4b1e87aa3a1ad837848da6b6b49dfc2c..5d9d50913f360dd080f891d96515682143e72316 100644 (file)
@@ -23,7 +23,15 @@ namespace N {
         D d;
       }
     };
+
+    struct Y {
+      template<typename U> void f(U);      
+    };
   }
+
+  struct Y {
+    template<typename D> void f(D);
+  };
 }
 
 template<typename C> 
@@ -32,3 +40,14 @@ void N::M::X<C>::f(C, D) {
   C c;
   D d;
 }
+
+template<typename C>
+void N::M::Y::f(C) {
+  C c;
+}
+
+template<typename D> 
+void N::Y::f(D) {
+  D d;
+}
+