summaryrefslogtreecommitdiffstats
path: root/compilerplugins
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/test/unusedmember.cxx30
-rw-r--r--compilerplugins/clang/unusedmember.cxx15
2 files changed, 40 insertions, 5 deletions
diff --git a/compilerplugins/clang/test/unusedmember.cxx b/compilerplugins/clang/test/unusedmember.cxx
index 00b136249aca..a495b786919e 100644
--- a/compilerplugins/clang/test/unusedmember.cxx
+++ b/compilerplugins/clang/test/unusedmember.cxx
@@ -13,15 +13,35 @@ namespace
{
struct S
{
- enum E
+ enum E1
{
- E1,
- E2
+ E11,
+ E12
+ };
+ E1 e1;
+ enum E2
+ {
+ E21,
+ E22
};
- E e;
+ E2 e2; // expected-error {{unused class member [loplugin:unusedmember]}}
+ enum E3
+ {
+ E31,
+ E32
+ } e3;
+ enum E4
+ {
+ E41,
+ E42
+ } e4; // expected-error {{unused class member [loplugin:unusedmember]}}
};
}
-void f(S s) { (void)s.e; }
+void f(S s)
+{
+ (void)s.e1;
+ (void)s.e3;
+}
}
namespace ElaboratedEnum
diff --git a/compilerplugins/clang/unusedmember.cxx b/compilerplugins/clang/unusedmember.cxx
index bfd4f591616d..8239b5ae1d8d 100644
--- a/compilerplugins/clang/unusedmember.cxx
+++ b/compilerplugins/clang/unusedmember.cxx
@@ -94,6 +94,21 @@ public:
#endif
+ bool VisitDeclaratorDecl(DeclaratorDecl const* decl)
+ {
+ // For declarations like
+ //
+ // enum E { ... } e;
+ //
+ // it may be that the declaration of E is not marked as referenced even though the
+ // declaration of e clearly references it:
+ if (auto const t = decl->getType()->getAs<EnumType>())
+ {
+ deferred_.erase(t->getDecl());
+ }
+ return true;
+ }
+
bool VisitCXXRecordDecl(CXXRecordDecl const* decl) //TODO: non-CXX RecordDecl?
{
if (ignoreLocation(decl))