Index: clang-tidy/misc/VirtualNearMissCheck.cpp =================================================================== --- clang-tidy/misc/VirtualNearMissCheck.cpp +++ clang-tidy/misc/VirtualNearMissCheck.cpp @@ -244,8 +244,15 @@ if (isOverriddenByDerivedClass(BaseMD, DerivedRD)) continue; + // If the function has an identifier for a name, then use that + // identifier to determine the edit distance. If the function is a + // special member function without an identifier, assume the edit + // distance is nonzero to determine whether the signature is a near + // miss or not. unsigned EditDistance = - BaseMD->getName().edit_distance(DerivedMD->getName()); + BaseMD->getDeclName().isIdentifier() + ? BaseMD->getName().edit_distance(DerivedMD->getName()) + : 1; if (EditDistance > 0 && EditDistance <= EditDistanceThreshold) { if (checkOverrideWithoutName(Context, BaseMD, DerivedMD)) { // A "virtual near miss" is found. Index: test/clang-tidy/misc-virtual-near-miss.cpp =================================================================== --- test/clang-tidy/misc-virtual-near-miss.cpp +++ test/clang-tidy/misc-virtual-near-miss.cpp @@ -63,3 +63,20 @@ private: void funk(); // Should not warn: access qualifers don't match. }; + +namespace { +// Ensure this code does not crash due to special member functions. +class _Facet_base { +public: + virtual ~_Facet_base() noexcept {} +}; + +class facet : public _Facet_base { +protected: + virtual ~facet() noexcept {} + +public: + facet(const facet&) = delete; + facet& operator=(const facet&) = delete; +}; +}