diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-03-15 15:26:48 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-03-15 15:26:48 +0000 | 
| commit | ea16606fcd0b097e6cd5e0349f6bb533744e78f2 (patch) | |
| tree | 04523034850bba8850b65f82d5de99051c161cdc /clang | |
| parent | 6623006249cbeffd7f4f651099f99d51fbd62a50 (diff) | |
| download | bcm5719-llvm-ea16606fcd0b097e6cd5e0349f6bb533744e78f2.tar.gz bcm5719-llvm-ea16606fcd0b097e6cd5e0349f6bb533744e78f2.zip  | |
During C++ name lookup, use DeclContext::Equals() rather than
comparing DeclContext pointers, to avoid having to remember to call
getPrimaryContext() everywhere. This is the last part PR6594.
llvm-svn: 98546
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/DeclBase.h | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 8 | ||||
| -rw-r--r-- | clang/test/CXX/temp/temp.res/temp.local/p8.cpp | 19 | 
3 files changed, 23 insertions, 6 deletions
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 0bdc6f54b7c..6f8284458f2 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -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 diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 615f2f1d84c..6caeec620d0 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -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()) { diff --git a/clang/test/CXX/temp/temp.res/temp.local/p8.cpp b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp index a90c78cd4b1..5d9d50913f3 100644 --- a/clang/test/CXX/temp/temp.res/temp.local/p8.cpp +++ b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp @@ -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; +} +  | 

