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