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

            Bug ID: 105110
           Summary: NTTP type deduction fails when dependent of previous
                    NTTPs
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: j.galecki11 at gmail dot com
  Target Milestone: ---

Consider the following minimal example:
```
template <int>
struct S {};

template <auto>
struct V {};

template <int I, S<I> s>
void foo(V<s>) {}

void bar() {
    constexpr S<1> s;
    foo(V<s>{});
}
```
CE link for the reader's convenience: https://godbolt.org/z/1cYK9s1Ta

GCC fails to compile this (consistent across versions), complaining about
cv-qualifier mismatch, which seems wholly irrelevant. Clang compiles without
warnings.
The problem is that when instantiating a function parametrized with a NTTP, GCC
fails to deduce the type of the NTTP parameter based on the other function
parameters. This causes problems with passing around constexpr values, as shown
in the following second example: https://godbolt.org/z/3Tnjx1Wxb (again, Clang
compiles and executes as intended).

As I cannot quite figure out whether the standard requires the deduction
described above to be possible, I see 2 possibilities:
1) This is simply a bug in GCC.
2) GCC is correct in refusing to compile the provided examples (Clang is
wrong). In this case, the emitted error should probably better describe the
problem.

Reply via email to