Closed
Description
Title: Initializer of parameterized statement parameter lowers to copy-initialization.
Minimal reproducer (https://cpp2.godbolt.org/z/9Mr3T8Pj9):
#include <chrono>
main: () = {
_: std::chrono::duration<i32> = 0;
(copy _: std::chrono::duration<i32> = 0) { }
_: std::in_place_t = ();
(copy _: std::in_place_t = ()) { }
}
Commands:
cppfront main.cpp2
clang++17 -std=c++23 -stdlib=libc++ -lc++abi -pedantic-errors -Wall -Wextra -Wconversion -I . main.cpp
Expected result:
To use direct-initialization, like a normal block-scope variable.
std::chrono::duration<cpp2::i32> _ {0};
std::in_place_t _ = {};
Actual result and error:
std::chrono::duration<cpp2::i32> _ = 0;
std::in_place_t _ = ;
Cpp2 lowered to Cpp1:
//=== Cpp2 type declarations ====================================================
#include "cpp2util.h"
//=== Cpp2 type definitions and function declarations ===========================
#include <chrono>
auto main() -> int;
//=== Cpp2 function definitions =================================================
auto main() -> int{
std::chrono::duration<cpp2::i32> auto_3_3 {0};
{
std::chrono::duration<cpp2::i32> _ = 0;
{}
}
std::in_place_t auto_5_3 {};
{
std::in_place_t _ = ;
{}
}
}
Output:
main.cpp2:5:34: error: no viable conversion from 'int' to 'std::chrono::duration<cpp2::i32>' (aka 'duration<int>')
5 | std::chrono::duration<cpp2::i32> _ = 0;
| ^ ~
/opt/compiler-explorer/clang-trunk-20230623/bin/../include/c++/v1/__chrono/duration.h:204:28: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const duration<int> &' for 1st argument
204 | class _LIBCPP_TEMPLATE_VIS duration
| ^
/opt/compiler-explorer/clang-trunk-20230623/bin/../include/c++/v1/__chrono/duration.h:204:28: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'duration<int> &&' for 1st argument
/opt/compiler-explorer/clang-trunk-20230623/bin/../include/c++/v1/__chrono/duration.h:267:9: note: candidate template ignored: could not match 'duration<_Rep2, _Period2>' against 'int'
267 | duration(const duration<_Rep2, _Period2>& __d,
| ^
/opt/compiler-explorer/clang-trunk-20230623/bin/../include/c++/v1/__chrono/duration.h:255:18: note: explicit constructor is not a candidate
255 | explicit duration(const _Rep2& __r,
| ^
main.cpp2:7:21: error: expected expression
7 | std::in_place_t _ = ;
| ^
2 errors generated.