summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaTemplate/dependent-base-classes.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-01-14 17:47:39 +0000
committerDouglas Gregor <dgregor@apple.com>2010-01-14 17:47:39 +0000
commitd2e6a457229ccf2478cbd7de5fe763b871a482d8 (patch)
treeecb0845d6180610cd78c298314fb8a99b0b09741 /clang/test/SemaTemplate/dependent-base-classes.cpp
parentfc59ce1ea47cd9ea8f887dc5e5ae8191ef762957 (diff)
downloadbcm5719-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.cpp53
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'}}
+ }
+ };
+}
OpenPOWER on IntegriCloud