Hi Jason, on the match-and-simplify branch I currently see
And the C++ relying on fold _not_ folding (T) (T) 4B to 4 causes FAIL: g++.dg/cpp0x/constexpr-reinterpret1.C -std=c++11 (test for errors, line 21) FAIL: g++.dg/cpp0x/constexpr-reinterpret1.C -std=c++1y (test for errors, line 21) Because the C++ FE relies on fold _not_ folding (T&)(T&) 4B to 4. Which it currently does not because if you ask fold_unary to fold (T&) of the unfolded tree (T&) 4B then the first transform that applies (because of accidential(?) ordering in fold_unary) is the one stripping conversions to an equal type which just returns the operand, (T&) 4B. On match-and-simplify no such ordering takes place and instead we apply the transform of the most complex pattern we can match - which is optimizing two conversions in a row. In this case it says the middle conversion is not necessary and converts it to (T) 4B - re-folding that which folds it to just 4 which is no longer a cast and thus we fail to warn. I have no idea how I can keep the testcase working - to me it seems it works by accident. So I am inclinded to XFAIL it (it's an accept-invalid then). Any other ideas? Thanks, Richard.