diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-01-24 10:39:03 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-01-24 10:39:03 +0000 |
commit | 7cc35b68d5fe7ec32079ec56098f2a7f77893586 (patch) | |
tree | faad56ec074f6f0711d420c5ab6405a31e4531a1 /gcc | |
parent | a9d3ac1e891f37fe405d8aaa4653d27ed818871c (diff) | |
download | gcc-7cc35b68d5fe7ec32079ec56098f2a7f77893586.zip gcc-7cc35b68d5fe7ec32079ec56098f2a7f77893586.tar.gz gcc-7cc35b68d5fe7ec32079ec56098f2a7f77893586.tar.bz2 |
re PR c++/51223 (ICE with invalid function parameter)
/cp
2012-01-24 Paolo Carlini <paolo.carlini@oracle.com>
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 <paolo.carlini@oracle.com>
PR c++/51223
* g++.dg/parse/crash58.C: New.
From-SVN: r183472
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/crash58.C | 16 |
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 11d458a..9eb975d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-01-24 Paolo Carlini <paolo.carlini@oracle.com> + + 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 <jason@redhat.com> PR c++/51930 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index aa70749..c962ca0 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 9825bc5..1db5388 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-24 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51223 + * g++.dg/parse/crash58.C: New. + 2012-01-24 Jakub Jelinek <jakub@redhat.com> 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 0000000..37f1c09 --- /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(); +} |