diff options
author | Shujing Zhao <pearly.zhao@oracle.com> | 2010-07-05 05:36:02 +0000 |
---|---|---|
committer | Shujing Zhao <pzhao@gcc.gnu.org> | 2010-07-05 05:36:02 +0000 |
commit | 6698dd72f7b6743e1c4c44817de674ae2e31f8cb (patch) | |
tree | 841e7fa4efd7fb216b25170d672ae87fbb77b73f /gcc | |
parent | d42d62c835317ffddefbb6d3c46fbc50347784d3 (diff) | |
download | gcc-6698dd72f7b6743e1c4c44817de674ae2e31f8cb.zip gcc-6698dd72f7b6743e1c4c44817de674ae2e31f8cb.tar.gz gcc-6698dd72f7b6743e1c4c44817de674ae2e31f8cb.tar.bz2 |
re PR c++/22138 (Better error message for rejecting local template declaration.)
gcc/cp/
2010-07-05 Shujing Zhao <pearly.zhao@oracle.com>
PR c++/22138
* parser.c (cp_parser_primary_expression): Error if local template is
declared.
gcc/testsuite/
2010-07-05 Shujing Zhao <pearly.zhao@oracle.com>
PR c++/22138
* g++.dg/parse/template25.C: New.
From-SVN: r161818
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/template25.C | 14 |
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e7a9e85..354c767 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-07-05 Shujing Zhao <pearly.zhao@oracle.com> + + PR c++/22138 + * parser.c (cp_parser_primary_expression): Error if local template is + declared. + 2010-07-02 Le-Chun Wu <lcwu@google.com> PR/44128 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e8f10a4..b35d9a5 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 ca16bb6..e8b0959 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-05 Shujing Zhao <pearly.zhao@oracle.com> + + PR c++/22138 + * g++.dg/parse/template25.C: New. + 2010-07-04 H.J. Lu <hongjiu.lu@intel.com> 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 0000000..8ffcd12 --- /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<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */ + { + }; +} + +void g(void) +{ + template f<int>(); /* { dg-error "expected primary-expression" } */ + /* { dg-error "expected ';'" "" { target *-*-* } 12 } */ +} |