re PR middle-end/63237 (error: invalid operand in unary operation)
authorRichard Biener <rguenther@suse.de>
Fri, 12 Sep 2014 11:06:49 +0000 (11:06 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 12 Sep 2014 11:06:49 +0000 (11:06 +0000)
2014-09-12  Richard Biener  <rguenther@suse.de>

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

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

From-SVN: r215212

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

index 98586be01d1c52c34d4a6973b518b57bd852093a..52825bb6cf229878f6e1c5509769d705354c0807 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 4aa1f4c1eda5d648bbff2b3366e5c2f5d6215612..3d5e3b91c040cba00b131c6f9a4dade742c23b36 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 fb727bf046484c2ce34ca5733905735b5e91aa91..20defa5bc3ec3278a18fed5f9172a0d30ceb3812 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]);
+}