xref: /llvm-project/clang/test/Parser/using-template.cpp (revision 2efd30571bcc53003376410d4221f7e4dd19f4c3)
1*2efd3057SRichard Trieu // RUN: %clang_cc1 %s -verify
2*2efd3057SRichard Trieu 
3*2efd3057SRichard Trieu namespace N1 {
4*2efd3057SRichard Trieu template <typename... Ts>
5*2efd3057SRichard Trieu struct Foo {
6*2efd3057SRichard Trieu   template <typename T>
7*2efd3057SRichard Trieu   struct Bar {
8*2efd3057SRichard Trieu     static constexpr bool is_present = false;
9*2efd3057SRichard Trieu   };
10*2efd3057SRichard Trieu };
11*2efd3057SRichard Trieu 
12*2efd3057SRichard Trieu template <typename T, typename... Ts>
13*2efd3057SRichard Trieu struct Foo<T, Ts...> : public Foo<Ts...> {
14*2efd3057SRichard Trieu   using template Foo<Ts...>::Bar;
15*2efd3057SRichard Trieu   // expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
16*2efd3057SRichard Trieu };
17*2efd3057SRichard Trieu }
18*2efd3057SRichard Trieu 
19*2efd3057SRichard Trieu namespace N2 {
20*2efd3057SRichard Trieu namespace foo {
21*2efd3057SRichard Trieu   using I = int;
22*2efd3057SRichard Trieu }
23*2efd3057SRichard Trieu using template namespace foo;
24*2efd3057SRichard Trieu // expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
25*2efd3057SRichard Trieu using template template namespace foo;
26*2efd3057SRichard Trieu // expected-error@-1 2{{'template' keyword not permitted after 'using' keyword}}
27*2efd3057SRichard Trieu I i;
28*2efd3057SRichard Trieu }
29*2efd3057SRichard Trieu 
30*2efd3057SRichard Trieu namespace N3 {
31*2efd3057SRichard Trieu namespace foo {
32*2efd3057SRichard Trieu   using I = int;
33*2efd3057SRichard Trieu }
34*2efd3057SRichard Trieu using template foo::I;
35*2efd3057SRichard Trieu // expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
36*2efd3057SRichard Trieu I i;
37*2efd3057SRichard Trieu }
38*2efd3057SRichard Trieu 
39*2efd3057SRichard Trieu namespace N4 {
40*2efd3057SRichard Trieu template <typename T>
41*2efd3057SRichard Trieu class A {};
42*2efd3057SRichard Trieu 
43*2efd3057SRichard Trieu template <typename T>
44*2efd3057SRichard Trieu using B = A<T>;
45*2efd3057SRichard Trieu B<int> b;
46*2efd3057SRichard Trieu 
47*2efd3057SRichard Trieu using template <typename T> C = A<T>;
48*2efd3057SRichard Trieu // expected-error@-1 {{'template' keyword not permitted after 'using' keyword}}
49*2efd3057SRichard Trieu // expected-error@-2 {{expected unqualified-id}}
50*2efd3057SRichard Trieu C<int> c;
51*2efd3057SRichard Trieu // expected-error@-1 {{no template named 'C'}}
52*2efd3057SRichard Trieu }
53