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

            Bug ID: 118264
           Summary: GCC allows declaring constexpr template constructor in
                    derived type with virtual base
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wangbopku15 at gmail dot com
  Target Milestone: ---

The following code does not trigger any error in GCC:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

struct single
{
};

struct derived : virtual single
{
    template <typename Arg>
    constexpr derived(Arg arg){} 
};

auto obj = derived{1};

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Note that a normal ctor without template can be correctly rejected.

MSVC, EDG, and Clang reject it by giving diagnostics like:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<source>:9:15: error: constexpr constructor not allowed in struct with virtual
base class
    9 |     constexpr derived(Arg arg){} 
      |               ^
<source>:6:18: note: virtual base class declared here
    6 | struct derived : virtual single
      |                  ^~~~~~~~~~~~~~
<source>:12:12: error: no matching constructor for initialization of 'derived'
   12 | auto obj = derived{1};
      |            ^      ~~~
<source>:6:8: note: candidate constructor (the implicit copy constructor) not
viable: no known conversion from 'int' to 'const derived' for 1st argument
    6 | struct derived : virtual single
      |        ^~~~~~~
<source>:6:8: note: candidate constructor (the implicit move constructor) not
viable: no known conversion from 'int' to 'derived' for 1st argument
    6 | struct derived : virtual single
      |        ^~~~~~~
2 errors generated.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Please see https://godbolt.org/z/bYaeEYE3a

Reply via email to