diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CXX/drs/dr15xx.cpp | 56 | ||||
-rw-r--r-- | clang/test/SemaCXX/rval-references.cpp | 10 |
2 files changed, 58 insertions, 8 deletions
diff --git a/clang/test/CXX/drs/dr15xx.cpp b/clang/test/CXX/drs/dr15xx.cpp index 439823410af..5f85a196fd6 100644 --- a/clang/test/CXX/drs/dr15xx.cpp +++ b/clang/test/CXX/drs/dr15xx.cpp @@ -87,6 +87,62 @@ namespace std { } // std +namespace dr1579 { // dr1579: 3.9 +template<class T> +struct GenericMoveOnly { + GenericMoveOnly(); + template<class U> GenericMoveOnly(const GenericMoveOnly<U> &) = delete; // expected-note 5 {{marked deleted here}} + GenericMoveOnly(const int &) = delete; // expected-note 2 {{marked deleted here}} + template<class U> GenericMoveOnly(GenericMoveOnly<U> &&); + GenericMoveOnly(int &&); +}; + +GenericMoveOnly<float> DR1579_Eligible(GenericMoveOnly<char> CharMO) { + int i; + GenericMoveOnly<char> GMO; + + if (0) + return i; + else if (0) + return GMO; + else if (0) + return ((GMO)); + else + return CharMO; +} + +GenericMoveOnly<char> GlobalMO; + +GenericMoveOnly<float> DR1579_Ineligible(int &AnInt, + GenericMoveOnly<char> &CharMO) { + static GenericMoveOnly<char> StaticMove; + extern GenericMoveOnly<char> ExternMove; + + if (0) + return AnInt; // expected-error{{invokes a deleted function}} + else if (0) + return GlobalMO; // expected-error{{invokes a deleted function}} + else if (0) + return StaticMove; // expected-error{{invokes a deleted function}} + else if (0) + return ExternMove; // expected-error{{invokes a deleted function}} + else if (0) + return AnInt; // expected-error{{invokes a deleted function}} + else + return CharMO; // expected-error{{invokes a deleted function}} +} + +auto DR1579_lambda_valid = [](GenericMoveOnly<float> mo) -> + GenericMoveOnly<char> { + return mo; +}; + +auto DR1579_lambda_invalid = []() -> GenericMoveOnly<char> { + static GenericMoveOnly<float> mo; + return mo; // expected-error{{invokes a deleted function}} +}; +} // end namespace dr1579 + namespace dr1589 { // dr1589: 3.7 c++11 // Ambiguous ranking of list-initialization sequences diff --git a/clang/test/SemaCXX/rval-references.cpp b/clang/test/SemaCXX/rval-references.cpp index 9c79ad7b0b9..4c2050494b6 100644 --- a/clang/test/SemaCXX/rval-references.cpp +++ b/clang/test/SemaCXX/rval-references.cpp @@ -72,23 +72,17 @@ int&& should_not_warn(int&& i) { // But GCC 4.4 does // Test the return dance. This also tests IsReturnCopyElidable. struct MoveOnly { MoveOnly(); - MoveOnly(const MoveOnly&) = delete; // expected-note {{candidate constructor}} \ - // expected-note 3{{explicitly marked deleted here}} - MoveOnly(MoveOnly&&); // expected-note {{candidate constructor}} - MoveOnly(int&&); // expected-note {{candidate constructor}} + MoveOnly(const MoveOnly&) = delete; // expected-note 3{{explicitly marked deleted here}} }; MoveOnly gmo; MoveOnly returningNonEligible() { - int i; static MoveOnly mo; MoveOnly &r = mo; if (0) // Copy from global can't be elided return gmo; // expected-error {{call to deleted constructor}} else if (0) // Copy from local static can't be elided return mo; // expected-error {{call to deleted constructor}} - else if (0) // Copy from reference can't be elided + else // Copy from reference can't be elided return r; // expected-error {{call to deleted constructor}} - else // Construction from different type can't be elided - return i; // expected-error {{no viable conversion from returned value of type 'int' to function return type 'MoveOnly'}} } |