This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/83249] New: C++11 Parameter pack deduced incorrectly in decltype return declaration
- From: "russ at yanofsky dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 01 Dec 2017 19:50:22 +0000
- Subject: [Bug c++/83249] New: C++11 Parameter pack deduced incorrectly in decltype return declaration
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83249
Bug ID: 83249
Summary: C++11 Parameter pack deduced incorrectly in decltype
return declaration
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: russ at yanofsky dot org
Target Milestone: ---
Following code fails to compile with gcc 7.2.0 and versions back to 5.4.0. It
does successfully compile with clang.
What appears to happen is that arguments to S::g(P1... p1, P2... p2)
incorrectly become part of the "p1" parameter pack instead of "p2" parameter
pack. This only seems to happen when p1 is referenced inside a decltype return
type declaration. When "p1" and "p2" are referenced inside the actual function
body they are assigned correctly.
////////////////////////////////////////////////////////////////////
void f();
template <typename... P1>
struct S
{
template <typename... P2>
auto g(P1... p1, P2... p2) -> decltype(f(p1...));
};
void test() {
S<>().g(1, 2);
}
////////////////////////////////////////////////////////////////////
Command line and error output:
g++ -c -std=c++11 main.cpp
<source>: In function 'void test()':
11 : <source>:11:17: error: no matching function for call to 'S<>::g(int, int)'
S<>().g(1, 2);
^
7 : <source>:7:10: note: candidate: template<class ... P2> decltype (f(S::g::p1
...)) S<P1>::g(P1 ..., P2 ...) [with P2 = {P2 ...}; P1 = {}]
auto g(P1... p1, P2... p2) -> decltype(f(p1...));
^
7 : <source>:7:10: note: template argument deduction/substitution failed:
<source>: In substitution of 'template<class ... P2> decltype (f(S::g::p2 ...))
S<>::g<P2 ...>(P2 ...) [with P2 = {int, int}]':
11 : <source>:11:17: required from here
7 : <source>:7:45: error: too many arguments to function 'void f()'
auto g(P1... p1, P2... p2) -> decltype(f(p1...));
~^~~~~~~
1 : <source>:1:6: note: declared here
void f();
^
Compiler exited with result code 1
////////////////////////////////////////////////////////////////////
Tested with:
g++ (GCC-Explorer-Build) 7.2.0 https://godbolt.org/g/ma8oNz
g++ (Gentoo Hardened 6.4.0 p1.1) 6.4.0
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
g++-6 (Ubuntu/Linaro 6.3.0-18ubuntu2~16.04) 6.3.0 20170519