From 6698dd72f7b6743e1c4c44817de674ae2e31f8cb Mon Sep 17 00:00:00 2001 From: Shujing Zhao Date: Mon, 5 Jul 2010 05:36:02 +0000 Subject: [PATCH] re PR c++/22138 (Better error message for rejecting local template declaration.) gcc/cp/ 2010-07-05 Shujing Zhao PR c++/22138 * parser.c (cp_parser_primary_expression): Error if local template is declared. gcc/testsuite/ 2010-07-05 Shujing Zhao PR c++/22138 * g++.dg/parse/template25.C: New. From-SVN: r161818 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/template25.C | 14 ++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/template25.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e7a9e858f85..354c7677f57 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-07-05 Shujing Zhao + + PR c++/22138 + * parser.c (cp_parser_primary_expression): Error if local template is + declared. + 2010-07-02 Le-Chun Wu PR/44128 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e8f10a4d000..b35d9a5a6c3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3754,6 +3754,16 @@ cp_parser_primary_expression (cp_parser *parser, case RID_AT_SELECTOR: return cp_parser_objc_expression (parser); + case RID_TEMPLATE: + if (parser->in_function_body + && (cp_lexer_peek_nth_token (parser->lexer, 2)->type + == CPP_LESS)) + { + error_at (token->location, + "a template declaration cannot appear at block scope"); + cp_parser_skip_to_end_of_block_or_statement (parser); + return error_mark_node; + } default: cp_parser_error (parser, "expected primary-expression"); return error_mark_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca16bb680e5..e8b0959047a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-05 Shujing Zhao + + PR c++/22138 + * g++.dg/parse/template25.C: New. + 2010-07-04 H.J. Lu PR rtl-optimization/44695 diff --git a/gcc/testsuite/g++.dg/parse/template25.C b/gcc/testsuite/g++.dg/parse/template25.C new file mode 100644 index 00000000000..8ffcd121e18 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template25.C @@ -0,0 +1,14 @@ +// PR c++/22318. Improve diagnostic for local template declaration. +// { dg-do compile } +void f(void) +{ + template class A /* { dg-error "a template declaration cannot appear at block scope" } */ + { + }; +} + +void g(void) +{ + template f(); /* { dg-error "expected primary-expression" } */ + /* { dg-error "expected ';'" "" { target *-*-* } 12 } */ +} -- 2.30.2