https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90971
Bug ID: 90971
Summary: Suboptimal diagnostic for is_same_v requirement for
std::array
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: b7.10110111 at gmail dot com
Target Milestone: ---
Consider the following code:
```
#include <array>
int main()
{
std::array arr={1.32,5,45.3463,4.674,-94.463,34.634};
}
```
GCC 9.1 (9.1.0-2ubuntu2~18.04) gives the following diagnostic with -std=c++17
option:
```
test.cpp: In function ‘int main()’:
test.cpp:5:53: error: class template argument deduction failed:
5 | std::array arr={1.32,5,45.3463,4.674,-94.463,34.634};
| ^
test.cpp:5:53: error: no matching function for call to ‘array(double, int,
double, double, double, double)’
In file included from test.cpp:1:
/usr/include/c++/9/array:244:5: note: candidate: ‘template<class _Tp, class ...
_Up> std::array(_Tp, _Up ...)-> std::array<typename
std::enable_if<(is_same_v<_Tp, _Up> && ...), _Tp>::type, (1 + sizeof...
(_Up))>’
244 | array(_Tp, _Up...)
| ^~~~~
/usr/include/c++/9/array:244:5: note: template argument
deduction/substitution failed:
/usr/include/c++/9/array: In substitution of ‘template<class _Tp, class ...
_Up> std::array(_Tp, _Up ...)-> std::array<typename
std::enable_if<(is_same_v<_Tp, _Up> && ...), _Tp>::type, (1 + sizeof... (_Up))>
[with _Tp = double; _Up = {int, double, double, double, double}]’:
test.cpp:5:53: required from here
/usr/include/c++/9/array:244:5: error: no type named ‘type’ in ‘struct
std::enable_if<false, double>’
```
This error message "error: no type named ‘type’ in ‘struct
std::enable_if<false, double>’" is not too useful. Yes, it is technically
correct, but compare it to what clang 6.0 (6.0.0-1ubuntu2) prints instead:
```
test.cpp:5:13: error: no viable constructor or deduction guide for deduction of
template arguments of 'array'
std::array arr={1.32,5,45.3463,4.674,-94.463,34.634};
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/array:244:5:
note: candidate template ignored: requirement 'is_same_v<double, int>' was not
satisfied [with _Tp = double,
_Up = <int, double, double, double, double>]
array(_Tp, _Up...)
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/array:94:12:
note: candidate function template not viable: requires 0 arguments, but 6 were
provided
struct array
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/array:94:12:
note: candidate function template not viable: requires 1 argument, but 6 were
provided
1 error generated.
```
Note this: "requirement 'is_same_v<double, int>' was not satisfied". It's much
better than what GCC says.