aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-07-29 20:16:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-07-29 20:16:32 +0000
commit9e34da8b076782c692a7e4fa6587fd19764d9b2d (patch)
tree2d32a3bb27ecb9ca4e4a9bd39bfa88b4d0c93093
parent2958f4a215223d78c9deb984cadfc410446e4e48 (diff)
downloadgcc-9e34da8b076782c692a7e4fa6587fd19764d9b2d.zip
gcc-9e34da8b076782c692a7e4fa6587fd19764d9b2d.tar.gz
gcc-9e34da8b076782c692a7e4fa6587fd19764d9b2d.tar.bz2
re PR c++/40834 (Revision 149750 failed 483.xalancbmk in SPEC CPU 2006)
2009-07-29 Richard Guenther <rguenther@suse.de> PR c++/40834 * cp-gimplify.c (cp_genericize_r): Properly walk the BIND_EXPR vars. * g++.dg/torture/pr40834.C: New testcase. From-SVN: r150222
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-gimplify.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr40834.C52
4 files changed, 63 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ee37b65..7438541 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-07-29 Richard Guenther <rguenther@suse.de>
+
+ PR c++/40834
+ * cp-gimplify.c (cp_genericize_r): Properly walk the BIND_EXPR
+ vars.
+
2009-07-26 Simon Martin <simartin@users.sourceforge.net>
PR c++/40749
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 184ae9e..b4d36de4 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -810,7 +810,6 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
cp_walk_tree (&BIND_EXPR_BODY (stmt),
cp_genericize_r, data, NULL);
VEC_pop (tree, wtd->bind_expr_stack);
- *walk_subtrees = 0;
}
else if (TREE_CODE (stmt) == USING_STMT)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2c64bb6..0e55fab 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-29 Richard Guenther <rguenther@suse.de>
+
+ PR c++/40834
+ * g++.dg/torture/pr40834.C: New testcase.
+
2009-07-29 Michael Matz <matz@suse.de>
PR middle-end/40830
diff --git a/gcc/testsuite/g++.dg/torture/pr40834.C b/gcc/testsuite/g++.dg/torture/pr40834.C
new file mode 100644
index 0000000..67d3028
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr40834.C
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+
+extern "C" void abort (void);
+class XalanDOMString
+{
+public:
+ int y;
+};
+
+class XObject
+{
+public:
+ const XalanDOMString& str() const { return x; }
+ XalanDOMString x;
+};
+
+class XObjectPtr
+{
+public:
+ XObjectPtr(const XObjectPtr& theSource)
+ {
+ m_xobjectPtr = theSource.m_xobjectPtr;
+ }
+ const XObject* operator->() const
+ {
+ return m_xobjectPtr;
+ };
+ XObjectPtr(XObject *p) { m_xobjectPtr = p; }
+ XObject* m_xobjectPtr;
+};
+
+class FunctionSubstringBefore
+{
+public:
+ int execute( const XObjectPtr arg1) const
+ {
+ const XalanDOMString& theFirstString = arg1->str();
+ return theFirstString.y;
+ }
+};
+
+int
+main ()
+{
+ XObject x;
+ XObjectPtr y (&x);
+ x.x.y = -1;
+ FunctionSubstringBefore z;
+ if (z.execute (y) != -1)
+ abort ();
+ return 0;
+}