2014-09-12 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Sep 2014 11:06:49 +0000 (11:06 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Sep 2014 11:06:49 +0000 (11:06 +0000)
PR middle-end/63237
* gimple-fold.c (get_maxval_strlen): Gimplify string length.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215212 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimple-fold.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr63237.C [new file with mode: 0644]

index 98586be..52825bb 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-12  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/63237
+       * gimple-fold.c (get_maxval_strlen): Gimplify string length.
+
 2014-09-12  Marc Glisse  <marc.glisse@inria.fr>
 
        * tree.c (integer_each_onep): New function.
index 4aa1f4c..3d5e3b9 100644 (file)
@@ -2411,6 +2411,7 @@ gimple_fold_builtin_strlen (gimple_stmt_iterator *gsi)
   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 fb727bf..20defa5 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-12  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/63237
+       * g++.dg/torture/pr63237.C: New testcase.
+
 2014-09-12  Marc Glisse  <marc.glisse@inria.fr>
 
        * gcc.dg/vec-andxor1.c: New file.
diff --git a/gcc/testsuite/g++.dg/torture/pr63237.C b/gcc/testsuite/g++.dg/torture/pr63237.C
new file mode 100644 (file)
index 0000000..d1eaada
--- /dev/null
@@ -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]);
+}