cppfront icon indicating copy to clipboard operation
cppfront copied to clipboard

[BUG] int variable casted with as to size_t does not fail on compile time

Open filipsajdak opened this issue 6 months ago • 12 comments

In the current implementation of cppfront (065a993), the following code compiles and runs:

i : int = 123;
std::cout << (i as size_t) << std::endl;

produces

123

and should fail to compile with the following error:

cppfront/include/cpp2util.h:3382:9: error: static assertion failed due to requirement 'program_violates_type_safety_guarantee<unsigned long, int>': 'as' does not allow unsafe possibly-lossy narrowing conversions - if you're sure you want this, use 'unsafe_narrow<T>' to explicitly force the conversion and possibly lose information
        static_assert(
        ^
narrowing.cpp2:10:31: note: in instantiation of function template specialization 'cpp2::impl::as_<unsigned long, int>' requested here
    std::cout << (cpp2::impl::as_<size_t>(cpp2::move(i))) << std::endl;
                              ^
1 error generated.

A potential error will be caught in runtime, e.g., when the i is negative, the following error will be produced:

cppfront/include/cpp2util.h(2486) decltype(auto) cpp2::impl::as(auto &&, std::source_location) [C = unsigned long, x:auto = int]: Type safety violation: dynamic lossy narrowing conversion attempt detected
libc++abi: terminating

It will save us from the trouble... but a user should be informed to use cpp2::unsafe_narrow<size_t>(i) instead.

The bug is related to the badly defined is_narrowing_v - I have the patch already and will deliver it in next PR.

filipsajdak avatar Aug 23 '24 20:08 filipsajdak