re PR c++/51223 (ICE with invalid function parameter)
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 24 Jan 2012 10:39:03 +0000 (10:39 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 24 Jan 2012 10:39:03 +0000 (10:39 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/crash58.C [new file with mode: 0644]

index 11d458a364461054c911f97b8f19cd601f02b8de..9eb975d43b594f7f787eda07005dd13b9bab8803 100644 (file)
@@ -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
index aa70749ee0257207410af26453709d05f3d75135..c962ca0bd53ef38fbb7ced77cee036db80d0d82f 100644 (file)
@@ -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)
     {
index 9825bc517fa5afd10eef9de06750cb612a713635..1db5388c3190d741a08d7880a9bf04a333aa8c36 100644 (file)
@@ -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 (file)
index 0000000..37f1c09
--- /dev/null
@@ -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();
+}