xref: /llvm-project/clang/test/Coverage/ast-print-temp-class.cpp (revision a67a4d2f3c07bd589d395a5815dea2198a261162)
1*a67a4d2fSSerge Pavlov // RUN: %clang_cc1 -ast-print -std=c++14 %s -v -o %t.1.cpp
2*a67a4d2fSSerge Pavlov // RUN: %clang_cc1 -ast-print -std=c++14 %t.1.cpp -o %t.2.cpp
3*a67a4d2fSSerge Pavlov // RUN: diff %t.1.cpp %t.2.cpp
4*a67a4d2fSSerge Pavlov 
5*a67a4d2fSSerge Pavlov // Specializations
6*a67a4d2fSSerge Pavlov 
7*a67a4d2fSSerge Pavlov template<typename T> class C0 {};
8*a67a4d2fSSerge Pavlov template<> class C0<long> {};
9*a67a4d2fSSerge Pavlov template<> class C0<long*> {};
10*a67a4d2fSSerge Pavlov C0<int> c0;
11*a67a4d2fSSerge Pavlov 
12*a67a4d2fSSerge Pavlov template<int N> class C1 {};
13*a67a4d2fSSerge Pavlov template<> class C1<11> {};
14*a67a4d2fSSerge Pavlov C1<2> c1a;
15*a67a4d2fSSerge Pavlov C1<4> c1b;
16*a67a4d2fSSerge Pavlov 
17*a67a4d2fSSerge Pavlov template<typename T> class C2a {};
18*a67a4d2fSSerge Pavlov template<typename T> class C2b {};
19*a67a4d2fSSerge Pavlov template<template<typename T> class TC> class C2 {};
20*a67a4d2fSSerge Pavlov template<> class C2<C2a> {};
21*a67a4d2fSSerge Pavlov C2<C2b> c2;
22*a67a4d2fSSerge Pavlov 
23*a67a4d2fSSerge Pavlov 
24*a67a4d2fSSerge Pavlov // Default arguments
25*a67a4d2fSSerge Pavlov 
26*a67a4d2fSSerge Pavlov template<typename T = int> class C10 {};
27*a67a4d2fSSerge Pavlov template<int N = 10> class C11 {};
28*a67a4d2fSSerge Pavlov template<typename T, int N = 22> class C12a {};
29*a67a4d2fSSerge Pavlov //FIXME: template<template<typename T, int N> class TC = C12a> class C12 {};
30*a67a4d2fSSerge Pavlov //FIXME: template<template<typename T> class TC = C12a> class C13 {};
31*a67a4d2fSSerge Pavlov 
32*a67a4d2fSSerge Pavlov 
33*a67a4d2fSSerge Pavlov // Partial specializations
34*a67a4d2fSSerge Pavlov 
35*a67a4d2fSSerge Pavlov template<typename T, typename U> struct C20 {
36*a67a4d2fSSerge Pavlov     T a;
37*a67a4d2fSSerge Pavlov     U b;
38*a67a4d2fSSerge Pavlov };
39*a67a4d2fSSerge Pavlov template<typename T> struct C20<T, int> {
40*a67a4d2fSSerge Pavlov     T a;
41*a67a4d2fSSerge Pavlov };
42*a67a4d2fSSerge Pavlov 
43*a67a4d2fSSerge Pavlov template<int N, typename U> struct C21 {
44*a67a4d2fSSerge Pavlov     U a;
45*a67a4d2fSSerge Pavlov     U b[N];
46*a67a4d2fSSerge Pavlov };
47*a67a4d2fSSerge Pavlov template<int N> struct C21<N, int> {
48*a67a4d2fSSerge Pavlov     int a[N];
49*a67a4d2fSSerge Pavlov };
50*a67a4d2fSSerge Pavlov 
51*a67a4d2fSSerge Pavlov template<template<typename T2> class TC, typename U> struct C22 {
52*a67a4d2fSSerge Pavlov     TC<U> a;
53*a67a4d2fSSerge Pavlov     U b;
54*a67a4d2fSSerge Pavlov };
55*a67a4d2fSSerge Pavlov template<template<typename T2> class TC> struct C22<TC, int> {
56*a67a4d2fSSerge Pavlov     TC<int> a;
57*a67a4d2fSSerge Pavlov };
58*a67a4d2fSSerge Pavlov 
59*a67a4d2fSSerge Pavlov 
60*a67a4d2fSSerge Pavlov // Declaration only
61*a67a4d2fSSerge Pavlov template<typename T> class C30;
62*a67a4d2fSSerge Pavlov template<> class C30<long>;
63*a67a4d2fSSerge Pavlov template<> class C30<long*>;
64*a67a4d2fSSerge Pavlov extern C30<int> c30;
65