1// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s 2// expected-no-diagnostics 3 4// Test default template arguments for function templates. 5template<typename T = int> 6void f0(); 7 8template<typename T> 9void f0(); 10 11void g0() { 12 f0(); // okay! 13} 14 15template<typename T, int N = T::value> 16int &f1(T); 17 18float &f1(...); 19 20struct HasValue { 21 static const int value = 17; 22}; 23 24void g1() { 25 float &fr = f1(15); 26 int &ir = f1(HasValue()); 27} 28 29namespace PR16689 { 30 template <typename T1, typename T2> class tuple { 31 public: 32 template <typename = T2> 33 constexpr tuple() {} 34 }; 35 template <class X, class... Y> struct a : public X { 36 using X::X; 37 }; 38 auto x = a<tuple<int, int> >(); 39} 40 41namespace PR16975 { 42 template <typename...> struct is { 43 constexpr operator bool() const { return false; } 44 }; 45 46 template <typename... Types> 47 struct bar { 48 template <typename T, 49 bool = is<Types...>()> 50 bar(T); 51 }; 52 53 struct baz : public bar<> { 54 using bar::bar; 55 }; 56 57 baz data{0}; 58} 59 60// rdar://23810407 61// An IRGen failure due to a symbol collision due to a default argument 62// being instantiated twice. Credit goes to Richard Smith for this 63// reduction to a -fsyntax-only failure. 64namespace rdar23810407 { 65 // Instantiating the default argument multiple times will produce two 66 // different lambda types and thus instantiate this function multiple 67 // times, which will produce conflicting extern variable declarations. 68 template<typename T> int f(T t) { 69 extern T rdar23810407_variable; 70 return 0; 71 } 72 template<typename T> int g(int a = f([] {})); 73 void test() { 74 g<int>(); 75 g<int>(); 76 } 77} 78 79// rdar://problem/24480205 80namespace PR13986 { 81 constexpr unsigned Dynamic = 0; 82 template <unsigned> class A { template <unsigned = Dynamic> void m_fn1(); }; 83 class Test { 84 ~Test() {} 85 A<1> m_target; 86 }; 87} 88