PR c++/50080 (again)

/cp
2012-10-15  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50080 (again)
	* parser.c (cp_parser_optional_template_keyword): When -pedantic
	and C++98 mode restore pre-Core/468 behavior.

/testsuite
2012-10-15  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/50080 (again)
	* g++.dg/parse/tmpl-outside2.C: Tweak, error in C++98.
	* g++.dg/parse/tmpl-outside1.C: Likewise.
	* g++.dg/template/qualttp18.C: Likewise.
	* g++.old-deja/g++.pt/memtemp87.C: Likewise.
	* g++.old-deja/g++.pt/overload13.C: Likewise.

From-SVN: r192470
This commit is contained in:
Paolo Carlini 2012-10-15 19:13:41 +00:00 committed by Paolo Carlini
parent e30440106a
commit c9e3b2097b
8 changed files with 43 additions and 8 deletions

View file

@ -1,3 +1,9 @@
2012-10-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50080 (again)
* parser.c (cp_parser_optional_template_keyword): When -pedantic
and C++98 mode restore pre-Core/468 behavior.
2012-10-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50080

View file

@ -23252,9 +23252,29 @@ cp_parser_optional_template_keyword (cp_parser *parser)
{
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
{
/* Consume the `template' keyword. */
cp_lexer_consume_token (parser->lexer);
return true;
/* In C++98 the `template' keyword can only be used within templates;
outside templates the parser can always figure out what is a
template and what is not. In C++11, per the resolution of DR 468,
`template' is allowed in cases where it is not strictly necessary. */
if (!processing_template_decl
&& pedantic && cxx_dialect == cxx98)
{
cp_token *token = cp_lexer_peek_token (parser->lexer);
pedwarn (token->location, OPT_Wpedantic,
"in C++98 %<template%> (as a disambiguator) is only "
"allowed within templates");
/* If this part of the token stream is rescanned, the same
error message would be generated. So, we purge the token
from the stream. */
cp_lexer_purge_token (parser->lexer);
return false;
}
else
{
/* Consume the `template' keyword. */
cp_lexer_consume_token (parser->lexer);
return true;
}
}
return false;
}

View file

@ -1,3 +1,12 @@
2012-10-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50080 (again)
* g++.dg/parse/tmpl-outside2.C: Tweak, error in C++98.
* g++.dg/parse/tmpl-outside1.C: Likewise.
* g++.dg/template/qualttp18.C: Likewise.
* g++.old-deja/g++.pt/memtemp87.C: Likewise.
* g++.old-deja/g++.pt/overload13.C: Likewise.
2012-10-15 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/avx256-unaligned-load-1.c: Update asm scan patterns.

View file

@ -7,4 +7,4 @@ struct X
template <int i> struct Y {};
};
typedef X::template Y<0> y;
typedef X::template Y<0> y; // { dg-error "template|invalid" "" { target c++98 } }

View file

@ -15,5 +15,5 @@ void test()
int main()
{
typename A<double>::template B<int> b;
typename A<double>::template B<int> b; // { dg-error "template|expected" "" { target c++98 } }
}

View file

@ -14,7 +14,7 @@ template <template <class> class TT> struct X
struct C
{
X<A::template B> x;
X<A::template B> x; // { dg-error "template" "" { target c++98 } }
};
int main()

View file

@ -12,4 +12,4 @@ public:
template<template<class> class>
class Y {
};
Q::template X<int> x;
Q::template X<int> x; // { dg-error "template" "" { target c++98 } }

View file

@ -7,5 +7,5 @@ struct A {
int main ()
{
A a;
return a.template f (0);
return a.template f (0); // { dg-error "template" "" { target c++98 } }
}