1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li // A default template-argument may be specified for any kind of 4*67e74705SXin Li // template-parameter that is not a template parameter pack. 5*67e74705SXin Li template<typename ...Types = int> // expected-error{{template parameter pack cannot have a default argument}} 6*67e74705SXin Li struct X0; 7*67e74705SXin Li 8*67e74705SXin Li template<int ...Values = 0> // expected-error{{template parameter pack cannot have a default argument}} 9*67e74705SXin Li struct X1; 10*67e74705SXin Li 11*67e74705SXin Li template<typename T> struct vector; 12*67e74705SXin Li 13*67e74705SXin Li template<template<class> class ...Templates = vector> // expected-error{{template parameter pack cannot have a default argument}} 14*67e74705SXin Li struct X2; 15*67e74705SXin Li 16*67e74705SXin Li struct X3 { 17*67e74705SXin Li template<typename T = int> // expected-error{{default template argument not permitted on a friend template}} 18*67e74705SXin Li friend void f0(X3); 19*67e74705SXin Li 20*67e74705SXin Li template<typename T = int> f1(X3)21*67e74705SXin Li friend void f1(X3) { 22*67e74705SXin Li } 23*67e74705SXin Li }; 24*67e74705SXin Li 25*67e74705SXin Li namespace PR8748 { 26*67e74705SXin Li // Testcase 1 27*67e74705SXin Li struct A0 { template<typename U> struct B; }; 28*67e74705SXin Li template<typename U = int> struct A0::B { }; 29*67e74705SXin Li 30*67e74705SXin Li // Testcase 2 31*67e74705SXin Li template<typename T> struct A1 { template<typename U> struct B; }; 32*67e74705SXin Li template<typename T> template<typename U = int> struct A1<T>::B { }; // expected-error{{cannot add a default template argument to the definition of a member of a class template}} 33*67e74705SXin Li 34*67e74705SXin Li // Testcase 3 35*67e74705SXin Li template<typename T> 36*67e74705SXin Li struct X2 { 37*67e74705SXin Li void f0(); 38*67e74705SXin Li template<typename U> void f1(); 39*67e74705SXin Li }; 40*67e74705SXin Li f0()41*67e74705SXin Li template<typename T = int> void X2<T>::f0() { } // expected-error{{cannot add a default template argument to the definition of a member of a class template}} f1()42*67e74705SXin Li template<typename T> template<typename U = int> void X2<T>::f1() { } // expected-error{{cannot add a default template argument to the definition of a member of a class template}} 43*67e74705SXin Li 44*67e74705SXin Li namespace Inner { 45*67e74705SXin Li template<typename T> struct X3; 46*67e74705SXin Li template<typename T> void f2(); 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li // Okay; not class members. 50*67e74705SXin Li template<typename T = int> struct Inner::X3 { }; f2()51*67e74705SXin Li template<typename T = int> void Inner::f2() {} 52*67e74705SXin Li } 53*67e74705SXin Li 54*67e74705SXin Li namespace PR10069 { 55*67e74705SXin Li template<typename T, T a, T b=0, T c=1> 56*67e74705SXin Li T f(T x); 57*67e74705SXin Li g()58*67e74705SXin Li void g() { 59*67e74705SXin Li f<unsigned int, 0>(0); 60*67e74705SXin Li } 61*67e74705SXin Li } 62