xref: /llvm-project/clang/test/SemaTemplate/elaborated-type-specifier.cpp (revision a0d266d705d6c145e8daa08a08f70e9498ec3d0b)
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 namespace PR6915 {
4   template <typename T>
5   class D {
6     enum T::X v; // expected-error{{use of 'X' with tag type that does not match previous declaration}} \
7     // expected-error{{no enum named 'X' in 'PR6915::D3'}}
8   };
9 
10   struct D1 {
11     enum X { value };
12   };
13   struct D2 {
14     class X { }; // expected-note{{previous use is here}}
15   };
16   struct D3 { };
17 
18   template class D<D1>;
19   template class D<D2>; // expected-note{{in instantiation of}}
20   template class D<D3>; // expected-note{{in instantiation of}}
21 }
22 
23 template<typename T>
24 struct DeclOrDef {
25   enum T::foo; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
26                // expected-error@-1{{forward declaration of enum cannot have a nested name specifier}}
27   enum T::bar { // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
28     value
29   };
30 };
31 
32 namespace PR6649 {
33   template <typename T> struct foo {
34     class T::bar;  // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
35                    // expected-error@-1{{forward declaration of class cannot have a nested name specifier}}
36     class T::bar { int x; }; // expected-error{{nested name specifier for a declaration cannot depend on a template parameter}}
37   };
38 }
39 
40 namespace rdar8568507 {
41   template <class T> struct A *makeA(T t);
42 }
43