Commit 19a3bbce authored by Piotr Nycz's avatar Piotr Nycz
Browse files

Added tests verifying that temporaries are accepted by ReturnRef

Issue no 2527
parent b11fb80e
......@@ -646,6 +646,30 @@ TEST(ReturnRefTest, IsCovariant) {
EXPECT_EQ(&derived, &a.Perform(std::make_tuple()));
}
namespace
{
template <typename T, typename = decltype(ReturnRef(std::declval<T&&>()))>
bool CanCallReturnRef(T&&) { return true; }
bool CanCallReturnRef(Unused) { return false; }
}
// Tests that ReturnRef(v) is not working with temporaries (T&&)
TEST(ReturnRefTest, WillNotAcceptTemporaryAkaRValueRef) {
int value = 13;
EXPECT_TRUE(CanCallReturnRef(value));
EXPECT_FALSE(CanCallReturnRef(std::move(value)));
EXPECT_FALSE(CanCallReturnRef(value + 1));
EXPECT_FALSE(CanCallReturnRef(123));
}
// Tests that ReturnRef(v) is not working with const temporaries (const T&&)
TEST(ReturnRefTest, WillNotAcceptConstTemporaryAkaContRValueRef) {
const int value = 42;
EXPECT_TRUE(CanCallReturnRef(value));
EXPECT_FALSE(CanCallReturnRef(std::move(value)));
}
// Tests that ReturnRefOfCopy(v) works for reference types.
TEST(ReturnRefOfCopyTest, WorksForReference) {
int n = 42;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment