Open
Description
Title: Use cpp2::in
for non-deducible parameters.
Description:
Currently, Cppfront doesn't wrap in cpp2::in
a template function
that has the type of one of
to avoid making it non-deducible.
However, it also does the same
when a similar use of
makes the function parameter non-deducible.
If a function parameter is already non-deducible,
its type should be wrapped in cpp2::in
.
Minimal reproducer (https://cpp2.godbolt.org/z/jjxTWfcfq):
f: <T> (x: std::integral_constant<i32, T::value>) = { }
main: () = { }
Commands:
cppfront main.cpp2
clang++17 -std=c++23 -stdlib=libc++ -lc++abi -pedantic-errors -Wall -Wextra -Wconversion -I . main.cpp
Expected result:
template<typename T> auto f(cpp2::in<std::integral_constant<cpp2::i32,T::value>> x) -> void{}
Actual result and error:
template<typename T> auto f(std::integral_constant<cpp2::i32,T::value> const& x) -> void{}
Cpp2 lowered to Cpp1:
//=== Cpp2 type declarations ====================================================
#include "cpp2util.h"
//=== Cpp2 type definitions and function declarations ===========================
template<typename T> auto f(std::integral_constant<cpp2::i32,T::value> const& x) -> void;
auto main() -> int;
//=== Cpp2 function definitions =================================================
template<typename T> auto f(std::integral_constant<cpp2::i32,T::value> const& x) -> void{}
auto main() -> int{}
Program returned: 0