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]); +}