1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -std=c++14 -verify %s
3 // RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s
4 // expected-no-diagnostics
6 // Test default template arguments for function templates.
7 template<typename T
= int>
17 template<typename T
, int N
= T::value
>
23 static const int value
= 17;
28 int &ir
= f1(HasValue());
32 template <typename T1
, typename T2
> class tuple
{
34 template <typename
= T2
>
37 template <class X
, class... Y
> struct a
: public X
{
40 auto x
= a
<tuple
<int, int> >();
44 template <typename
...> struct is
{
45 constexpr operator bool() const { return false; }
48 template <typename
... Types
>
51 bool = is
<Types
...>()>
57 struct baz
: public bar
<> {
65 // An IRGen failure due to a symbol collision due to a default argument
66 // being instantiated twice. Credit goes to Richard Smith for this
67 // reduction to a -fsyntax-only failure.
68 namespace rdar23810407
{
69 // Instantiating the default argument multiple times will produce two
70 // different lambda types and thus instantiate this function multiple
71 // times, which will produce conflicting extern variable declarations.
72 template<typename T
> int f(T t
) {
73 extern T rdar23810407_variable
;
76 template<typename T
> int g(int a
= f([] {}));
83 // rdar://problem/24480205
85 constexpr unsigned Dynamic
= 0;
86 template <unsigned> class A
{ template <unsigned = Dynamic
> void m_fn1(); };
93 // rdar://problem/34167492
94 // Template B is instantiated during checking if defaulted A copy constructor
95 // is constexpr. For this we check if S<int> copy constructor is constexpr. And
96 // for this we check S constructor template with default argument that mentions
97 // template B. In turn, template instantiation triggers checking defaulted
98 // members exception spec. The problem is that it checks defaulted members not
99 // for instantiated class only, but all defaulted members so far. In this case
100 // we try to check exception spec for A default constructor which requires
101 // initializer for the field _a. But initializers are added after constexpr
102 // check so we reject the code because cannot find _a initializer.
103 namespace rdar34167492
{
104 template <typename T
> struct B
{ using type
= bool; };
106 template <typename T
> struct S
{
109 template <typename U
, typename B
<U
>::type
= true>
110 S(const S
<U
>&) noexcept
;
114 A() noexcept
= default;
115 A(const A
&) noexcept
= default;
120 namespace use_of_earlier_param
{
121 template<typename T
> void f(T a
, int = decltype(a
)());
125 #if __cplusplus >= 201402L
127 // Verify that a default argument in a lambda can refer to the type of a
128 // previous `auto` argument without crashing.
131 (void) [](auto c
, int x
= sizeof(decltype(c
))) {};
137 #if __cplusplus >= 202002L
138 // PR46648: ensure we don't reject this by triggering default argument
139 // instantiation spuriously.
140 auto x
= []<typename T
>(T x
= 123) {};
141 void y() { x(nullptr); }
143 template<int A
> struct X
{
144 template<int B
> constexpr int f() {
145 auto l
= []<int C
>(int n
= A
+ B
+ C
) { return n
; };
146 return l
.template operator()<3>();
149 static_assert(X
<100>().f
<20>() == 123);
151 template<> template<int B
> constexpr int X
<200>::f() {
152 auto l
= []<int C
>(int n
= 300 + B
+ C
) { return n
; };
153 return l
.template operator()<1>();
155 static_assert(X
<200>().f
<20>() == 321);
157 template<> template<> constexpr int X
<300>::f
<20>() {
158 auto l
= []<int C
>(int n
= 450 + C
) { return n
; };
159 return l
.template operator()<6>();
161 static_assert(X
<300>().f
<20>() == 456);
163 } // namespace lambda