Skip to content

[BUG] Initializer of parameterized statement parameter lowers to copy-initialization #527

Closed
@JohelEGP

Description

@JohelEGP

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions