mercredi 24 mai 2017

My g++ generates weird warning with vector

I have following C++ code:

#include <memory>
#include <vector>
#include <string>
#include <unordered_map>

void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
        mvec_it = mvec.erase(mvec_it);
}

int main(void) {
#if 0
    std::vector<std::weak_ptr<int>> mvec;
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
        mvec_it = mvec.erase(mvec_it);
#endif
}

GCC generates warning when I compile it this way:

ppk@fif-cloud-dev:~$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ppk@fif-cloud-dev:~$ g++ -fstrict-overflow -Wstrict-overflow=5 -O2 -std=c++14  warn1.cc
warn1.cc: In function ‘void erase_from_vector(std::vector<std::weak_ptr<int> >&)’:
warn1.cc:6:6: warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow]
 void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
      ^

But when I change -O2 flag to -O1 it compiles without any warnings. When I keep flag -O2 and uncomment code in main() it also compiles without any warnings. Clang compiler also does not report any warnings.

I suppose that this warning comes from std::weak_ptr destructor where counter is decremented but have no idea why it appears in my code.

Is the warning caused by my error or error in the compiler?

Aucun commentaire:

Enregistrer un commentaire