| // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
| |
| // A default template-argument may be specified for any kind of |
| // template-parameter that is not a template parameter pack. |
| template<typename ...Types = int> // expected-error{{template parameter pack cannot have a default argument}} |
| struct X0; |
| |
| template<int ...Values = 0> // expected-error{{template parameter pack cannot have a default argument}} |
| struct X1; |
| |
| template<typename T> struct vector; |
| |
| template<template<class> class ...Templates = vector> // expected-error{{template parameter pack cannot have a default argument}} |
| struct X2; |
| |
| struct X3 { |
| template<typename T = int> // expected-error{{default template argument not permitted on a friend template}} |
| friend void f0(X3); |
| |
| template<typename T = int> |
| friend void f1(X3) { |
| } |
| }; |
| |
| namespace PR8748 { |
| // Testcase 1 |
| struct A0 { template<typename U> struct B; }; |
| template<typename U = int> struct A0::B { }; |
| |
| // Testcase 2 |
| template<typename T> struct A1 { template<typename U> struct B; }; |
| 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}} |
| |
| // Testcase 3 |
| template<typename T> |
| struct X2 { |
| void f0(); |
| template<typename U> void f1(); |
| }; |
| |
| 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}} |
| 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}} |
| |
| namespace Inner { |
| template<typename T> struct X3; |
| template<typename T> void f2(); |
| } |
| |
| // Okay; not class members. |
| template<typename T = int> struct Inner::X3 { }; |
| template<typename T = int> void Inner::f2() {} |
| } |
| |
| namespace PR10069 { |
| template<typename T, T a, T b=0, T c=1> |
| T f(T x); |
| |
| void g() { |
| f<unsigned int, 0>(0); |
| } |
| } |