From 7cc35b68d5fe7ec32079ec56098f2a7f77893586 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 24 Jan 2012 10:39:03 +0000 Subject: [PATCH] re PR c++/51223 (ICE with invalid function parameter) /cp 2012-01-24 Paolo Carlini PR c++/51223 * call.c (build_over_call): Check for error_mark_node as TREE_VALUE when default arguments are processed. /testsuite 2012-01-24 Paolo Carlini PR c++/51223 * g++.dg/parse/crash58.C: New. From-SVN: r183472 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/parse/crash58.C | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/crash58.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 11d458a3644..9eb975d43b5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-01-24 Paolo Carlini + + PR c++/51223 + * call.c (build_over_call): Check for error_mark_node as + TREE_VALUE when default arguments are processed. + 2012-01-23 Jason Merrill PR c++/51930 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index aa70749ee02..c962ca0bd53 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6581,9 +6581,14 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) /* Default arguments */ for (; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++) - argarray[j++] = convert_default_arg (TREE_VALUE (parm), - TREE_PURPOSE (parm), - fn, i - is_method); + { + if (TREE_VALUE (parm) == error_mark_node) + return error_mark_node; + argarray[j++] = convert_default_arg (TREE_VALUE (parm), + TREE_PURPOSE (parm), + fn, i - is_method); + } + /* Ellipsis */ for (; arg_index < VEC_length (tree, args); ++arg_index) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9825bc517fa..1db5388c319 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-24 Paolo Carlini + + PR c++/51223 + * g++.dg/parse/crash58.C: New. + 2012-01-24 Jakub Jelinek PR target/51957 diff --git a/gcc/testsuite/g++.dg/parse/crash58.C b/gcc/testsuite/g++.dg/parse/crash58.C new file mode 100644 index 00000000000..37f1c09d5a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash58.C @@ -0,0 +1,16 @@ +// PR c++/51223 + +struct A +{ + A foo(void i = 0); // { dg-error "incomplete type|invalid use" } +}; + +void bar() +{ + A().foo(); +} + +A A::foo(void i) // { dg-error "incomplete type|invalid use" } +{ + return A(); +} -- 2.30.2