Reuse moved-from tint::Program variables

Currently, it's impossible to move a tint::Program instance into a
variables that has been moved. This CL fixes that.

Bug: tint:1105
Change-Id: Idc04cf2bb569d1cffc2c309117fc4615c41ac76a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/61640
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
Vasyl Teliman 2021-08-11 13:50:24 +00:00 committed by Tint LUCI CQ
parent 5085efb748
commit 9e3e54b932
2 changed files with 12 additions and 0 deletions

View File

@ -83,6 +83,7 @@ Program::~Program() = default;
Program& Program::operator=(Program&& program) { Program& Program::operator=(Program&& program) {
program.AssertNotMoved(); program.AssertNotMoved();
program.moved_ = true; program.moved_ = true;
moved_ = false;
id_ = std::move(program.id_); id_ = std::move(program.id_);
types_ = std::move(program.types_); types_ = std::move(program.types_);
ast_nodes_ = std::move(program.ast_nodes_); ast_nodes_ = std::move(program.ast_nodes_);

View File

@ -102,5 +102,16 @@ TEST_F(ProgramTest, DiagnosticsMove) {
EXPECT_EQ(program_b.Diagnostics().begin()->message, "an error message"); EXPECT_EQ(program_b.Diagnostics().begin()->message, "an error message");
} }
TEST_F(ProgramTest, ReuseMovedFromVariable) {
Program a(std::move(*this));
EXPECT_TRUE(a.IsValid());
Program b = std::move(a);
EXPECT_TRUE(b.IsValid());
a = std::move(b);
EXPECT_TRUE(a.IsValid());
}
} // namespace } // namespace
} // namespace tint } // namespace tint