https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117504

            Bug ID: 117504
           Summary: Incorrect code emitted when using "constexpr
                    std::array"
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: arnaud02 at users dot sourceforge.net
  Target Milestone: ---

Considering:

#include <algorithm>
#include <array>
#include <iostream>
#include <span>
#include <utility>

auto f(int const n) {
    using s_t = std::pair<int, int>;

#if defined(WITH_CONST)
    const
#else
    // gcc 14 emits incorrect code with "constexpr"
    constexpr
#endif
        std::array a_vec{s_t{1, 123}};

    auto const vec{[&a_vec]() -> std::span<s_t const> { return a_vec; }()};

    {
        auto const it = std::ranges::find_if(vec, [n](auto const& v) {
            std::cout << v.first << ", " << v.second << '\n';
            return n >= v.first;
        });
        if (it != std::ranges::end(vec)) {
            return it->second;
        }
    }
    return -1;
}

int main() {
    auto const r = f(1);
    std::cout << "Found=" << r << " expected=123\n";
}


Using g++ 14.2

>g++ -std=c++20 -O0 -DWITH_CONST ex.cpp
>./a.out
1, 123
Found=123 expected=123

But
>g++ -std=c++20 -O0 exp.cpp
>./a.out
-2120994312, 32766
Found=32766 expected=123

Using "constepxr std::array" instead of "const std::array" results in incorrect
code.


This can be reproduced with: https://godbolt.org/z/Ysoc59179
  • [Bug c++/117504] New: I... arnaud02 at users dot sourceforge.net via Gcc-bugs

Reply via email to