The pr8781.C testcase appears to have undefined behaviour as far as I can tell. A function called noop is called with argument pred; this creates a noop_t object which stores a reference to that argument, and then the function returns the object. At that point I think the reference becomes stale. This seems to be fixable by changing the pred argument to be a reference itself.
Normally, inlining fixes up the situation, but this showed up as a problem on a port where inlining was more difficult than usual. Bootstrapped and tested on x86_64-linux. Ok? Bernd
* g++.dg/tree-ssa/pr8781.C (noop): Make argument a reference. diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr8781.C b/gcc/testsuite/g++.dg/tree-ssa/pr8781.C index cc518a0..a6050c4 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/pr8781.C +++ b/gcc/testsuite/g++.dg/tree-ssa/pr8781.C @@ -13,7 +13,7 @@ public: }; template<typename predicate> -inline noop_t<predicate> noop(const predicate pred) { +inline noop_t<predicate> noop(const predicate &pred) { return noop_t<predicate>(pred); }