diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-01-14 17:47:39 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-01-14 17:47:39 +0000 |
| commit | d2e6a457229ccf2478cbd7de5fe763b871a482d8 (patch) | |
| tree | ecb0845d6180610cd78c298314fb8a99b0b09741 /clang/test/SemaTemplate/dependent-base-classes.cpp | |
| parent | fc59ce1ea47cd9ea8f887dc5e5ae8191ef762957 (diff) | |
| download | bcm5719-llvm-d2e6a457229ccf2478cbd7de5fe763b871a482d8.tar.gz bcm5719-llvm-d2e6a457229ccf2478cbd7de5fe763b871a482d8.zip | |
When qualified lookup into the current instantiation fails (because it
finds nothing), and the current instantiation has dependent base
classes, treat the qualified lookup as if it referred to an unknown
specialization. Fixes PR6031.
llvm-svn: 93433
Diffstat (limited to 'clang/test/SemaTemplate/dependent-base-classes.cpp')
| -rw-r--r-- | clang/test/SemaTemplate/dependent-base-classes.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/test/SemaTemplate/dependent-base-classes.cpp b/clang/test/SemaTemplate/dependent-base-classes.cpp index 242765894f7..b9666dba61c 100644 --- a/clang/test/SemaTemplate/dependent-base-classes.cpp +++ b/clang/test/SemaTemplate/dependent-base-classes.cpp @@ -10,3 +10,56 @@ struct X1 : T::apply<U> { }; // expected-error{{missing 'template' keyword prior template<typename T> struct X2 : vector<T> { }; // expected-error{{unknown template name 'vector'}} + +namespace PR6031 { + template<typename T> + struct A; + + template <class X> + struct C { }; + + template <class TT> + struct II { + typedef typename A<TT>::type type; + }; + + template <class TT> + struct FI : II<TT> + { + C<typename FI::type> a; + }; + + template <class TT> + struct FI2 + { + C<typename FI2::type> a; // expected-error{{no type named 'type' in 'struct PR6031::FI2'}} \ + // expected-error{{C++ requires a type specifier for all declarations}} + }; + + template<typename T> + struct Base { + class Nested { }; + template<typename U> struct MemberTemplate { }; + int a; + }; + + template<typename T> + struct HasDepBase : Base<T> { + int foo() { + class HasDepBase::Nested nested; + typedef typename HasDepBase::template MemberTemplate<T>::type type; + return HasDepBase::a; + } + }; + + template<typename T> + struct NoDepBase { + int foo() { + class NoDepBase::Nested nested; // expected-error{{'Nested' does not name a tag member in the specified scope}} + typedef typename NoDepBase::template MemberTemplate<T>::type type; // expected-error{{'MemberTemplate' following the 'template' keyword does not refer to a template}} \ + // FIXME: expected-error{{expected an identifier or template-id after '::'}} \ + // FIXME: expected-error{{unqualified-id}} + return NoDepBase::a; // expected-error{{no member named 'a' in 'struct PR6031::NoDepBase'}} + } + }; +} |

