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

            Bug ID: 118543
           Summary: Previous forward declaration of enum causes early
                    instantiation of later definition
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: andre.brand at mailbox dot org
  Target Milestone: ---

See here on Compiler-Explorer: https://godbolt.org/z/PshPT968x


template <typename T>
struct S {
    static constexpr T f(int) { return 0; };

    // remove the opaque declaration and it will work
    enum class E : T;

    static constexpr T f(char) { return 1; };


    enum class E : T { X = f(T{}) };
};


static_assert((int)S<char>::E::X == 1); 


This causes:

static assertion failed
   13 | static_assert((int)S<char>::E::X == 1);
      |               ~~~~~~~~~~~~~~~~~~~^~~~
<source>:13:34: note: the comparison reduces to '(0 == 1)'

GCC seems to consider the overload set of f at the first declaration.
This is not the case for static constexpr data members of a nested class.

Reply via email to