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