https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71527
Bug ID: 71527
Summary: wrong type mismatch while template argument
deduction/substitution
Product: gcc
Version: 6.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: benni.buch at gmail dot com
Target Milestone: ---
//==================== Example ==================
// Convert C-String to int
template < int N >
constexpr int parse_int(char const(&arr)[N])noexcept{
int number = 0;
int base = 1;
for(int i = 0; i < N; ++i){
number += (static_cast< int >(arr[N - 1 - i]) - 48) * base;
base *= 10;
}
return number;
}
// A compile time int-type
template < int I >
struct size{};
// Create a compile time int via user literals
template < char ... S >
constexpr auto operator"" _S()noexcept{
return size< parse_int< sizeof...(S) >({S ...}) >();
}
// The problem:
template < typename T, int N >
void f(size< N >, T(&&)[N]){}
int main(){
// OK: T is int
f(2_S, {0, 1});
// Bug: wrong type mismatch, T should be float
f< float >(2_S, {0, 1});
// OK: error conflicting types
/* f(2_S, {0, 1.f}); */
// Bug: wrong type mismatch, T should be float
f< float >(2_S, {0, 1.f});
}
//===============================================
clang compiles it well, GCC reports a type mismatch:
~$ g++ -o main -std=c++14 main.cpp
bug.cpp: In function ‘int main()’:
bug.cpp:34:24: error: no matching function for call to ‘f(size<2>,
<brace-enclosed initializer list>)’
f< float >(2_S, {0, 1});
^
bug.cpp:26:6: note: candidate: template<class T, int N> void f(size<N>, T
(&&)[N])
void f(size< N >, T(&&)[N]){}
^
bug.cpp:26:6: note: template argument deduction/substitution failed:
bug.cpp:34:24: note: mismatched types ‘float’ and ‘int’
f< float >(2_S, {0, 1});
^
bug.cpp:40:26: error: no matching function for call to ‘f(size<2>,
<brace-enclosed initializer list>)’
f< float >(2_S, {0, 1.f});
^
bug.cpp:26:6: note: candidate: template<class T, int N> void f(size<N>, T
(&&)[N])
void f(size< N >, T(&&)[N]){}
^
bug.cpp:26:6: note: template argument deduction/substitution failed:
bug.cpp:40:26: note: mismatched types ‘float’ and ‘int’
f< float >(2_S, {0, 1.f});