compilerplugins/clang/selfinit.cxx           |   88 +++++++++++++++++++++++++++
 compilerplugins/clang/test/selfinit.cxx      |   33 ++++++++++
 solenv/CompilerTest_compilerplugins_clang.mk |    1 
 3 files changed, 122 insertions(+)

New commits:
commit 05a0c51ced86460b273a24f5884c99f46d8aae0d
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Wed Apr 17 19:08:16 2019 +0200
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Wed Apr 17 21:59:53 2019 +0200

    New loplugin:selfinit
    
    ...to find more bugs like the one addressed in
    6340daac7b99c65249363a4bb61c492de31ef5d6 "Revert broken
    loplugin:sequentialassign change".  What it does is:  "Warn when a variable 
is
    referenced from its own initializer.  This is not invalid in general (see 
C++17
    [basic.life]), but is at least suspicious."  It found one false positive
    (addressed with 884ad0d1af88f9985d30ef0dfe92d89e82f8e576 "Split
    localProcessFactory function into class with setter and getter") and five 
true
    positives (addressed with e0ccbe72ed6eb0d309ed272a78fd67a512acff5d "Fix use 
of
    variable before its lifetime begins" and
    0e335af4d3f044511551fa2ede20911beaee9b41 "Fix uses of variables before their
    lifetimes begin").
    
    Change-Id: I4c45cceaa042e93b37ad24a54784c027f6ca1f87
    Reviewed-on: https://gerrit.libreoffice.org/70897
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/compilerplugins/clang/selfinit.cxx 
b/compilerplugins/clang/selfinit.cxx
new file mode 100644
index 000000000000..35ce37278f2a
--- /dev/null
+++ b/compilerplugins/clang/selfinit.cxx
@@ -0,0 +1,88 @@
+/* -*- 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 <vector>
+
+#include "plugin.hxx"
+
+// Warn when a variable is referenced from its own initializer.  This is not 
invalid in general (see
+// C++17 [basic.life]), but is at least suspicious.
+
+namespace
+{
+class SelfInit : public loplugin::FilteringPlugin<SelfInit>
+{
+public:
+    explicit SelfInit(loplugin::InstantiationData const& data)
+        : FilteringPlugin(data)
+    {
+    }
+
+    bool TraverseVarDecl(VarDecl* decl)
+    {
+        decls_.push_back({ decl, decl->getCanonicalDecl() });
+        auto const ret = FilteringPlugin::TraverseVarDecl(decl);
+        decls_.pop_back();
+        return ret;
+    }
+
+    bool TraverseUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr* expr)
+    {
+        if (expr->getKind() == UETT_SizeOf)
+        {
+            return true;
+        }
+        return FilteringPlugin::TraverseUnaryExprOrTypeTraitExpr(expr);
+    }
+
+    bool TraverseCXXTypeidExpr(CXXTypeidExpr const*) { return true; }
+
+    bool TraverseCXXNoexceptExpr(CXXNoexceptExpr const*) { return true; }
+
+    bool TraverseDecltypeTypeLoc(DecltypeTypeLoc) { return true; }
+
+    bool VisitDeclRefExpr(DeclRefExpr const* expr)
+    {
+        if (ignoreLocation(expr))
+        {
+            return true;
+        }
+        for (auto const& i : decls_)
+        {
+            if (expr->getDecl()->getCanonicalDecl() == i.canonical)
+            {
+                report(
+                    DiagnosticsEngine::Warning,
+                    ("referencing a variable during its own initialization is 
error-prone and thus"
+                     " suspicious"),
+                    expr->getLocation())
+                    << expr->getSourceRange();
+                report(DiagnosticsEngine::Note, "variable declared here", 
i.current->getLocation())
+                    << i.current->getSourceRange();
+            }
+        }
+        return true;
+    }
+
+private:
+    void run() override { 
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); }
+
+    struct Decl
+    {
+        VarDecl const* current;
+        VarDecl const* canonical;
+    };
+
+    std::vector<Decl> decls_;
+};
+
+loplugin::Plugin::Registration<SelfInit> X("selfinit");
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/compilerplugins/clang/test/selfinit.cxx 
b/compilerplugins/clang/test/selfinit.cxx
new file mode 100644
index 000000000000..412a65b7060f
--- /dev/null
+++ b/compilerplugins/clang/test/selfinit.cxx
@@ -0,0 +1,33 @@
+/* -*- 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 <typeinfo>
+
+extern int i;
+int i = i;
+// expected-error@-1 {{referencing a variable during its own initialization is 
error-prone and thus suspicious [loplugin:selfinit]}}
+// expected-note@-2 {{variable declared here [loplugin:selfinit]}}
+
+int j = [](int n) { return j + n; }(0);
+// expected-error@-1 {{referencing a variable during its own initialization is 
error-prone and thus suspicious [loplugin:selfinit]}}
+// expected-note@-2 {{variable declared here [loplugin:selfinit]}}
+
+int k = sizeof k;
+
+int f(std::type_info const&);
+
+int l = f(typeid(l));
+
+bool m = noexcept(m);
+
+template <typename T> int g();
+
+int n = g<decltype(n)>();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk 
b/solenv/CompilerTest_compilerplugins_clang.mk
index 6128f8a4ed47..ff71625bc3a5 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -51,6 +51,7 @@ $(eval $(call 
gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
     compilerplugins/clang/test/salcall \
     compilerplugins/clang/test/sallogareas \
     compilerplugins/clang/test/salunicodeliteral \
+    compilerplugins/clang/test/selfinit \
     compilerplugins/clang/test/sequentialassign \
     compilerplugins/clang/test/shouldreturnbool \
     compilerplugins/clang/test/simplifybool \
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to