15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void f0() &; // expected-error {{non-member function cannot have '&' qualifier}} 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void f1() &&; // expected-error {{non-member function cannot have '&&' qualifier}} 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void f2() const volatile &&; // expected-error {{non-member function cannot have 'const volatile &&' qualifier}} 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct X { 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void f0() &; 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void f1() &&; 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void f2() &; // expected-error{{static member function cannot have '&' qualifier}} 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static void f3() &&; // expected-error{{static member function cannot have '&&' qualifier}} 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef void func_type_lvalue() &; 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef void func_type_rvalue() &&; 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef func_type_lvalue *func_type_lvalue_ptr; // expected-error{{pointer to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef func_type_rvalue *func_type_rvalue_ptr; // expected-error{{pointer to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef func_type_lvalue &func_type_lvalue_ref; // expected-error{{reference to function type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef func_type_rvalue &func_type_rvalue_ref; // expected-error{{reference to function type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)template<typename T = func_type_lvalue> struct wrap { 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef T val; 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef T *ptr; // expected-error-re 2{{pointer to function type '{{.*}}' cannot have '{{&|&&}}' qualifier}} 2651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) typedef T &ref; // expected-error-re 2{{reference to function type '{{.*}}' cannot have '{{&|&&}}' qualifier}} 27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}; 2806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 2906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)using func_type_lvalue = wrap<>::val; // expected-note{{in instantiation of}} 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)using func_type_lvalue = wrap<func_type_lvalue>::val; 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)using func_type_rvalue = wrap<func_type_rvalue>::val; // expected-note{{in instantiation of}} 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochusing func_type_lvalue_ptr = wrap<>::ptr; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using func_type_lvalue_ptr = wrap<func_type_lvalue>::ptr; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using func_type_rvalue_ptr = wrap<func_type_rvalue>::ptr; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using func_type_lvalue_ref = wrap<>::ref; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using func_type_lvalue_ref = wrap<func_type_lvalue>::ref; 39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)using func_type_rvalue_ref = wrap<func_type_rvalue>::ref; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)func_type_lvalue f2; // expected-error{{non-member function of type 'func_type_lvalue' (aka 'void () &') cannot have '&' qualifier}} 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)func_type_rvalue f3; // expected-error{{non-member function of type 'func_type_rvalue' (aka 'void () &&') cannot have '&&' qualifier}} 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct Y { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) func_type_lvalue f0; 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) func_type_rvalue f1; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void (X::*mpf1)() & = &X::f0; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void (X::*mpf2)() && = &X::f1; 51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void (f() &&); // expected-error{{non-member function cannot have '&&' qualifier}} 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: These are ill-formed. 5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template<typename T> struct pass { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void f(T); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)pass<func_type_lvalue> pass0; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)pass<func_type_lvalue> pass1; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)