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