brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 9418596 Raw
86 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s2// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s3 4// Member function declarations with the same name and the same5// parameter-type-list as well as mem- ber function template6// declarations with the same name, the same parameter-type-list, and7// the same template parameter lists cannot be overloaded if any of8// them, but not all, have a ref-qualifier (8.3.5).9 10class Y { 11  void h() &; 12  void h() const &; 13  void h() &&; 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 '&'}}16 17  template<typename T> void f(T*) &;18  template<typename T> void f(T*) &&;19 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 '&'}}22 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}}25};26 27struct GH76358 {28    template<int> void f() && {}29    template<typename T> void f() const {}30};31 32 33#if __cplusplus >= 202002L34namespace GH58962 {35 36template<typename T>37__add_rvalue_reference(T) declval();38 39template<unsigned R>40struct type41{42    void func() requires (R == 0);43    void func() & requires (R == 1);44    void func() && requires (R == 2);45};46 47template<typename T>48concept test = requires { declval<T>().func(); };49 50static_assert(test<type<0>&>);51static_assert(test<type<0>&&>);52static_assert(test<type<1>&>);53static_assert(not test<type<1>&&>);54static_assert(not test<type<2>&>);55static_assert(test<type<2>&&>);56 57}58 59namespace GH78101 {60 61template<typename T, typename U, int i>62concept True = true;63 64template<typename T, int I>65struct Template {66    static constexpr int i = I;67    friend constexpr auto operator+(True<T, i> auto f) {68        return i;69    }70};71 72template<int I>73struct Template<float, I> {74    static constexpr int i = I;75    friend constexpr auto operator+(True<float, i> auto f) {76        return i;77    }78};79 80Template<void, 4> f{};81static_assert(+Template<float, 5>{} == 5);82 83}84 85#endif86