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:
parent
e30440106a
commit
c9e3b2097b
8 changed files with 43 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 } }
|
||||
|
|
|
@ -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 } }
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 } }
|
||||
|
|
|
@ -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 } }
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue