re PR c++/40834 (Revision 149750 failed 483.xalancbmk in SPEC CPU 2006)
authorRichard Guenther <rguenther@suse.de>
Wed, 29 Jul 2009 20:16:32 +0000 (20:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 29 Jul 2009 20:16:32 +0000 (20:16 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr40834.C [new file with mode: 0644]

index ee37b65..7438541 100644 (file)
@@ -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
index 184ae9e..b4d36de 100644 (file)
@@ -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)
index 2c64bb6..0e55fab 100644 (file)
@@ -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 (file)
index 0000000..67d3028
--- /dev/null
@@ -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;
+}