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

            Bug ID: 103678
           Summary: [concepts] Constrained partial specialization of
                    dependent template conflicts with unconstrained
                    partial specialization
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: matthewjbarichello at gmail dot com
  Target Milestone: ---

Reduced example:

  template<typename>
  struct A {
   template<typename...>
   struct B;
  };

  template<typename A_t>
  template<typename B_t>
  struct A<A_t>::B<B_t> {};

  template<typename A_t>
  template<typename B_t>
  requires requires {
   typename B_t;
  }
  struct A<A_t>::B<B_t> {};

Cmdline:

  g++ -std=c++20 example.cpp

Expected behaviour:
Example compiles. The partial specialization defined on line 16 should be a
distinct partial specialization as it is more constrained than the base
template and the partial specialization on line 9.

Actual behaviour:
Example does not compile and compiler emits the following diagnostic:

  <source>:16:16: error: redefinition of 'struct A< <template-parameter-1-1>
>::B<B_t>'
     16 | struct A<A_t>::B<B_t> {};
        |                ^~~~~~
  <source>:9:16: note: previous definition of 'struct A<
<template-parameter-1-1> >::B<B_t>'
      9 | struct A<A_t>::B<B_t> {};
        |                ^~~~~~

Affected versions:
GCC 10 through 12.

Notes:
 - Compiles fine on Clang and MSVC.
 - Only seems to happen for partially specialized dependent templates, as the
following code compiles without an error:
    template<typename...>
    struct A;

    template<typename A_t>
    struct A<A_t> {};

    template<typename A_t>
    requires requires {
     typename A_t;
    }
    struct A<A_t> {};
  • [Bug c++/103678] New: [co... matthewjbarichello at gmail dot com via Gcc-bugs

Reply via email to