diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2016-06-30 23:09:13 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2016-06-30 23:09:13 +0000 |
commit | fc235eb7800d83af723770e244207530202a44d0 (patch) | |
tree | bf089c7306a069a87eb47f8e0b432b0ad636a044 /clang/test/CXX/drs/dr15xx.cpp | |
parent | 0490cdeb33a68a0036bb2e62c501fd8f943a7f92 (diff) | |
download | bcm5719-llvm-fc235eb7800d83af723770e244207530202a44d0.tar.gz bcm5719-llvm-fc235eb7800d83af723770e244207530202a44d0.zip |
[Sema] Implement C++14's DR1579: Prefer returning by converting move constructor
Fixes PR28096.
Differential Revision: http://reviews.llvm.org/D21619
llvm-svn: 274291
Diffstat (limited to 'clang/test/CXX/drs/dr15xx.cpp')
-rw-r--r-- | clang/test/CXX/drs/dr15xx.cpp | 56 |
1 files changed, 56 insertions, 0 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 |