Closed
Description
Title: 1 as std::string
errors.
Minimal reproducer (https://cpp2.godbolt.org/z/qdh9vWzod):
main: () = {
_ = 1 as std::string;
}
Commands:
cppfront main.cpp2
clang++18 -std=c++23 -stdlib=libc++ -lc++abi -pedantic-errors -Wall -Wextra -Wconversion -Werror=unused-result -I . main.cpp
Expected result: Program returned: 0
Actual result and error:
Cpp2 lowered to Cpp1:
//=== Cpp2 type declarations ====================================================
#include "cpp2util.h"
//=== Cpp2 type definitions and function declarations ===========================
auto main() -> int;
//=== Cpp2 function definitions =================================================
auto main() -> int{
static_cast<void>(cpp2::as_<std::string, 1>());
}
Output:
In file included from /app/build/main.cpp:6:
In file included from /app/cpp2util.h:1:
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1825:13: error: static assertion failed due to requirement 'program_violates_type_safety_guarantee<std::string, int>': No safe 'as' cast available - please check your cast
1825 | program_violates_type_safety_guarantee<C, CPP2_TYPEOF(x)>,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/main.cpp:18:27: note: in instantiation of function template specialization 'cpp2::as_<std::string, 1>' requested here
18 | static_cast<void>(cpp2::as_<std::string, 1>());
| ^
In file included from /app/build/main.cpp:6:
In file included from /app/cpp2util.h:1:
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1830:12: error: no matching function for call to 'as'
1830 | return as<C,x>();
| ^~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1104:23: note: candidate template ignored: constraints not satisfied [with C = std::string, x = 1]
1104 | inline constexpr auto as() -> auto
| ^
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1103:15: note: because 'std::is_arithmetic_v<std::string>' evaluated to false
1103 | requires (std::is_arithmetic_v<C> && std::is_arithmetic_v<CPP2_TYPEOF(x)>)
| ^
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1520:16: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1520 | constexpr auto as( X const& x ) -> decltype(auto)
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1474:16: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1474 | constexpr auto as( X const& x ) -> T
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1406:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1406 | auto as( std::variant<Ts...> const& x ) -> decltype(auto) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1381:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1381 | auto as( std::variant<Ts...> & x ) -> decltype(auto) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1356:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1356 | auto as( std::variant<Ts...> && x ) -> decltype(auto) {
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1213:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1213 | auto as( X x ) -> C {
| ^ ~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1202:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1202 | auto as( X const& x ) -> C const& {
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1196:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1196 | auto as( X& x ) -> C& {
| ^ ~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1190:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1190 | auto as( X const& x ) -> C const& {
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1184:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1184 | auto as( X& x ) -> C& {
| ^ ~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1166:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1166 | auto as( X const& x ) -> auto
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1158:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1158 | auto as(X const& x) -> C
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1152:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1152 | auto as( X& x ) -> decltype(auto) {
| ^ ~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1146:6: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1146 | auto as( X const& x ) -> decltype(auto) {
| ^ ~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1128:23: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1128 | inline constexpr auto as(auto const& x CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> auto
| ^ ~~~~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1114:23: note: candidate function template not viable: requires single argument 'x', but no arguments were provided
1114 | inline constexpr auto as(auto const& x) -> auto
| ^ ~~~~~~~~~~~~~
raw.githubusercontent.com/hsutter/cppfront/main/include/cpp2util.h:1098:6: note: candidate function template not viable: requires 1 argument, but 0 were provided
1098 | auto as(auto const&) -> auto {
| ^ ~~~~~~~~~~~
2 errors generated.