https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99966
Bug ID: 99966 Summary: Bounds check not eliminated by assert Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: jmuizelaar at mozilla dot com Target Milestone: --- #include <cassert> #include <cstdint> #include <cstddef> #include <vector> uint64_t f(std::vector<uint64_t>& data, size_t start, size_t end){ assert(start < end && start < data.size() && end <= data.size()); uint64_t total = 0; for (size_t i = start; i < end; i++) { total += data.at(i); } return total; } https://godbolt.org/z/Ksecrec11 Clang is able to eliminate the the check when using -mllvm -enable-constraint-elimination https://godbolt.org/z/K67b8PTM9