https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93984
Bug ID: 93984 Summary: spurious Wclass-conversion warning Product: gcc Version: 9.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: stsp at users dot sourceforge.net Target Milestone: --- #include <iostream> struct D; struct B { virtual operator D() = 0; }; struct D : B { operator D() override { std::cout << "conv" << std::endl; return D(); } }; . int main() { D obj; B& br = obj; (D)br; // calls D::operator D() through virtual dispatch return 0; } $ LC_ALL=C g++ -Wall -o vconv vconv.cpp vconv.cpp:9:5: warning: converting 'D' to the same type will never use a type conversion operator [-Wclass-conversion] 9 | operator D() override { std::cout << "conv" << std::endl; return D(); } | ^~~~~~~~ $ ./vconv conv The example above shows that the warning is spurious. Converting to the same type will indeed never use the conversion operator. But the above case converts from B to D, so the warning does not apply. It may be quite difficult to check properly, but in this particular example the "override" keyword is a clear hint that it is going to be used via the virtual dispatch.