diff options
author | Lee Millward <lee.millward@codesourcery.com> | 2006-09-02 14:15:37 +0000 |
---|---|---|
committer | Lee Millward <lmillward@gcc.gnu.org> | 2006-09-02 14:15:37 +0000 |
commit | b89c561c2d7013aff39f79f727e72c53bd897f47 (patch) | |
tree | ca49f9f4b70c62c49a617347d679a6b95881680d | |
parent | 1d3e6248e59e6f7bca2c49ba367de9cc296837de (diff) | |
download | gcc-b89c561c2d7013aff39f79f727e72c53bd897f47.zip gcc-b89c561c2d7013aff39f79f727e72c53bd897f47.tar.gz gcc-b89c561c2d7013aff39f79f727e72c53bd897f47.tar.bz2 |
re PR c++/27670 (ICE on invalid template parameter)
2006-09-02 Lee Millward <lee.millward@codesourcery.com>
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
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash57.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/operator7.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/operator8.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/operator9.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef4.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef5.C | 8 |
9 files changed, 76 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4709c14..4568cb2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2006-09-02 Lee Millward <lee.millward@codesourcery.com> + + 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 <jakub@redhat.com> PR c++/28878 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 2e28856..72e1c92 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 a8c9b62..a1fdb4e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2006-09-02 Lee Millward <lee.millward@codesourcery.com> + + 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 <jakub@redhat.com> 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 0000000..cf1c3c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash57.C @@ -0,0 +1,10 @@ +//PR c++/27397 + +template<int(> struct A; // { dg-error "token" } + +template<typename> struct B +{ + template<int(> struct C; // { dg-error "token" } +}; + +A<char> 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 0000000..bd733da --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator7.C @@ -0,0 +1,6 @@ +//PR c++/27493 + +template<operator T> 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 0000000..a7f9856 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator8.C @@ -0,0 +1,12 @@ +//PR c++/27494 + +struct A +{ + template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" } +}; + +struct B +{ + template<operator> void foo() {} // { dg-error "identifier|non-function|'void'" } + template<int> 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 0000000..dfd491d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator9.C @@ -0,0 +1,9 @@ +//PR c++/27670 + +template<operator+> 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 8337110..2676d8f 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<typedef> void foo(); // { dg-error "no type|typedef declaration" } +template<typedef> 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 843d1a9..abd9ebb 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<typedef,int> struct A1; // { dg-error "no type|typedef declaration" } -template<typedef x,int> struct A2; // { dg-error "no type|typedef declaration" } -template<typedef x[],int> struct A3; // { dg-error "no type|typedef declaration" } -template<typedef int x, int> struct A4; // { dg-error "typedef declaration" } +template<typedef,int> struct A1; // { dg-error "no type|typedef declaration|default argument" } +template<typedef x,int> struct A2; // { dg-error "no type|typedef declaration|default argument" } +template<typedef x[],int> struct A3; // { dg-error "no type|typedef declaration|default argument" } +template<typedef int x, int> struct A4; // { dg-error "typedef declaration|default argument" } |