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