re PR c++/50080 ([DR 468] error: 'template' (as a disambiguator) is only allowed within templates)

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

	PR c++/50080
	* parser.c (cp_parser_optional_template_keyword): Implement
	Core/468, allow outside template.

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

	PR c++/50080
	* g++.dg/parse/tmpl-outside2.C: New.
	* g++.dg/parse/tmpl-outside1.C: Adjust.
	* g++.dg/template/qualttp18.C: Likewise.
	* g++.old-deja/g++.pt/memtemp87.C: Likewise.
	* g++.old-deja/g++.pt/overload13.C: Likewise.

From-SVN: r192465
This commit is contained in:
Paolo Carlini 2012-10-15 16:47:52 +00:00 committed by Paolo Carlini
parent 308a3fe2b9
commit 8183317394
8 changed files with 41 additions and 27 deletions

View file

@ -1,3 +1,9 @@
2012-10-15 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50080
* parser.c (cp_parser_optional_template_keyword): Implement
Core/468, allow outside template.
2012-10-14 Jason Merrill <jason@redhat.com>
Ville Voutilainen <ville.voutilainen@gmail.com>

View file

@ -23252,29 +23252,10 @@ cp_parser_optional_template_keyword (cp_parser *parser)
{
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
{
/* 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. */
if (!processing_template_decl)
{
cp_token *token = cp_lexer_peek_token (parser->lexer);
error_at (token->location,
"%<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;
}
/* 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
* g++.dg/parse/tmpl-outside2.C: New.
* g++.dg/parse/tmpl-outside1.C: Adjust.
* 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 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/54915

View file

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

View file

@ -0,0 +1,19 @@
// PR c++/50080
template <typename T>
struct A
{
template <typename U>
struct B {};
};
template <typename T>
void test()
{
typename A<T>::template B<int> b;
}
int main()
{
typename A<double>::template B<int> b;
}

View file

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

View file

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

View file

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