https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101566
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Dale Weiler from comment #2) > Ah, passing `T&` here instead of T does appear to avoid the issue, the > question now becomes why does -fsanitize=undefined find nothing, and is the > return type, i.e `declval(get<N>(t))` different in gcc compared to the other > compiles. I would expect similar issues in the other compilers if this is > returning a reference to the temporary given by the argument list of `get` So -fsanitize=undefined adds some extra code which just happens to cause GCC not to optimize as much. Try -fsanitize=address instead which enables -fsanitize-address-use-after-scope which should detect the problen but I see it does not ....