blob: 21de374f849203fdc909b53afad2d64e2e01f980 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <utility>
#include <zxtest/zxtest.h>
namespace {
enum Category { CAT_LVALUE, CAT_RVALUE };
int category(const int& arg) { return CAT_LVALUE; }
int category(int&& arg) { return CAT_RVALUE; }
template <typename T>
int passing(T&& t) {
return category(t);
}
template <typename T>
int moving(T&& t) {
return category(std::move(t));
}
template <typename T>
int forwarding(T&& t) {
return category(std::forward<T>(t));
}
template <typename T>
int forward_copy(T&& t) {
return category(std::forward<T&>(t));
}
struct A {
A(int&& n) : category(CAT_RVALUE) {}
A(int& n) : category(CAT_LVALUE) {}
int category;
};
template <typename T, typename U>
T make_object(U&& u) {
return T(std::forward<U>(u));
}
TEST(ForwardTest, MainTest) {
int val = 42;
int& ref = val;
const int& cref = val;
EXPECT_EQ(CAT_LVALUE, passing(42));
EXPECT_EQ(CAT_LVALUE, passing(val));
EXPECT_EQ(CAT_LVALUE, passing(ref));
EXPECT_EQ(CAT_LVALUE, passing(cref));
EXPECT_EQ(CAT_LVALUE, passing(val + 1));
EXPECT_EQ(CAT_RVALUE, moving(42));
EXPECT_EQ(CAT_RVALUE, moving(val));
EXPECT_EQ(CAT_RVALUE, moving(ref));
EXPECT_EQ(CAT_LVALUE, moving(cref));
EXPECT_EQ(CAT_RVALUE, moving(val + 1));
EXPECT_EQ(CAT_RVALUE, forwarding(42));
EXPECT_EQ(CAT_LVALUE, forwarding(val));
EXPECT_EQ(CAT_LVALUE, forwarding(ref));
EXPECT_EQ(CAT_LVALUE, forward_copy(cref));
EXPECT_EQ(CAT_RVALUE, forwarding(val + 1));
EXPECT_EQ(CAT_LVALUE, forward_copy(42));
EXPECT_EQ(CAT_LVALUE, forward_copy(val));
EXPECT_EQ(CAT_LVALUE, forward_copy(ref));
EXPECT_EQ(CAT_LVALUE, forward_copy(cref));
EXPECT_EQ(CAT_LVALUE, forward_copy(val + 1));
auto a1 = make_object<A>(42);
auto a2 = make_object<A>(val);
EXPECT_EQ(CAT_RVALUE, a1.category);
EXPECT_EQ(CAT_LVALUE, a2.category);
}
} // namespace