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

            Bug ID: 120836
           Summary: [16 regression] Including <concepts> hides
                    'satisfaction value ... changed' diagnostic
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m.cencora at gmail dot com
  Target Milestone: ---

Given code below:

#include <concepts>

template <typename T>
concept printable = requires (const T& a) { a.print(); };

struct foo
{
    static constexpr bool member1 = printable<foo>;
    bool member2 = printable<foo>;

    void print() const
    {

    }

    static constexpr bool member3 = printable<foo>;
};

int main()
{
    static_assert(!foo::member1);
    static_assert(foo{}.member2);
    static_assert(foo::member3);
    static_assert(printable<foo>);
}


When compiled on gcc-16 with -std=c++23 just prints:
<source>: In function 'int main()':
<source>:23:24: error: static assertion failed
   23 |     static_assert(foo::member3);
      |                   ~~~~~^~~~~~~
Compiler returned: 1

If I use -std=c++20 or compile with gcc-15 or remove '#include <concepts>' I
get much better diagnostics:

<source>: In function 'int main()':
<source>:22:25: error: static assertion failed
   22 |     static_assert(foo{}.member2);
      |                   ~~~~~~^~~~~~~
<source>:23:24: error: static assertion failed
   23 |     static_assert(foo::member3);
      |                   ~~~~~^~~~~~~
<source>:24:19: error: static assertion failed
   24 |     static_assert(printable<foo>);
      |                   ^~~~~~~~~~~~~~
<source>:24:19: note: constraints not satisfied
<source>:4:9:   required by the constraints of 'template<class T> concept
printable'
<source>:4:21:   in requirements with 'const T& a' [with T = foo]
<source>:4:21: error: satisfaction value of atomic constraint 'requires(const
T& a) {a->print();} [with T = foo]' changed from 'false' to 'true'
    4 | concept printable = requires (const T& a) { a.print(); };
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:8:37: note: satisfaction value first evaluated to 'false' from here
    8 |     static constexpr bool member1 = printable<foo>;
      |                                     ^~~~~~~~~~~~~~
Compiler returned: 1

Reply via email to