From b89c561c2d7013aff39f79f727e72c53bd897f47 Mon Sep 17 00:00:00 2001 From: Lee Millward Date: Sat, 2 Sep 2006 14:15:37 +0000 Subject: [PATCH] re PR c++/27670 (ICE on invalid template parameter) 2006-09-02 Lee Millward PR c++/27670 PR c++/27493 PR c++/27494 PR c++/27397 * parser.c (cp_parser_template_parameter_list): Add invalid template parameters to the parameter list as error_mark_node. * g++.dg/template/operator9.C: New test. * g++.dg/template/operator7.C: New test. * g++.dg/template/operator8.C: New test. * g++.dg/template/crash57.C: New test. * g++.dg/template/typedef4.C: Adjust error markers. * g++.dg/template/typedef5.C: Likewise. From-SVN: r116661 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/parser.c | 7 +++++++ gcc/testsuite/ChangeLog | 17 +++++++++++++++++ gcc/testsuite/g++.dg/template/crash57.C | 10 ++++++++++ gcc/testsuite/g++.dg/template/operator7.C | 6 ++++++ gcc/testsuite/g++.dg/template/operator8.C | 12 ++++++++++++ gcc/testsuite/g++.dg/template/operator9.C | 9 +++++++++ gcc/testsuite/g++.dg/template/typedef4.C | 2 +- gcc/testsuite/g++.dg/template/typedef5.C | 8 ++++---- 9 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/crash57.C create mode 100644 gcc/testsuite/g++.dg/template/operator7.C create mode 100644 gcc/testsuite/g++.dg/template/operator8.C create mode 100644 gcc/testsuite/g++.dg/template/operator9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4709c147aeb..4568cb28a1b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2006-09-02 Lee Millward + + PR c++/27670 + PR c++/27493 + PR c++/27494 + PR c++/27397 + * parser.c (cp_parser_template_parameter_list): Add + invalid template parameters to the parameter list as + error_mark_node. + 2006-09-02 Jakub Jelinek PR c++/28878 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 2e288569102..72e1c920564 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8441,6 +8441,13 @@ cp_parser_template_parameter_list (cp_parser* parser) parameter_list = process_template_parm (parameter_list, parameter, is_non_type); + else + { + tree err_parm = build_tree_list (parameter, parameter); + TREE_VALUE (err_parm) = error_mark_node; + parameter_list = chainon (parameter_list, err_parm); + } + /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); /* If it's not a `,', we're done. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8c9b6200a6..a1fdb4eb314 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2006-09-02 Lee Millward + + PR c+/27670 + * g++.dg/template/operator9.C: New test. + + PR c++/27493 + * g++.dg/template/operator7.C: New test. + + PR c++/27494 + * g++.dg/template/operator8.C: New test. + + PR c++/27397 + * g++.dg/template/crash57.C: New test. + + * g++.dg/template/typedef4.C: Adjust error markers. + * g++.dg/template/typedef5.C: Likewise. + 2006-09-02 Jakub Jelinek PR c++/28878 diff --git a/gcc/testsuite/g++.dg/template/crash57.C b/gcc/testsuite/g++.dg/template/crash57.C new file mode 100644 index 00000000000..cf1c3c2961d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash57.C @@ -0,0 +1,10 @@ +//PR c++/27397 + +template struct A; // { dg-error "token" } + +template struct B +{ + template struct C; // { dg-error "token" } +}; + +A a; // { dg-error "type/value mismatch|constant|declaration" } diff --git a/gcc/testsuite/g++.dg/template/operator7.C b/gcc/testsuite/g++.dg/template/operator7.C new file mode 100644 index 00000000000..bd733da4d30 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator7.C @@ -0,0 +1,6 @@ +//PR c++/27493 + +template void foo() // { dg-error "before|template" } +{ + struct A {}; +} diff --git a/gcc/testsuite/g++.dg/template/operator8.C b/gcc/testsuite/g++.dg/template/operator8.C new file mode 100644 index 00000000000..a7f9856778a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator8.C @@ -0,0 +1,12 @@ +//PR c++/27494 + +struct A +{ + template void foo() {} // { dg-error "identifier|non-function|template arguments" } +}; + +struct B +{ + template void foo() {} // { dg-error "identifier|non-function|'void'" } + template void bar() {} // { dg-error "template arguments" } +}; diff --git a/gcc/testsuite/g++.dg/template/operator9.C b/gcc/testsuite/g++.dg/template/operator9.C new file mode 100644 index 00000000000..dfd491d4f04 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator9.C @@ -0,0 +1,9 @@ +//PR c++/27670 + +template void foo(); // { dg-error "before|non-function|template" } + +void bar() +{ + foo(); // { dg-error "no matching function" } +} + diff --git a/gcc/testsuite/g++.dg/template/typedef4.C b/gcc/testsuite/g++.dg/template/typedef4.C index 8337110c5b6..2676d8fec1d 100644 --- a/gcc/testsuite/g++.dg/template/typedef4.C +++ b/gcc/testsuite/g++.dg/template/typedef4.C @@ -1,7 +1,7 @@ // PR c++/27572 // { dg-do compile } -template void foo(); // { dg-error "no type|typedef declaration" } +template void foo(); // { dg-error "no type|typedef declaration|template" } void bar() { diff --git a/gcc/testsuite/g++.dg/template/typedef5.C b/gcc/testsuite/g++.dg/template/typedef5.C index 843d1a9755d..abd9ebb57cf 100644 --- a/gcc/testsuite/g++.dg/template/typedef5.C +++ b/gcc/testsuite/g++.dg/template/typedef5.C @@ -1,7 +1,7 @@ // PR c++/27572 // { dg-do compile } -template struct A1; // { dg-error "no type|typedef declaration" } -template struct A2; // { dg-error "no type|typedef declaration" } -template struct A3; // { dg-error "no type|typedef declaration" } -template struct A4; // { dg-error "typedef declaration" } +template struct A1; // { dg-error "no type|typedef declaration|default argument" } +template struct A2; // { dg-error "no type|typedef declaration|default argument" } +template struct A3; // { dg-error "no type|typedef declaration|default argument" } +template struct A4; // { dg-error "typedef declaration|default argument" } -- 2.30.2