// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++1z -fsyntax-only -verify %s void f0() &; // expected-error {{non-member function cannot have '&' qualifier}} void f1() &&; // expected-error {{non-member function cannot have '&&' qualifier}} void f2() const volatile &&; // expected-error {{non-member function cannot have 'const volatile &&' qualifier}} struct X { void f0() &; void f1() &&; static void f2() &; // expected-error{{static member function cannot have '&' qualifier}} static void f3() &&; // expected-error{{static member function cannot have '&&' qualifier}} }; typedef void func_type_lvalue() &; typedef void func_type_rvalue() &&; typedef func_type_lvalue *func_type_lvalue_ptr; // expected-error{{pointer to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} typedef func_type_rvalue *func_type_rvalue_ptr; // expected-error{{pointer to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} typedef func_type_lvalue &func_type_lvalue_ref; // expected-error{{reference to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} typedef func_type_rvalue &func_type_rvalue_ref; // expected-error{{reference to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} template struct wrap { typedef T val; typedef T *ptr; // expected-error-re 2{{pointer to function type '{{.*}}' cannot have '{{&|&&}}' qualifier}} typedef T &ref; // expected-error-re 2{{reference to function type '{{.*}}' cannot have '{{&|&&}}' qualifier}} }; using func_type_lvalue = wrap<>::val; // expected-note{{in instantiation of}} using func_type_lvalue = wrap::val; using func_type_rvalue = wrap::val; // expected-note{{in instantiation of}} using func_type_lvalue_ptr = wrap<>::ptr; using func_type_lvalue_ptr = wrap::ptr; using func_type_rvalue_ptr = wrap::ptr; using func_type_lvalue_ref = wrap<>::ref; using func_type_lvalue_ref = wrap::ref; using func_type_rvalue_ref = wrap::ref; func_type_lvalue f2; // expected-error{{non-member function of type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} func_type_rvalue f3; // expected-error{{non-member function of type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} struct Y { func_type_lvalue f0; func_type_rvalue f1; }; void (X::*mpf1)() & = &X::f0; void (X::*mpf2)() && = &X::f1; void (f() &&); // expected-error{{non-member function cannot have '&&' qualifier}} // FIXME: These are ill-formed. template struct pass { void f(T); }; pass pass0; pass pass1; template struct is_same { static const bool value = false; }; template struct is_same { static const bool value = true; }; constexpr bool cxx1z = __cplusplus > 201402L; void noexcept_true() noexcept(true); void noexcept_false() noexcept(false); using func_type_noexcept_true = wrap; using func_type_noexcept_false = wrap; static_assert(is_same::value == !cxx1z, ""); static_assert(is_same::value == !cxx1z, ""); static_assert(is_same::value == !cxx1z, ""); static_assert(is_same::value == !cxx1z, "");