Issue 53114
Summary template<typename T> must be the same as template<typename T, typename... Rest> if Rest... is empty
Labels new issue
Assignees
Reporter Fedr
    This valid code:
```
template<typename Derived>
struct Base;

template<template<typename, typename...> class DerivedType, typename T, typename... Rest >
struct Base<DerivedType<T, Rest...>> {
    Base() = default;
    template<typename T2, typename... Rest2>
    Base(const Base<DerivedType<T2, Rest2...>>&)  {}
};

template<typename T>
struct Child : Base<Child<T>> {
    using MyBase = Base<Child<T>>;
    Child() = default;    
    template<typename T2>
    Child(const Child<T2>& other) : MyBase(other) {}
};

int main() {
    Child<int> cti;
    [[maybe_unused]] Child<float> ctf = cti;
}
```
is accepted by GCC, while Clang prints the error:
```
error: too many template arguments for class template 'Child'
    Base(const Base<DerivedType<T2, Rest2...>>&)  {}
```
Demo: https://gcc.godbolt.org/z/K55rWcM8e

Related discussion: https://stackoverflow.com/q/59306119/7325599
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to