The following fixes a missed gimplification of strlen in the
GIMPLE strlen folding variant.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2014-09-12  Richard Biener  <rguent...@suse.de>

        PR middle-end/63237
        * gimple-fold.c (get_maxval_strlen): Gimplify string length.

        * g++.dg/torture/pr63237.C: New testcase.

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 215203)
+++ gcc/gimple-fold.c   (working copy)
@@ -2411,6 +2411,7 @@ gimple_fold_builtin_strlen (gimple_stmt_
   tree len = get_maxval_strlen (gimple_call_arg (stmt, 0), 0);
   if (!len)
     return false;
+  len = force_gimple_operand_gsi (gsi, len, true, NULL, true, GSI_SAME_STMT);
   replace_call_with_value (gsi, len);
   return true;
 }
Index: gcc/testsuite/g++.dg/torture/pr63237.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr63237.C      (revision 0)
+++ gcc/testsuite/g++.dg/torture/pr63237.C      (working copy)
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+class A {
+    int Length;
+public:
+    A(const char *p1) { Length = __builtin_strlen(p1); }
+};
+class B {
+public:
+    void m_fn1(int, A);
+};
+class C {
+public:
+    B &m_fn2();
+};
+int a;
+void RewriteMacrosInInput() {
+    C b;
+    B &c = b.m_fn2();
+    c.m_fn1(0, &""[a]);
+}

Reply via email to