Kaydet (Commit) ae680f7c authored tarafından Noel Grandin's avatar Noel Grandin

make useuniqueptr loplugin check child compound statements

where the child compound statement is unconditional

Change-Id: I755e7ee9134bde81811a694d42a996d3eaae3fc2
Reviewed-on: https://gerrit.libreoffice.org/53763Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst ee3898f9
...@@ -162,4 +162,14 @@ class Foo13 { ...@@ -162,4 +162,14 @@ class Foo13 {
DELETEZ(m_pbar2); // expected-error {{unconditional call to delete on a member, should be using std::unique_ptr [loplugin:useuniqueptr]}} DELETEZ(m_pbar2); // expected-error {{unconditional call to delete on a member, should be using std::unique_ptr [loplugin:useuniqueptr]}}
} }
}; };
// check for unconditional inner compound statements
class Foo14 {
int * m_pbar1; // expected-note {{member is here [loplugin:useuniqueptr]}}
~Foo14()
{
{
delete m_pbar1; // expected-error {{unconditional call to delete on a member, should be using std::unique_ptr [loplugin:useuniqueptr]}}
}
}
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
...@@ -52,6 +52,7 @@ public: ...@@ -52,6 +52,7 @@ public:
bool VisitCXXMethodDecl(const CXXMethodDecl* ); bool VisitCXXMethodDecl(const CXXMethodDecl* );
bool VisitCompoundStmt(const CompoundStmt* ); bool VisitCompoundStmt(const CompoundStmt* );
private: private:
void CheckCompoundStmt(const CXXMethodDecl*, const CompoundStmt* );
void CheckForUnconditionalDelete(const CXXMethodDecl*, const CompoundStmt* ); void CheckForUnconditionalDelete(const CXXMethodDecl*, const CompoundStmt* );
void CheckForSimpleDelete(const CXXMethodDecl*, const CompoundStmt* ); void CheckForSimpleDelete(const CXXMethodDecl*, const CompoundStmt* );
void CheckRangedLoopDelete(const CXXMethodDecl*, const CXXForRangeStmt* ); void CheckRangedLoopDelete(const CXXMethodDecl*, const CXXForRangeStmt* );
...@@ -74,6 +75,13 @@ bool UseUniquePtr::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl) ...@@ -74,6 +75,13 @@ bool UseUniquePtr::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
if (!compoundStmt || compoundStmt->size() == 0) if (!compoundStmt || compoundStmt->size() == 0)
return true; return true;
CheckCompoundStmt(methodDecl, compoundStmt);
return true;
}
void UseUniquePtr::CheckCompoundStmt(const CXXMethodDecl* methodDecl, const CompoundStmt* compoundStmt)
{
CheckForSimpleDelete(methodDecl, compoundStmt); CheckForSimpleDelete(methodDecl, compoundStmt);
for (auto i = compoundStmt->body_begin(); i != compoundStmt->body_end(); ++i) for (auto i = compoundStmt->body_begin(); i != compoundStmt->body_end(); ++i)
...@@ -84,9 +92,10 @@ bool UseUniquePtr::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl) ...@@ -84,9 +92,10 @@ bool UseUniquePtr::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
CheckLoopDelete(methodDecl, forStmt->getBody()); CheckLoopDelete(methodDecl, forStmt->getBody());
else if (auto whileStmt = dyn_cast<WhileStmt>(*i)) else if (auto whileStmt = dyn_cast<WhileStmt>(*i))
CheckLoopDelete(methodDecl, whileStmt->getBody()); CheckLoopDelete(methodDecl, whileStmt->getBody());
// check for unconditional inner compound statements
else if (auto innerCompoundStmt = dyn_cast<CompoundStmt>(*i))
CheckCompoundStmt(methodDecl, innerCompoundStmt);
} }
return true;
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment