cppfront icon indicating copy to clipboard operation
cppfront copied to clipboard

[BUG] `Wshorten-64-to-32` clang warning when using range `0 ..< vector.size()`

Open bluetarpmedia opened this issue 5 months ago • 2 comments

Describe the bug Clang produces a Wshorten-64-to-32 warning with a cpp2::range when it is initialised with an integer literal as the first member and an expression producing a size_t/size_type as the second member.

To Reproduce Run cppfront on the following code and then compile with clang with -Wconversion:

main: () = {
    v: std::vector = (11, 22, 33);

    for 0 ..< v.size() do (i) {    // Warning
        v[i]++;
    }
    std::println("v: {}", v);

    for 0uz ..< v.size() do (i) {  // No warning with `uz`
        v[i]++;
    }
    std::println("v: {}", v);
}

The warning is:

warning: implicit conversion loses integer precision: 'size_type' (aka 'unsigned long') to 'const std::type_identity_t<int>' (aka 'const int') [-Wshorten-64-to-32]

Repro on Godbolt

This is because the cpp2::range constructor deduces the type from only the first parameter:

range(
    T const&                       f,
    std::type_identity_t<T> const& l,
    bool                           include_last = false
)

bluetarpmedia avatar Sep 03 '24 04:09 bluetarpmedia