New loplugin:oslendian
...to catch new places where defined'ness of OSL_BIG/LITENDIAN would be checked without osl/endian.h being included; cf. e2f08f9def0869460ad38a1c2adb450778290f6e "connectivity, sc: add missing #include <osl/endian.h>" and 2b14fb3a4f92b928f0a5fc536c6a5f4a6e51a9b8 "cppcanvas, oox: add missing #include <osl/endian.h>". Change-Id: I167c8916a01391b7dacad7325153ccf35d3ba9dc
This commit is contained in:
parent
37a14c5e35
commit
0de1b34a89
116
compilerplugins/clang/oslendian.cxx
Normal file
116
compilerplugins/clang/oslendian.cxx
Normal file
@ -0,0 +1,116 @@
|
||||
/* -*- 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: */
|
47
compilerplugins/clang/test/oslendian-1.cxx
Normal file
47
compilerplugins/clang/test/oslendian-1.cxx
Normal file
@ -0,0 +1,47 @@
|
||||
/* -*- 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: */
|
23
compilerplugins/clang/test/oslendian-2.cxx
Normal file
23
compilerplugins/clang/test/oslendian-2.cxx
Normal file
@ -0,0 +1,23 @@
|
||||
/* -*- 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: */
|
25
compilerplugins/clang/test/oslendian-3.cxx
Normal file
25
compilerplugins/clang/test/oslendian-3.cxx
Normal file
@ -0,0 +1,25 @@
|
||||
/* -*- 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 \
|
||||
))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user