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

            Bug ID: 121231
           Summary: [13->trunk] miscompile with brace-initialized constant
                    template parameter perhaps due to function coalescing
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gasper.azman at gmail dot com
  Target Milestone: ---

Came across this one today:
(godbolt: https://godbolt.org/z/G4vK3b59W)
```
#include <iostream>

struct Foo
{
    int a;
    int b;
};

constexpr Foo make_foo(bool x) {
    Foo result{};
    if (x) {
        result.a = 1;
    } else {
        result.b = 1;
    }
    return result;
}

template<Foo FOO>
void bar() {
    std::cout << FOO.a << " " << FOO.b << std::endl;
}

template<bool x>
void foo()
{
    constexpr Foo FOO = make_foo(x);
    std::cout << FOO.a << " " << FOO.b << std::endl;
    bar<FOO>();
}

void do_false() { // if you remove this function, the bug goes away
    foo<false>();
}

int main()
{
    foo<true>();
    return 0;
}
```
prints

Program returned: 0
1 0
0 1

despite the fact that /both/ `cout`s should print at least the same thing.

This is true at least on 13 and current godbolt trunk.

Note - if you remove `foo<false>()` the bug goes away (it's not invoked, even),
so I'm guessing it's some function cache folding/wrong comparison thing.

Thanks all,

G

Reply via email to