Kaydet (Commit) 0de1b34a authored tarafından Stephan Bergmann's avatar Stephan Bergmann

New loplugin:oslendian

...to catch new places where defined'ness of OSL_BIG/LITENDIAN would be checked
without osl/endian.h being included; cf.
e2f08f9d "connectivity, sc: add missing #include
<osl/endian.h>" and 2b14fb3a "cppcanvas, oox:
add missing #include <osl/endian.h>".

Change-Id: I167c8916a01391b7dacad7325153ccf35d3ba9dc
üst 37a14c5e
/* -*- 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 <cassert>
#include "compat.hxx"
#include "plugin.hxx"
namespace {
class OslEndian: public loplugin::Plugin, public PPCallbacks {
public:
explicit OslEndian(InstantiationData const & data): Plugin(data) {
compat::addPPCallbacks(compiler.getPreprocessor(), this);
}
enum { isPPCallback = true };
private:
void run() override {}
void MacroDefined(Token const & MacroNameTok, MacroDirective const *)
override
{
auto id = MacroNameTok.getIdentifierInfo()->getName();
if (id == "OSL_BIGENDIAN") {
if (definedLit_.isValid()) {
report(
DiagnosticsEngine::Warning,
"macro %0 defined in addition to 'OSL_LITENDIAN'",
MacroNameTok.getLocation())
<< MacroNameTok.getIdentifierInfo();
report(
DiagnosticsEngine::Note,
"conflicting macro definition is here", definedLit_);
}
definedBig_ = MacroNameTok.getLocation();
assert(definedBig_.isValid());
} else if (id == "OSL_LITENDIAN") {
if (definedBig_.isValid()) {
report(
DiagnosticsEngine::Warning,
"macro %0 defined in addition to 'OSL_BIGENDIAN'",
MacroNameTok.getLocation())
<< MacroNameTok.getIdentifierInfo();
report(
DiagnosticsEngine::Note,
"conflicting macro definition is here", definedBig_);
}
definedLit_ = MacroNameTok.getLocation();
assert(definedLit_.isValid());
}
}
void MacroUndefined(Token const & MacroNameTok, MacroDefinition const &)
override
{
auto id = MacroNameTok.getIdentifierInfo()->getName();
if (id == "OSL_BIGENDIAN" || id == "OSL_LITENDIAN") {
report(
DiagnosticsEngine::Warning, "macro %0 undefinition",
MacroNameTok.getLocation())
<< MacroNameTok.getIdentifierInfo();
}
}
void Defined(
Token const & MacroNameTok, MacroDefinition const &, SourceRange)
override
{
check(MacroNameTok);
}
void Ifdef(
SourceLocation, Token const & MacroNameTok, MacroDefinition const &)
override
{
check(MacroNameTok);
}
void Ifndef(
SourceLocation, Token const & MacroNameTok, MacroDefinition const &)
override
{
check(MacroNameTok);
}
void check(Token const & macro) const {
auto id = macro.getIdentifierInfo()->getName();
if ((id == "OSL_BIGENDIAN" || id == "OSL_LITENDIAN")
&& definedBig_.isInvalid() && definedLit_.isInvalid())
{
report(
DiagnosticsEngine::Warning,
"definition of macro %0 checked but 'osl/endian.h' is not"
" included",
macro.getLocation())
<< macro.getIdentifierInfo();
}
}
SourceLocation definedBig_;
SourceLocation definedLit_;
};
loplugin::Plugin::Registration<OslEndian> X("oslendian");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
/* -*- 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 <sal/config.h>
#include <osl/endian.h>
#if defined OSL_BIGENDIAN || defined OSL_LITENDIAN
#endif
#ifdef OSL_BIGENDIAN
#endif
#ifdef OSL_LITENDIAN
#endif
#ifndef OSL_BIGENDIAN
#endif
#ifndef OSL_LITENDIAN
#endif
#if !defined OSL_BIGENDIAN
#define OSL_BIGENDIAN
// expected-error@-1 {{macro 'OSL_BIGENDIAN' defined in addition to 'OSL_LITENDIAN' [loplugin:oslendian]}}
// expected-note@osl/endian.h:* {{conflicting macro definition is here [loplugin:oslendian]}}
#endif
#if !defined OSL_LITENDIAN
#define OSL_LITENDIAN
// expected-error@-1 {{macro 'OSL_LITENDIAN' defined in addition to 'OSL_BIGENDIAN' [loplugin:oslendian]}}
// expected-note@osl/endian.h:* {{conflicting macro definition is here [loplugin:oslendian]}}
#endif
#if defined OSL_BIGENDIAN
#undef OSL_BIGENDIAN
// expected-error@-1 {{macro 'OSL_BIGENDIAN' undefinition [loplugin:oslendian]}}
#endif
#if defined OSL_LITENDIAN
#undef OSL_LITENDIAN
// expected-error@-1 {{macro 'OSL_LITENDIAN' undefinition [loplugin:oslendian]}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
/* -*- 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 <sal/config.h>
#if defined OSL_BIGENDIAN || defined OSL_LITENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}} // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifdef OSL_BIGENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifdef OSL_LITENDIAN // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifndef OSL_BIGENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifndef OSL_LITENDIAN // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
/* -*- 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 <sal/config.h>
#if defined OSL_BIGENDIAN || defined OSL_LITENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}} // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifdef OSL_BIGENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifdef OSL_LITENDIAN // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifndef OSL_BIGENDIAN // expected-error {{definition of macro 'OSL_BIGENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#ifndef OSL_LITENDIAN // expected-error {{definition of macro 'OSL_LITENDIAN' checked but 'osl/endian.h' is not included [loplugin:oslendian]}}
#endif
#include <osl/endian.h>
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
......@@ -12,6 +12,9 @@ $(eval $(call gb_CompilerTest_CompilerTest,compilerplugins_clang))
$(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
compilerplugins/clang/test/datamembershadow \
compilerplugins/clang/test/finalprotected \
compilerplugins/clang/test/oslendian-1 \
compilerplugins/clang/test/oslendian-2 \
compilerplugins/clang/test/oslendian-3 \
compilerplugins/clang/test/salbool \
))
......
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