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)