18aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
28aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor
38aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor// Template type parameters.
48aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortypedef unsigned char T;
58aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<typename T = T> struct X0 { };
68aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<> struct X0<unsigned char> { static const bool value = true; };
78aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregorint array0[X0<>::value? 1 : -1];
88aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor
98aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor// Non-type template parameters.
108aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregorconst int N = 17;
118aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<int N = N> struct X1 { };
128aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<> struct X1<17> { static const bool value = true; };
138aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregorint array1[X1<>::value? 1 : -1];
148aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor
158aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregor// Template template parameters.
168aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<template<class> class X0 = X0> struct X2 { };
178aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregortemplate<> struct X2<X0> { static const bool value = true; };
188aaa4001ced16ca10ea62c402b766a935899cdbbDouglas Gregorint array2[X2<>::value? 1 : -1];
19