https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78130
--- Comment #7 from Marc Glisse <glisse at gcc dot gnu.org> --- Reduced a bit more: struct B { B(); void m_fn2(int p1) { if (p1 <= storage_) throw; } int storage_; }; void f() { B span_; int b = span_.storage_; span_.m_fn2(b - 1); } The warning seems correct to me (assuming the reduction didn't change things too much). We have a comparison storage_ - 1 <= storage_, the compiler optimizes it to true, and the warning tells you about it (maybe in the full code the compiler would have a chance to prove that storage_ is never 0 and thus storage_ - 1 can never overflow, but that's hard). A warning doesn't necessary say that something is wrong with your code, here it just informs you about an optimization. How useful that is is a different question...