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