From 61e94390a3b86024b76c3418fe8c5e517c5c5123 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Fri, 22 Jun 2018 11:56:37 +0200 Subject: new loplugin simplifyconstruct no need to init smart pointers with nullptr, they all have default constructors that do this already Change-Id: Ief20c060daa0def8c1aa82f1cf8dc4bc696761e9 Reviewed-on: https://gerrit.libreoffice.org/59818 Tested-by: Jenkins Reviewed-by: Noel Grandin --- compilerplugins/clang/simplifyconstruct.cxx | 68 ++++++++++++++++++++++++ compilerplugins/clang/test/simplifyconstruct.cxx | 30 +++++++++++ 2 files changed, 98 insertions(+) create mode 100644 compilerplugins/clang/simplifyconstruct.cxx create mode 100644 compilerplugins/clang/test/simplifyconstruct.cxx (limited to 'compilerplugins') diff --git a/compilerplugins/clang/simplifyconstruct.cxx b/compilerplugins/clang/simplifyconstruct.cxx new file mode 100644 index 000000000000..2a80cdefe4b2 --- /dev/null +++ b/compilerplugins/clang/simplifyconstruct.cxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include "plugin.hxx" +#include "check.hxx" + +namespace +{ +class SimplifyConstruct : public RecursiveASTVisitor, public loplugin::Plugin +{ +public: + explicit SimplifyConstruct(loplugin::InstantiationData const& data) + : Plugin(data) + { + } + + virtual void run() override { TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); } + + bool VisitCXXConstructExpr(CXXConstructExpr const*); + + // ignore some contexts within which nullptr is fine + bool TraverseReturnStmt(ReturnStmt*) { return true; } + bool TraverseInitListExpr(InitListExpr*) { return true; } + bool TraverseCXXBindTemporaryExpr(CXXBindTemporaryExpr*) { return true; } +}; + +bool SimplifyConstruct::VisitCXXConstructExpr(CXXConstructExpr const* constructExpr) +{ + if (ignoreLocation(constructExpr)) + return true; + auto tc = loplugin::TypeCheck(constructExpr->getType()); + if (!tc.Class("unique_ptr").StdNamespace() && !tc.Class("shared_ptr").StdNamespace() + && !tc.Class("SvRef").Namespace("tools").GlobalNamespace() + && !tc.Class("Reference").Namespace("rtl").GlobalNamespace() + && !tc.Class("Reference") + .Namespace("uno") + .Namespace("star") + .Namespace("sun") + .Namespace("com") + .GlobalNamespace()) + return true; + if (constructExpr->getNumArgs() > 0 + && isa(constructExpr->getArg(0)->IgnoreParenImpCasts())) + { + report(DiagnosticsEngine::Warning, + "no need to explicitly init this with nullptr, just use default constructor", + constructExpr->getSourceRange().getBegin()) + << constructExpr->getSourceRange(); + } + return true; +} + +loplugin::Plugin::Registration X("simplifyconstruct", true); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/compilerplugins/clang/test/simplifyconstruct.cxx b/compilerplugins/clang/test/simplifyconstruct.cxx new file mode 100644 index 000000000000..ce8a70aab272 --- /dev/null +++ b/compilerplugins/clang/test/simplifyconstruct.cxx @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +struct Foo +{ + void acquire(); + void release(); +}; +class Foo16 +{ + std::unique_ptr m_pbar1; + rtl::Reference m_pbar2; + Foo16() + : m_pbar1(nullptr) + // expected-error@-1 {{no need to explicitly init this with nullptr, just use default constructor [loplugin:simplifyconstruct]}} + , m_pbar2(nullptr) + // expected-error@-1 {{no need to explicitly init this with nullptr, just use default constructor [loplugin:simplifyconstruct]}} + { + } +}; +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ -- cgit