http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58950
--- Comment #2 from Marc Glisse <glisse at gcc dot gnu.org> --- For __builtin_shuffle, the issue is that we now call save_expr, which always sets TREE_SIDE_EFFECTS to 1. I don't know if it would make sense to introduce a maybe_save_expr that is equivalent to save_expr but does not set TREE_SIDE_EFFECTS if its argument doesn't have it. But in any case I think we still want to warn for an unused result in __builtin_shuffle(x,++m) so that's not the solution. In C we also have the side_effects_flag but we still warn in warn_if_unused_value (the default for unknown trees), whereas in C++ (near the end of convert_to_void in cvt.c) only some tcc_comparison, tcc_unary and tcc_binary can warn when they have side effects. It would be easy to add VEC_PERM_EXPR to the list and get a "value computed is not used", I just don't know if something more general is possible. For (i+i), the PLUS_EXPR ends up with nowarning_flag = 1 somehow.