[Bug c++/45113] absent or confusing diagnostics of invalid template argument list in implicit template class instantiation
egallager at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Aug 18 09:29:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45113
Eric Gallager <egallager at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |diagnostic
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-08-17
CC| |egallager at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Eric Gallager <egallager at gcc dot gnu.org> ---
Redoing https://gcc.gnu.org/ml/gcc-bugs/2017-08/msg01665.html
Eric Gallager <egallager at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |diagnostic
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-08-14
CC| |egallager at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Eric Gallager <egallager at gcc dot gnu.org> ---
(In reply to Roman Kononov from comment #0)
> $cat test1.cpp
> template<typename X,typename Y> struct is_same { static bool const
> value=false; };
> template<typename X> struct is_same<X,X> { static bool const value=true; };
> template<typename... X> struct U {};
> struct Q { typedef U<int x,int y> C; };
> typedef char check[is_same<int,Q::C>::value ? 1 : -1];
>
> $g++ -std=gnu++0x -c test1.cpp && echo $?
> 0
>
> In 14.3.1, the Standard says: "A template-argument for a template-parameter
> which is a type shall be a type-id." The test must fail compilation, and
> Q::C can not be int.
This now fails with:
$ /usr/local/bin/g++ -c -std=gnu++0x 45113.cc
45113.cc:4:33: error: template argument 1 is invalid
struct Q { typedef U<int x,int y> C; };
^
$
>
> $cat test2.cpp
> template<typename... X> struct U {};
> typedef U<int x,int y> B;
>
> $g++ -std=gnu++0x -c test2.cpp
> test2.cpp:2:25: error: invalid type in declaration before ';' token
>
> This message is confusing.
This message is now:
$ /usr/local/bin/g++ -c -std=gnu++0x 45113_2.cc
45113_2.cc:2:22: error: template argument 1 is invalid
typedef U<int x,int y> B;
^
$
>
> $cat test3.cpp
> template<typename X,typename Y> struct U {};
> typedef U<int x,int y> A;
>
> $g++ -c test3.cpp
> test3.cpp:2:22: error: wrong number of template arguments (1, should be 2)
> test3.cpp:1:40: error: provided for 'template<class X, class Y> struct U'
> test3.cpp:2:25: error: invalid type in declaration before ';' token
>
> These messages are confusing.
This message is now:
$ /usr/local/bin/g++ -c -std=gnu++0x 45113_3.cc
45113_3.cc:2:22: error: wrong number of template arguments (1, should be 2)
typedef U<int x,int y> A;
^
45113_3.cc:1:40: note: provided for ‘template<class X, class Y> struct U’
template<typename X,typename Y> struct U {};
^
$
Which I guess is still kinda confusing. So test1.cpp and test2.cpp are fixed,
but confirming for test3.cpp.
More information about the Gcc-bugs
mailing list