diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-10-15 16:47:52 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-10-15 16:47:52 +0000 |
commit | 81833173943fec6dec7287b475303e9d22387386 (patch) | |
tree | 16c3380243320131ca2a9104b161a01a40c0cd8a /gcc | |
parent | 308a3fe2b9afc954a494c9d4e0092fb11adcd8ef (diff) | |
download | gcc-81833173943fec6dec7287b475303e9d22387386.zip gcc-81833173943fec6dec7287b475303e9d22387386.tar.gz gcc-81833173943fec6dec7287b475303e9d22387386.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/tmpl-outside1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/tmpl-outside2.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/qualttp18.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/overload13.C | 2 |
8 files changed, 41 insertions, 27 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6621c11..5239e7e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index a7939c8..965bc62 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 74e7b1c..3805562 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C index e63e3cd..0713f17 100644 --- a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C @@ -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; diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside2.C b/gcc/testsuite/g++.dg/parse/tmpl-outside2.C new file mode 100644 index 0000000..d35656f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside2.C @@ -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; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp18.C b/gcc/testsuite/g++.dg/template/qualttp18.C index 31dfa6a..b4d28da 100644 --- a/gcc/testsuite/g++.dg/template/qualttp18.C +++ b/gcc/testsuite/g++.dg/template/qualttp18.C @@ -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() diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C index 99b4cd3..2554518 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp87.C @@ -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; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/overload13.C b/gcc/testsuite/g++.old-deja/g++.pt/overload13.C index f66f103..78a5e6d 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/overload13.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/overload13.C @@ -7,5 +7,5 @@ struct A { int main () { A a; - return a.template f (0); // { dg-error "" } + return a.template f (0); } |