https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103067
Bug ID: 103067 Summary: Tautological compare warning not appearing if the self-comparison is on object members Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: crillion at tiscali dot it Target Milestone: --- Hi, I've found that on gcc 11.2 (tested on windows 10, with msys2), and compiling with : g++ -std=c++20 -pedantic -Wall -Wextra -Werror=return-type -Wshadow=local -Wempty-body -fdiagnostics-color -s -Os program.cpp -o program_gpp.exe -LC:/programs/msys64/mingw64/lib (I have also tried adding -Wtautological-compare but with the same effect described below). if I have a code with a struct person that in operator== erroneously compares one of its members, of an object type, with itself as in the following example : // this is a struct for field members, here comparison is implemented correctly struct object_member { int a = 20; bool operator==(const m& rhs) const { return a == rhs.a; } }; // this struct has the error in the operator== struct person { bool operator==(const person& rhs) const { // comparing this instance member with itself! return age == age; // instead of age == rhs.age } object_member age; }; int main() { person p1, p2; if(p1 == p2) std::cout << "equal!\n"; } I don't get the tautological compare warning. The behavior seems to occur only with struct/class types (also with string and optional), but not with primitive numeric types (i.e. : if age is an int, I get normally the tautological-compare warning. It occurs also if the expression is in AND with other correct comparisons. The causing part seems to be an operator== involving an object member (struct, class) compared with itself. In case of a single member I get instead the warning "rhs parameter not used", but if I add to the struct and comparison another field (ex.: int a), comparing it correctly, no warning shows at all: (...) operator==(const person& rhs) { return a == rhs.a && age == age; } (...) int a = 0; object_member age; (...) Is this correct ? or should I get this important warning also if the member is an object ? Note : I see clang 11.0 does not issue the warning either. Thanks, Marco