The attribute is now allowed on an assortment of declarations, to suppress warnings related to declarations themselves, or all warnings in the lexical scope of the declaration. I don't necessarily see a reason to have a list at all, but it does look as if some of those more niche items aren't properly supported by the compiler itself so let's maintain a short safe list for now. The initial implementation raised a question whether the attribute should apply to lexical declaration context vs. "actual" declaration context. I'm using "lexical" here because it results in less warnings suppressed, which is the conservative behavior: we can always expand it later if we think this is wrong, without breaking any existing code. I also think that this is the correct behavior that we will probably never want to change, given that the user typically desires to keep the suppressions as localized as possible.
64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
// RUN: %clang_analyze_cc1 -analyzer-checker=webkit.RefCntblBaseVirtualDtor -verify %s
|
|
|
|
struct RefCntblBase {
|
|
void ref() {}
|
|
void deref() {}
|
|
};
|
|
|
|
struct Derived : RefCntblBase { };
|
|
// expected-warning@-1{{Struct 'RefCntblBase' is used as a base of struct 'Derived' but doesn't have virtual destructor}}
|
|
|
|
struct DerivedWithVirtualDtor : RefCntblBase {
|
|
// expected-warning@-1{{Struct 'RefCntblBase' is used as a base of struct 'DerivedWithVirtualDtor' but doesn't have virtual destructor}}
|
|
virtual ~DerivedWithVirtualDtor() {}
|
|
};
|
|
|
|
// Confirm that the checker respects [[clang::suppress]]
|
|
struct [[clang::suppress]] SuppressedDerived : RefCntblBase { };
|
|
struct [[clang::suppress]] SuppressedDerivedWithVirtualDtor : RefCntblBase {
|
|
virtual ~SuppressedDerivedWithVirtualDtor() {}
|
|
};
|
|
|
|
// FIXME: Support attributes on base specifiers? Currently clang
|
|
// doesn't support such attributes at all, even though it knows
|
|
// how to parse them.
|
|
//
|
|
// struct SuppressedBaseSpecDerived : [[clang::suppress]] RefCntblBase { };
|
|
|
|
template<class T>
|
|
struct DerivedClassTmpl : T { };
|
|
typedef DerivedClassTmpl<RefCntblBase> Foo;
|
|
|
|
|
|
|
|
struct RandomBase {};
|
|
struct RandomDerivedClass : RandomBase { };
|
|
|
|
|
|
|
|
struct FakeRefCntblBase1 {
|
|
private:
|
|
void ref() {}
|
|
void deref() {}
|
|
};
|
|
struct Quiet1 : FakeRefCntblBase1 {};
|
|
|
|
struct FakeRefCntblBase2 {
|
|
protected:
|
|
void ref() {}
|
|
void deref() {}
|
|
};
|
|
struct Quiet2 : FakeRefCntblBase2 {};
|
|
|
|
class FakeRefCntblBase3 {
|
|
void ref() {}
|
|
void deref() {}
|
|
};
|
|
struct Quiet3 : FakeRefCntblBase3 {};
|
|
struct Quiet4 : private RefCntblBase {};
|
|
class Quiet5 : RefCntblBase {};
|
|
|
|
void foo () {
|
|
Derived d;
|
|
}
|