diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2016-06-28 18:54:31 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2016-06-28 20:33:58 +0000 |
commit | 0d3738a2580d72b778547bfcdf691fdeb0eccbdd (patch) | |
tree | 4f090456b67ad95f568e041c75db8b5cdcb6a1b7 /compilerplugins/clang/check.cxx | |
parent | 886637d355e77cd61d85279f145c06b07385fecd (diff) |
More Clang 3.4 "(anonymous namespace)" fixes
Change-Id: I7cb43f915565dadd611b90ee30373e472f97efb5
Reviewed-on: https://gerrit.libreoffice.org/26748
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang/check.cxx')
-rw-r--r-- | compilerplugins/clang/check.cxx | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/compilerplugins/clang/check.cxx b/compilerplugins/clang/check.cxx new file mode 100644 index 000000000000..c66a9026422e --- /dev/null +++ b/compilerplugins/clang/check.cxx @@ -0,0 +1,106 @@ +/* -*- 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 <cassert> + +#include "check.hxx" +#include "compat.hxx" + +namespace loplugin { + +TypeCheck TypeCheck::Const() const { + return + (!type_.isNull() && type_.isConstQualified() + && !type_.isVolatileQualified()) + ? *this : TypeCheck(); + // returning TypeCheck(type_.getUnqualifiedType()) instead of *this + // may look tempting, but could remove sugar we might be interested in + // checking for +} + +TerminalCheck TypeCheck::Char() const { + return TerminalCheck( + !type_.isNull() + && (type_->isSpecificBuiltinType(clang::BuiltinType::Char_S) + || type_->isSpecificBuiltinType(clang::BuiltinType::Char_U))); +} + +TerminalCheck TypeCheck::AnyBoolean() const { + if (type_->isBooleanType()) { + return TerminalCheck(true); + } + auto t = type_->getAs<clang::TypedefType>(); + if (t == nullptr) { + return TerminalCheck(false); + } + auto n =t->getDecl()->getName(); + return TerminalCheck( + n == "sal_Bool" || n == "BOOL" || n == "Boolean" || n == "FT_Bool" + || n == "FcBool" || n == "GLboolean" || n == "NPBool" || n == "UBool" + || n == "dbus_bool_t" || n == "gboolean" || n == "hb_bool_t" + || n == "jboolean"); +} + +TypeCheck TypeCheck::LvalueReference() const { + if (!type_.isNull()) { + auto const t = type_->getAs<clang::LValueReferenceType>(); + if (t != nullptr) { + return TypeCheck(t->getPointeeType()); + } + } + return TypeCheck(); +} + +TypeCheck TypeCheck::Pointer() const { + if (!type_.isNull()) { + auto const t = type_->getAs<clang::PointerType>(); + if (t != nullptr) { + return TypeCheck(t->getPointeeType()); + } + } + return TypeCheck(); +} + +TypeCheck TypeCheck::NotSubstTemplateTypeParmType() const { + return + (!type_.isNull() + && type_->getAs<clang::SubstTemplateTypeParmType>() == nullptr) + ? *this : TypeCheck(); +} + +ContextCheck DeclCheck::Operator(clang::OverloadedOperatorKind op) const { + assert(op != clang::OO_None); + auto f = llvm::dyn_cast_or_null<clang::FunctionDecl>(decl_); + return ContextCheck( + f != nullptr && f->getOverloadedOperator() == op + ? f->getDeclContext() : nullptr); +} + +TerminalCheck ContextCheck::GlobalNamespace() const { + return TerminalCheck( + context_ != nullptr + && ((compat::isLookupContext(*context_) + ? context_ : context_->getLookupParent()) + ->isTranslationUnit())); +} + +TerminalCheck ContextCheck::StdNamespace() const { + return TerminalCheck( + context_ != nullptr && compat::isStdNamespace(*context_)); +} + +ContextCheck ContextCheck::AnonymousNamespace() const { + auto n = llvm::dyn_cast_or_null<clang::NamespaceDecl>(context_); + return ContextCheck( + n != nullptr && n->isAnonymousNamespace() ? n->getParent() : nullptr); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |