diff options
-rw-r--r-- | lib/Sema/SemaInherit.cpp | 6 | ||||
-rw-r--r-- | test/SemaTemplate/dependent-names.cpp | 16 |
2 files changed, 22 insertions, 0 deletions
diff --git a/lib/Sema/SemaInherit.cpp b/lib/Sema/SemaInherit.cpp index 1b968f0fbc..28ca5f64ef 100644 --- a/lib/Sema/SemaInherit.cpp +++ b/lib/Sema/SemaInherit.cpp @@ -138,6 +138,12 @@ bool Sema::LookupInBases(CXXRecordDecl *Class, // Find the record of the base class subobjects for this type. 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. + if (BaseType->isDependentType()) + continue; // Determine whether we need to visit this base class at all, // updating the count of subobjects appropriately. diff --git a/test/SemaTemplate/dependent-names.cpp b/test/SemaTemplate/dependent-names.cpp new file mode 100644 index 0000000000..95ee2d2b9d --- /dev/null +++ b/test/SemaTemplate/dependent-names.cpp @@ -0,0 +1,16 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +typedef double A; +template<typename T> class B { + typedef int A; +}; + +template<typename T> struct X : B<T> { + static A a; +}; + +int a0[sizeof(X<int>::a) == sizeof(double) ? 1 : -1]; + +// PR4365. +template<class T> class Q; +template<class T> class R : Q<T> {T current;}; |