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, \
|
$(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
|
||||||
compilerplugins/clang/test/datamembershadow \
|
compilerplugins/clang/test/datamembershadow \
|
||||||
compilerplugins/clang/test/finalprotected \
|
compilerplugins/clang/test/finalprotected \
|
||||||
|
compilerplugins/clang/test/oslendian-1 \
|
||||||
|
compilerplugins/clang/test/oslendian-2 \
|
||||||
|
compilerplugins/clang/test/oslendian-3 \
|
||||||
compilerplugins/clang/test/salbool \
|
compilerplugins/clang/test/salbool \
|
||||||
))
|
))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user