diff --git a/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md b/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md new file mode 100644 index 0000000000..b60b87455e --- /dev/null +++ b/change_notes/2026-10-08-fix-fp-rule-13-3-1-implicit-destructor.md @@ -0,0 +1,5 @@ +- `RULE-13-3-1` - `MemberSpecifiersNotUsedAppropriately.ql`: + - Fixed false positives on implicitly declared member functions, most + commonly the implicit destructor of a class deriving from a class with a + virtual destructor. The rule applies to user-declared member functions + only, and an implicit destructor cannot carry `override` or `final`. diff --git a/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql b/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql index 3bd2a4bb96..78c778ee4c 100644 --- a/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql +++ b/cpp/misra/src/rules/RULE-13-3-1/MemberSpecifiersNotUsedAppropriately.ql @@ -20,6 +20,9 @@ import codingstandards.cpp.misra from MemberFunction f, string message where not isExcluded(f, Classes2Package::memberSpecifiersNotUsedAppropriatelyQuery()) and + // Only user-declared member functions are in scope, not implicitly declared + // ones such as an implicit destructor. + not f.isCompilerGenerated() and ( // Case 1: Specifiers incompatible with explicitly virtual f.isDeclaredVirtual() and diff --git a/cpp/misra/test/rules/RULE-13-3-1/test.cpp b/cpp/misra/test/rules/RULE-13-3-1/test.cpp index 5474d5e6d6..83f786af27 100644 --- a/cpp/misra/test/rules/RULE-13-3-1/test.cpp +++ b/cpp/misra/test/rules/RULE-13-3-1/test.cpp @@ -104,4 +104,13 @@ class C15 : public NonvirtualDestructorBase { public: virtual ~C15() = default; // COMPLIANT: Note that this does not violate rule 6.4.2 -}; \ No newline at end of file +}; + +class C16 : public VirtualDestructorBase { + // COMPLIANT: the destructor is implicitly declared, not user-declared +}; + +class C17 : public VirtualDestructorBase { +public: + C17() = default; // COMPLIANT: implicit virtual destructor not user-declared +};