p4-0x.cpp revision fcab48b626b7ce43625958e857061d721a43a5bc
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> T &lvalue();
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> T &&xvalue();
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> T prvalue();
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)struct X0 {
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &f() &;
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  float &f() &&;
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  template<typename T> int &ft(T) &;
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template<typename T> float &ft(T) &&;
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef int &(*func_int_ref)();
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef float &(*func_float_ref)();
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  operator func_int_ref() &;
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  operator func_float_ref() &&;
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void g();
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int &operator+(const X0&) &;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &operator+(const X0&) &&;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  template<typename T> int &operator+(const T&) &;
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  template<typename T> float &operator+(const T&) &&;
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int &h() const&;
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float &h() &&;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int &h2() const&;
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &h2() const&&;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void X0::g() {
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir1 = f();
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir2 = X0::f();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void test_ref_qualifier_binding() {
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir1 = lvalue<X0>().f();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr1 = xvalue<X0>().f();
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  float &fr2 = prvalue<X0>().f();
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir2 = lvalue<X0>().ft(1);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr3 = xvalue<X0>().ft(2);
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &fr4 = prvalue<X0>().ft(3);
46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void test_ref_qualifier_binding_with_surrogates() {
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int &ir1 = lvalue<X0>()();
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &fr1 = xvalue<X0>()();
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &fr2 = prvalue<X0>()();
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void test_ref_qualifier_binding_operators() {
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int &ir1 = lvalue<X0>() + prvalue<X0>();
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &fr1 = xvalue<X0>() + prvalue<X0>();
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  float &fr2 = prvalue<X0>() + prvalue<X0>();
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir2 = lvalue<X0>() + 1;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr3 = xvalue<X0>() + 2;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr4 = prvalue<X0>() + 3;
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void test_ref_qualifier_overloading() {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int &ir1 = lvalue<X0>().h();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr1 = xvalue<X0>().h();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float &fr2 = prvalue<X0>().h();
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int &ir2 = lvalue<X0>().h2();
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float &fr3 = xvalue<X0>().h2();
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  float &fr4 = prvalue<X0>().h2();
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)