diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-04-24 16:38:41 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-04-24 16:38:41 +0000 |
commit | 48c89f4aa708e28310cb0c94b2d9d044b0ab806c (patch) | |
tree | 5eae1b37444f8cc0ed855d1ce1ab7145101f88fa /test/SemaTemplate/elaborated-type-specifier.cpp | |
parent | 80971bdba20b5b280a00b7b9829026b33d3206f9 (diff) |
Be more careful around dependent nested-name-specifiers, complaining
when they are not complete (since we could not match them up to
anything) and ensuring that enum parsing can cope with dependent
elaborated-type-specifiers. Fixes PR6915 and PR6649.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102247 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaTemplate/elaborated-type-specifier.cpp')
-rw-r--r-- | test/SemaTemplate/elaborated-type-specifier.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/test/SemaTemplate/elaborated-type-specifier.cpp b/test/SemaTemplate/elaborated-type-specifier.cpp new file mode 100644 index 0000000000..c38bf547a1 --- /dev/null +++ b/test/SemaTemplate/elaborated-type-specifier.cpp @@ -0,0 +1,35 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace PR6915 { + template <typename T> + class D { + enum T::X v; // expected-error{{use of 'X' with tag type that does not match previous declaration}} \ + // expected-error{{no enum named 'X' in 'PR6915::D3'}} + }; + + struct D1 { + enum X { value }; + }; + struct D2 { + class X { }; // expected-note{{previous use is here}} + }; + struct D3 { }; + + template class D<D1>; + template class D<D2>; // expected-note{{in instantiation of}} + template class D<D3>; // expected-note{{in instantiation of}} +} + +template<typename T> +struct DeclOrDef { + enum T::foo; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}} + enum T::bar { // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}} + value + }; +}; + +namespace PR6649 { + template <typename T> struct foo { + class T::bar; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}} + }; +} |