1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2 // RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
4 // Member function declarations with the same name and the same
5 // parameter-type-list as well as mem- ber function template
6 // declarations with the same name, the same parameter-type-list, and
7 // the same template parameter lists cannot be overloaded if any of
8 // them, but not all, have a ref-qualifier (8.3.5).
14 void i() &; // expected-note{{previous declaration}}
15 void i() const; // expected-error{{cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&'}}
17 template<typename T
> void f(T
*) &;
18 template<typename T
> void f(T
*) &&;
20 template<typename T
> void g(T
*) &; // expected-note{{previous declaration}}
21 template<typename T
> void g(T
*); // expected-error{{cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&'}}
23 void k(); // expected-note{{previous declaration}}
24 void k() &&; // expected-error{{cannot overload a member function with ref-qualifier '&&' with a member function without a ref-qualifier}}
28 template<int> void f() && {}
29 template<typename T
> void f() const {}
33 #if __cplusplus >= 202002L
37 __add_rvalue_reference(T
) declval();
42 void func() requires (R
== 0);
43 void func() & requires (R
== 1);
44 void func() && requires (R
== 2);
48 concept test
= requires
{ declval
<T
>().func(); };
50 static_assert(test
<type
<0>&>);
51 static_assert(test
<type
<0>&&>);
52 static_assert(test
<type
<1>&>);
53 static_assert(not test
<type
<1>&&>);
54 static_assert(not test
<type
<2>&>);
55 static_assert(test
<type
<2>&&>);
61 template<typename T
, typename U
, int i
>
64 template<typename T
, int I
>
66 static constexpr int i
= I
;
67 friend constexpr auto operator+(True
<T
, i
> auto f
) {
73 struct Template
<float, I
> {
74 static constexpr int i
= I
;
75 friend constexpr auto operator+(True
<float, i
> auto f
) {
80 Template
<void, 4> f
{};
81 static_assert(+Template
<float, 5>{} == 5);