Issue 97532
Summary [c++11] clang allows questionable CTAD for template base of derived class with default argument
Labels clang
Assignees
Reporter Rush10233
    The following code is accepted by clang but rejected by GCC,MSVC and ICC with the option of `-std=c++11`:

```c++
template<typename,typename=int> struct Base { };

struct Derived : Base<void> { };

template<template<typename> class TT>
void func (TT<void>) { }

int main () {
  func (Derived { });
}
```
[https://timsong-cpp.github.io/cppwp/std11/temp.deduct.call#4](https://timsong-cpp.github.io/cppwp/std11/temp.deduct.call#4) says that "If P is a class and P has the form simple-template-id, then the transformed A can be a derived class of the deduced A." So the class `Derived` passed in line 9 can be deduced to its base type.

But the parameter requested by `func` is a template class with 1 argument, while class `Base` has 2(including 1 with default value), which seems incompatible.

It's interesting that gcc accepts that code under `-std=c++20`, but other compilers don't. It seems that  more standard docs need to be consulted.

[https://godbolt.org/z/G7fenEsYY](https://godbolt.org/z/G7fenEsYY)
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to