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