The following code (as small as I can get but I'm not sure its minimal)

#include <set>

struct X{
  unsigned a;
  X(){}
  bool operator<(const X& i)const { return a < i.a; }
};

struct R{
  std::set<X> getSet() const{
    std::set<X> result;
    result.insert(X());
    return result;
  }
};

void bug(){
  for(unsigned x = 0; x < 2; ++x){
    std::set<X> pts = R().getSet();
  }
}


Produces the following warnings:


bug-check2.cpp: In function ‘void bug()’:
bug-check2.cpp:6: warning: dereferencing pointer ‘__x.22’ does break
strict-aliasing rules
/usr/include/c++/4.4/bits/stl_tree.h:525: note: initialized from here
bug-check2.cpp:6: warning: dereferencing pointer ‘__x.22’ does break
strict-aliasing rules
/usr/include/c++/4.4/bits/stl_tree.h:525: note: initialized from here


When compiled with:

g++ -Wall -O3 -c bug-check2.cpp

With version 4.4.1 on Ubuntu 9.10 (Sorry for the old version, it would take
hours to recompile g++ and I already have put several into reducing the
test-case.)

I will be attaching the g++ verbose output, the preprocessed source, and the
original source.




Unusual symptoms:

1. Making getSet static or a global function removes the warning.

2. Reducing the number of loop iterations below 2 reduces or removes the
warning.

3. Removing the constructor for X removes one of the warnings.

4. Changing X::operator< to return a constant value removes the warning

5. Changing X::operator< to {return a < b; } where b is a global variable
removes the warning

6. Removing the result.insert(X()) line removes the warnings

7. Making result a global variable removes the warnings.


-- 
           Summary: Strict aliasing warning in stl_tree (returning a copy of
                    a set from a member function in a loop)
           Product: gcc
           Version: 4.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: eric_moyer at yahoo dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45202

Reply via email to