1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
27c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
37c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redltypedef int&& irr;
47c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redltypedef irr& ilr_c1; // Collapses to int&
57c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redltypedef int& ilr;
67c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redltypedef ilr&& ilr_c2; // Collapses to int&
77c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
87c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redlirr ret_irr() {
926e10bea3d2e9d2979194890e51b98ecea165a96Argyrios Kyrtzidis  return 0; // expected-warning {{returning reference to local temporary}}
107c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
117c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
127c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redlstruct not_int {};
137c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
147c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redlint over(int&);
157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redlnot_int over(int&&);
167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
172ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregorint over2(const int&);
182ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregornot_int over2(int&&);
192ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor
202ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregorstruct conv_to_not_int_rvalue {
212ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor  operator not_int &&();
222ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor};
232ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor
244680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redltypedef void (fun_type)();
254680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redlvoid fun();
264680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redlfun_type &&make_fun();
274680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl
287c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redlvoid f() {
297c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int &&virr1; // expected-error {{declaration of reference variable 'virr1' requires an initializer}}
307c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int &&virr2 = 0;
31fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor  int &&virr3 = virr2; // expected-error {{rvalue reference to type 'int' cannot bind to lvalue of type 'int'}}
327c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int i1 = 0;
33fb5d7efc279335bde2cdc0a73da525d6b28201e9Douglas Gregor  int &&virr4 = i1; // expected-error {{rvalue reference to type 'int' cannot bind to lvalue of type 'int'}}
347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int &&virr5 = ret_irr();
35157be839ade8312389b20d02a3d470c0487fd756Sebastian Redl  int &&virr6 = static_cast<int&&>(i1);
36157be839ade8312389b20d02a3d470c0487fd756Sebastian Redl  (void)static_cast<not_int&&>(i1); // expected-error {{types are not compatible}}
377c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
387c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int i2 = over(i1);
397c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  not_int ni1 = over(0);
407c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  int i3 = over(virr2);
417c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  not_int ni2 = over(ret_irr());
427c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
432ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor  int i4 = over2(i1);
44a98458054d9004ad414a8518057f8ce08f23ae70Sebastian Redl  not_int ni3 = over2(0);
452ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor
467c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  ilr_c1 vilr1 = i1;
477c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  ilr_c2 vilr2 = i1;
482ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor
492ff44784d180bb96953c22de4a0b2efb5d50263aDouglas Gregor  conv_to_not_int_rvalue cnir;
50b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  not_int &&ni4 = cnir;
517c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall  not_int &ni5 = cnir; // expected-error{{non-const lvalue reference to type 'not_int' cannot bind to a value of unrelated type 'conv_to_not_int_rvalue'}}
52a98458054d9004ad414a8518057f8ce08f23ae70Sebastian Redl  not_int &&ni6 = conv_to_not_int_rvalue();
53f2e21e5ad5e816d88e048c89dc775a9d4547c089Sebastian Redl
544680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl  fun_type &&fun_ref = fun; // works because functions are special
554680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl  fun_type &&fun_ref2 = make_fun(); // same
564680bf233caeebe89aa297eb5a25709dd15a4b11Sebastian Redl  fun_type &fun_lref = make_fun(); // also special
57f2e21e5ad5e816d88e048c89dc775a9d4547c089Sebastian Redl
58f2e21e5ad5e816d88e048c89dc775a9d4547c089Sebastian Redl  try {
59f2e21e5ad5e816d88e048c89dc775a9d4547c089Sebastian Redl  } catch(int&&) { // expected-error {{cannot catch exceptions by rvalue reference}}
60f2e21e5ad5e816d88e048c89dc775a9d4547c089Sebastian Redl  }
617c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
62e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl
63e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redlint&& should_warn(int i) {
64e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  // FIXME: The stack address return test doesn't reason about casts.
65e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  return static_cast<int&&>(i); // xpected-warning {{returning reference to temporary}}
66e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl}
67e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redlint&& should_not_warn(int&& i) { // But GCC 4.4 does
68e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  return static_cast<int&&>(i);
69e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl}
70e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl
71e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl
72e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl// Test the return dance. This also tests IsReturnCopyElidable.
73e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redlstruct MoveOnly {
74e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  MoveOnly();
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  MoveOnly(const MoveOnly&) = delete;	// expected-note 3{{explicitly marked deleted here}}
76e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl};
77e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl
78e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian RedlMoveOnly gmo;
79e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian RedlMoveOnly returningNonEligible() {
80e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  static MoveOnly mo;
81e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  MoveOnly &r = mo;
82e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  if (0) // Copy from global can't be elided
8318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor    return gmo; // expected-error {{call to deleted constructor}}
84e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl  else if (0) // Copy from local static can't be elided
8518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor    return mo; // expected-error {{call to deleted constructor}}
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  else // Copy from reference can't be elided
8718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor    return r; // expected-error {{call to deleted constructor}}
88e2b6833d445c7a4ce64f1816c05f176ba1740acaSebastian Redl}
89