p6-0x.cpp revision d37b360bf9f954af119c9805fdc79ab9d30e06c6
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3void f0() &; // expected-error {{non-member function cannot have '&' qualifier}} 4void f1() &&; // expected-error {{non-member function cannot have '&&' qualifier}} 5void f2() const volatile &&; // expected-error {{non-member function cannot have 'const volatile &&' qualifier}} 6 7struct X { 8 void f0() &; 9 void f1() &&; 10 static void f2() &; // expected-error{{static member function cannot have '&' qualifier}} 11 static void f3() &&; // expected-error{{static member function cannot have '&&' qualifier}} 12}; 13 14typedef void func_type_lvalue() &; 15typedef void func_type_rvalue() &&; 16 17typedef func_type_lvalue *func_type_lvalue_ptr; // expected-error{{pointer to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 18typedef func_type_rvalue *func_type_rvalue_ptr; // expected-error{{pointer to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 19 20typedef func_type_lvalue &func_type_lvalue_ref; // expected-error{{reference to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 21typedef func_type_rvalue &func_type_rvalue_ref; // expected-error{{reference to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 22 23template<typename T = func_type_lvalue> struct wrap { 24 typedef T val; 25 typedef T *ptr; 26 typedef T &ref; 27}; 28 29using func_type_lvalue = wrap<>::val; 30using func_type_lvalue = wrap<func_type_lvalue>::val; 31using func_type_rvalue = wrap<func_type_rvalue>::val; 32 33using func_type_lvalue_ptr = wrap<>::ptr; 34using func_type_lvalue_ptr = wrap<func_type_lvalue>::ptr; 35using func_type_rvalue_ptr = wrap<func_type_rvalue>::ptr; 36 37using func_type_lvalue_ref = wrap<>::ref; 38using func_type_lvalue_ref = wrap<func_type_lvalue>::ref; 39using func_type_rvalue_ref = wrap<func_type_rvalue>::ref; 40 41func_type_lvalue f2; // expected-error{{non-member function of type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 42func_type_rvalue f3; // expected-error{{non-member function of type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 43 44struct Y { 45 func_type_lvalue f0; 46 func_type_rvalue f1; 47}; 48 49void (X::*mpf1)() & = &X::f0; 50void (X::*mpf2)() && = &X::f1; 51 52 53void (f() &&); // expected-error{{non-member function cannot have '&&' qualifier}} 54