diff options
-rw-r--r-- | clang/lib/Sema/SemaInherit.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 5 | ||||
-rw-r--r-- | clang/test/CXX/temp/temp.res/temp.dep/p3.cpp | 43 |
3 files changed, 51 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaInherit.cpp b/clang/lib/Sema/SemaInherit.cpp index e6734d51766..01e856c1d6d 100644 --- a/clang/lib/Sema/SemaInherit.cpp +++ b/clang/lib/Sema/SemaInherit.cpp @@ -139,9 +139,12 @@ bool Sema::LookupInBases(CXXRecordDecl *Class, QualType BaseType = Context.getCanonicalType(BaseSpec->getType()); BaseType = BaseType.getUnqualifiedType(); - // If a base class of the class template depends on a template-parameter, - // the base class scope is not examined during unqualified name lookup. - // [temp.dep]p3. + // C++ [temp.dep]p3: + // In the definition of a class template or a member of a class template, + // if a base class of the class template depends on a template-parameter, + // the base class scope is not examined during unqualified name lookup + // either at the point of definition of the class template or member or + // during an instantiation of the class tem- plate or member. if (BaseType->isDependentType()) continue; diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 67674206fb8..70befd630c5 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1032,9 +1032,8 @@ Sema::LookupQualifiedName(DeclContext *LookupCtx, DeclarationName Name, return LookupResult::CreateLookupResult(Context, I, E); // If this isn't a C++ class, we aren't allowed to look into base - // classes, we're done, or the lookup context is dependent, we're done. - if (RedeclarationOnly || !isa<CXXRecordDecl>(LookupCtx) || - LookupCtx->isDependentContext()) + // classes, we're done. + if (RedeclarationOnly || !isa<CXXRecordDecl>(LookupCtx)) return LookupResult::CreateLookupResult(Context, 0); // Perform lookup into our base classes. diff --git a/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp b/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp new file mode 100644 index 00000000000..d47f0d68351 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp @@ -0,0 +1,43 @@ +// RUN: clang-cc -fsyntax-only -verify %s +struct A0 { + struct K { }; +}; + +template <typename T> struct B0: A0 { + static void f() { + K k; + } +}; + +namespace E1 { + typedef double A; + + template<class T> class B { + typedef int A; + }; + + template<class T> + struct X : B<T> { + A* blarg(double *dp) { + return dp; + } + }; +} + +namespace E2 { + struct A { + struct B; + int *a; + int Y; + }; + + int a; + template<class T> struct Y : T { + struct B { /* ... */ }; + B b; + void f(int i) { a = i; } + Y* p; + }; + + Y<A> ya; +} |