Closed
Description
Title: Implicit move on non-last use.
Minimal reproducer (https://cpp2.godbolt.org/z/z1nWesaaa):
main: () = {
x := 0;
if true { _ = x; }
{
{ _ = x; }
_ = x;
}
}
Commands:
cppfront main.cpp2
clang++18 -std=c++23 -stdlib=libc++ -lc++abi -pedantic-errors -Wall -Wextra -Wconversion -Werror=unused-result -Werror=unused-value -Werror=unused-parameter -Werror=unused-variable -I . main.cpp
Expected result:
{static_cast<void>(x); }
static_cast<void>(std::move(x));
Actual result and error:
{static_cast<void>(std::move(x)); }
static_cast<void>(std::move(x));
Cpp2 lowered to Cpp1:
//=== Cpp2 type declarations ====================================================
#include "cpp2util.h"
#line 1 "/app/example.cpp2"
//=== Cpp2 type definitions and function declarations ===========================
#line 1 "/app/example.cpp2"
auto main() -> int;
//=== Cpp2 function definitions =================================================
#line 1 "/app/example.cpp2"
auto main() -> int{
#line 2 "/app/example.cpp2"
auto x {0};
if (true) {static_cast<void>(x); }
{
{static_cast<void>(std::move(x)); }
static_cast<void>(std::move(x));
}
}
Program returned: 0
See also: