diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2022-03-16 14:23:07 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2022-03-16 16:09:34 +0100 |
commit | 0c50141cfc475768debb77127bc8ebb173b4a30f (patch) | |
tree | 1801ebca3467b4da73b2ea8dde8120b481884a2c /compilerplugins | |
parent | 26623cc6c144c451323a08be7bd021ae354b1a95 (diff) |
Fix loplugin:trivialconstructor handling of ctor templates
Change-Id: Ic8b2f26498099c77b834d8e152f06d2834dfee3a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131658
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/test/trivialconstructor.cxx | 46 | ||||
-rw-r--r-- | compilerplugins/clang/trivialconstructor.cxx | 16 |
2 files changed, 58 insertions, 4 deletions
diff --git a/compilerplugins/clang/test/trivialconstructor.cxx b/compilerplugins/clang/test/trivialconstructor.cxx new file mode 100644 index 000000000000..ef17e9c60fee --- /dev/null +++ b/compilerplugins/clang/test/trivialconstructor.cxx @@ -0,0 +1,46 @@ +/* -*- 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/. + */ + +struct S1 +{ + // expected-error@+1 {{no need for explicit constructor decl [loplugin:trivialconstructor]}} + S1() {} +}; + +struct S2 +{ + S2() {} + S2(int) {} +}; + +struct S3 +{ + S3() {} + template <typename T> S3(T); +}; + +template <typename> struct S4 +{ + // expected-error@+1 {{no need for explicit constructor decl [loplugin:trivialconstructor]}} + S4() {} +}; + +template <typename> struct S5 +{ + S5() {} + S5(int); +}; + +template <typename> struct S6 +{ + S6() {} + template <typename T> S6(T); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/compilerplugins/clang/trivialconstructor.cxx b/compilerplugins/clang/trivialconstructor.cxx index 6f5bb640b760..dd830058fac9 100644 --- a/compilerplugins/clang/trivialconstructor.cxx +++ b/compilerplugins/clang/trivialconstructor.cxx @@ -65,13 +65,21 @@ bool TrivialConstructor::VisitCXXConstructorDecl(CXXConstructorDecl const* const const CXXRecordDecl* recordDecl = constructorDecl->getParent(); if (std::distance(recordDecl->ctor_begin(), recordDecl->ctor_end()) != 1) return true; + // Constructor templates are not included in ctor_begin()..ctor_end() above, so also do a slow + // check across all decls(): + for (auto d : recordDecl->decls()) + { + if (auto const d2 = dyn_cast<FunctionTemplateDecl>(d)) + { + if (isa<CXXConstructorDecl>(d2->getTemplatedDecl())) + { + return true; + } + } + } if (!HasTrivialConstructorBody(recordDecl, recordDecl)) return true; - // template magic in sc/inc/stlalgorithm.hxx - if (recordDecl->getIdentifier() && recordDecl->getName() == "AlignedAllocator") - return true; - report(DiagnosticsEngine::Warning, "no need for explicit constructor decl", constructorDecl->getLocation()) << constructorDecl->getSourceRange(); |