aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-13 00:17:18 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-13 00:17:18 +0100
commitffbf581329701d6d61b843c950a6809156dfd49d (patch)
tree51be3e44e1233a9d27710483cb5bb02bb4602ab6
parentd32034a78d8125005902d0b82e06463428615fed (diff)
downloadgcc-ffbf581329701d6d61b843c950a6809156dfd49d.zip
gcc-ffbf581329701d6d61b843c950a6809156dfd49d.tar.gz
gcc-ffbf581329701d6d61b843c950a6809156dfd49d.tar.bz2
re PR c++/29225 (ICE in gimplify_expr, at gimplify.c:4513)
PR c++/29225 * call.c (build_new_op): Call resolve_args before calling build_over_call. * g++.dg/template/crash72.C: New test. From-SVN: r130126
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/crash72.C25
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1cc3895..1bcad75 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/29225
+ * call.c (build_new_op): Call resolve_args before calling
+ build_over_call.
+
2007-11-11 Tom Tromey <tromey@redhat.com>
PR c++/17577:
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 50ff8b5..ecb8858 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -3918,7 +3918,10 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
if (overloaded_p)
*overloaded_p = true;
- result = build_over_call (cand, LOOKUP_NORMAL);
+ if (resolve_args (arglist) == error_mark_node)
+ result = error_mark_node;
+ else
+ result = build_over_call (cand, LOOKUP_NORMAL);
}
else
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 167d170..6bbbe33 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/29225
+ * g++.dg/template/crash72.C: New test.
+
2007-11-12 Eric Botcazou <ebotcazou@libertysurf.fr>
* g++.dg/opt/cfg5.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/crash72.C b/gcc/testsuite/g++.dg/template/crash72.C
new file mode 100644
index 0000000..5ab5365
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash72.C
@@ -0,0 +1,25 @@
+// PR c++/29225
+// { dg-do compile }
+
+template <typename L, typename R> bool operator< (L x, R y);
+struct T { int t (); };
+class S {};
+
+struct U
+{
+ typedef int (T::* M) ();
+ M m;
+
+ bool operator() (S &x)
+ {
+ T a;
+ return (a.*m) < x; // { dg-error "invalid use of non-static member" }
+ }
+};
+
+void foo (S &x)
+{
+ U m;
+ m.m = &T::t;
+ m (x);
+}