summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2018-05-03 21:13:35 +0200
committerStephan Bergmann <sbergman@redhat.com>2018-05-04 13:56:51 +0200
commitb72a31b37f9bdcfd3f59b3256b465bf0fb5a50ca (patch)
tree80d44735a1106b93463ae36150a3302689ffde85 /compilerplugins
parentfe18111ac42101e6653402c214f7fc1df03acd43 (diff)
Adapt to Clang trunk SourceManager::getImmediateExpansionRange changes
...of <http://llvm.org/viewvc/llvm-project?view=revision&revision=331155> "PR37189 Fix incorrect end source location and spelling for a split '>>' token", changing (among others) the return type of getImmediateExpansionRange from a std::pair of token locations to CharSourceRange (which will typically also represent token locations, but might also represent char locations). For now, map the return value of getImmediateExpansionRange back to a std::pair (as expected by our compilerplugins code in its current form), and mark the char location case with a TODO (which will need to be addressed if any of our plugins starts to produce wrong results due to not handling that char location case). In the long run, we should instead adapt our code to use the new return type of getImmediateExpansionRange directly. Change-Id: Idc2f5dc43830af4798b55bf605976c4ab146c522 Reviewed-on: https://gerrit.libreoffice.org/53817 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/compat.hxx12
-rw-r--r--compilerplugins/clang/constparams.cxx2
-rw-r--r--compilerplugins/clang/cppunitassertequals.cxx3
-rw-r--r--compilerplugins/clang/cstylecast.cxx24
-rw-r--r--compilerplugins/clang/literaltoboolconversion.cxx4
-rw-r--r--compilerplugins/clang/nullptr.cxx11
-rw-r--r--compilerplugins/clang/salcall.cxx2
-rw-r--r--compilerplugins/clang/sallogareas.cxx3
8 files changed, 39 insertions, 22 deletions
diff --git a/compilerplugins/clang/compat.hxx b/compilerplugins/clang/compat.hxx
index 5a540b8ef695..e77846ab1166 100644
--- a/compilerplugins/clang/compat.hxx
+++ b/compilerplugins/clang/compat.hxx
@@ -11,6 +11,7 @@
#define INCLUDED_COMPILERPLUGINS_CLANG_COMPAT_HXX
#include <cstddef>
+#include <utility>
#include "clang/AST/Decl.h"
#include "clang/AST/Expr.h"
@@ -49,6 +50,17 @@ inline clang::FunctionDecl::param_const_range parameters(
}
#endif
+inline std::pair<clang::SourceLocation, clang::SourceLocation> getImmediateExpansionRange(
+ clang::SourceManager const & SM, clang::SourceLocation Loc)
+{
+#if CLANG_VERSION >= 70000
+ auto const csr = SM.getImmediateExpansionRange(Loc);
+ if (csr.isCharRange()) { /*TODO*/ }
+ return {csr.getBegin(), csr.getEnd()};
+#else
+ return SM.getImmediateExpansionRange(Loc);
+#endif
+}
inline bool isPointWithin(
clang::SourceManager const & SM, clang::SourceLocation Location, clang::SourceLocation Start,
diff --git a/compilerplugins/clang/constparams.cxx b/compilerplugins/clang/constparams.cxx
index 89be6f684033..471da7367dc0 100644
--- a/compilerplugins/clang/constparams.cxx
+++ b/compilerplugins/clang/constparams.cxx
@@ -179,7 +179,7 @@ bool ConstParams::CheckTraverseFunctionDecl(FunctionDecl * functionDecl)
canonicalDecl->getLocStart(), compiler.getSourceManager(), compiler.getLangOpts()) };
if (name.startswith("DECL_LINK") || name.startswith("DECL_STATIC_LINK"))
return false;
- auto loc2 = compiler.getSourceManager().getImmediateExpansionRange(canonicalDecl->getLocStart()).first;
+ auto loc2 = compat::getImmediateExpansionRange(compiler.getSourceManager(), canonicalDecl->getLocStart()).first;
if (compiler.getSourceManager().isMacroBodyExpansion(loc2))
{
StringRef name2 { Lexer::getImmediateMacroName(
diff --git a/compilerplugins/clang/cppunitassertequals.cxx b/compilerplugins/clang/cppunitassertequals.cxx
index 5b0f8f5278c4..cff8908c7a46 100644
--- a/compilerplugins/clang/cppunitassertequals.cxx
+++ b/compilerplugins/clang/cppunitassertequals.cxx
@@ -9,6 +9,7 @@
#include "plugin.hxx"
#include "check.hxx"
+#include "compat.hxx"
/**
Check for calls to CPPUNIT_ASSERT when it should be using CPPUNIT_ASSERT_EQUALS
@@ -95,7 +96,7 @@ bool CppunitAssertEquals::VisitCallExpr(const CallExpr* callExpr)
<< callExpr->getSourceRange();
return true;
}
- auto range = compiler.getSourceManager().getImmediateExpansionRange(loc);
+ auto range = compat::getImmediateExpansionRange(compiler.getSourceManager(), loc);
checkExpr(
SourceRange(range.first, range.second), name,
e2->IgnoreParenImpCasts(), false);
diff --git a/compilerplugins/clang/cstylecast.cxx b/compilerplugins/clang/cstylecast.cxx
index 228e3878e5eb..4bf3aaf6460f 100644
--- a/compilerplugins/clang/cstylecast.cxx
+++ b/compilerplugins/clang/cstylecast.cxx
@@ -12,6 +12,8 @@
#include <limits>
#include <set>
#include <string>
+
+#include "compat.hxx"
#include "plugin.hxx"
//
@@ -351,7 +353,7 @@ bool CStyleCast::isLastTokenOfImmediateMacroBodyExpansion(
assert(MI != nullptr);
if (spell == MI->getDefinitionEndLoc()) {
if (macroEnd != nullptr) {
- *macroEnd = compiler.getSourceManager().getImmediateExpansionRange(loc).second;
+ *macroEnd = compat::getImmediateExpansionRange(compiler.getSourceManager(), loc).second;
}
return true;
}
@@ -391,8 +393,8 @@ bool CStyleCast::rewriteArithmeticCast(CStyleCastExpr const * expr, char const *
auto secondBegin = expr->getRParenLoc();
while (compiler.getSourceManager().isMacroArgExpansion(firstBegin)
&& compiler.getSourceManager().isMacroArgExpansion(secondBegin)
- && (compiler.getSourceManager().getImmediateExpansionRange(firstBegin)
- == compiler.getSourceManager().getImmediateExpansionRange(secondBegin)))
+ && (compat::getImmediateExpansionRange(compiler.getSourceManager(), firstBegin)
+ == compat::getImmediateExpansionRange(compiler.getSourceManager(), secondBegin)))
{
firstBegin = compiler.getSourceManager().getImmediateSpellingLoc(firstBegin);
secondBegin = compiler.getSourceManager().getImmediateSpellingLoc(secondBegin);
@@ -424,14 +426,14 @@ bool CStyleCast::rewriteArithmeticCast(CStyleCastExpr const * expr, char const *
// FOO((y))
while (compiler.getSourceManager().isMacroArgExpansion(third)
&& compiler.getSourceManager().isMacroArgExpansion(fourth)
- && (compiler.getSourceManager().getImmediateExpansionRange(third)
- == compiler.getSourceManager().getImmediateExpansionRange(fourth))
+ && (compat::getImmediateExpansionRange(compiler.getSourceManager(), third)
+ == compat::getImmediateExpansionRange(compiler.getSourceManager(), fourth))
&& compiler.getSourceManager().isAtStartOfImmediateMacroExpansion(third))
//TODO: check fourth is at end of immediate macro expansion, but
// SourceManager::isAtEndOfImmediateMacroExpansion requires a location pointing at the
// character end of the last token
{
- auto const range = compiler.getSourceManager().getImmediateExpansionRange(third);
+ auto const range = compat::getImmediateExpansionRange(compiler.getSourceManager(), third);
third = range.first;
fourth = range.second;
macro = true;
@@ -439,8 +441,8 @@ bool CStyleCast::rewriteArithmeticCast(CStyleCastExpr const * expr, char const *
}
while (compiler.getSourceManager().isMacroArgExpansion(third)
&& compiler.getSourceManager().isMacroArgExpansion(fourth)
- && (compiler.getSourceManager().getImmediateExpansionRange(third)
- == compiler.getSourceManager().getImmediateExpansionRange(fourth)))
+ && (compat::getImmediateExpansionRange(compiler.getSourceManager(), third)
+ == compat::getImmediateExpansionRange(compiler.getSourceManager(), fourth)))
{
third = compiler.getSourceManager().getImmediateSpellingLoc(third);
fourth = compiler.getSourceManager().getImmediateSpellingLoc(fourth);
@@ -474,7 +476,8 @@ bool CStyleCast::rewriteArithmeticCast(CStyleCastExpr const * expr, char const *
}
break;
}
- auto const range = compiler.getSourceManager().getImmediateExpansionRange(third);
+ auto const range = compat::getImmediateExpansionRange(
+ compiler.getSourceManager(), third);
third = range.first;
fourth = range.second;
assert(third.isValid());
@@ -511,7 +514,8 @@ bool CStyleCast::rewriteArithmeticCast(CStyleCastExpr const * expr, char const *
{
break;
}
- auto const range = compiler.getSourceManager().getImmediateExpansionRange(third);
+ auto const range = compat::getImmediateExpansionRange(
+ compiler.getSourceManager(), third);
third = range.first;
fourth = range.second;
}
diff --git a/compilerplugins/clang/literaltoboolconversion.cxx b/compilerplugins/clang/literaltoboolconversion.cxx
index 17fa9da77d73..19c18a4ca765 100644
--- a/compilerplugins/clang/literaltoboolconversion.cxx
+++ b/compilerplugins/clang/literaltoboolconversion.cxx
@@ -12,6 +12,7 @@
#include "clang/Lex/Lexer.h"
+#include "compat.hxx"
#include "plugin.hxx"
namespace {
@@ -125,8 +126,7 @@ void LiteralToBoolConversion::handleImplicitCastSubExpr(
StringRef name { Lexer::getImmediateMacroName(
loc, compiler.getSourceManager(), compiler.getLangOpts()) };
if (name == "sal_False" || name == "sal_True") {
- loc = compiler.getSourceManager().getImmediateExpansionRange(
- loc).first;
+ loc = compat::getImmediateExpansionRange(compiler.getSourceManager(), loc).first;
}
if (isSharedCAndCppCode(loc)) {
return;
diff --git a/compilerplugins/clang/nullptr.cxx b/compilerplugins/clang/nullptr.cxx
index 2e4de5d37a1c..bc1f7b505243 100644
--- a/compilerplugins/clang/nullptr.cxx
+++ b/compilerplugins/clang/nullptr.cxx
@@ -13,6 +13,7 @@
#include <set>
#include "check.hxx"
+#include "compat.hxx"
#include "plugin.hxx"
namespace {
@@ -317,8 +318,7 @@ void Nullptr::handleNull(
// ellipsis, cast to void*
return;
}
- loc = compiler.getSourceManager()
- .getImmediateExpansionRange(loc).first;
+ loc = compat::getImmediateExpansionRange(compiler.getSourceManager(), loc).first;
if (ignoreLocation(
compiler.getSourceManager().getSpellingLoc(loc)))
{
@@ -381,8 +381,8 @@ void Nullptr::rewriteOrWarn(
compiler.getLangOpts())
== "NULL"))
{
- locStart = compiler.getSourceManager().getImmediateExpansionRange(
- locStart).first;
+ locStart = compat::getImmediateExpansionRange(compiler.getSourceManager(), locStart)
+ .first;
}
SourceLocation locEnd(expr->getLocEnd());
while (compiler.getSourceManager().isMacroArgExpansion(locEnd)) {
@@ -396,8 +396,7 @@ void Nullptr::rewriteOrWarn(
compiler.getLangOpts())
== "NULL"))
{
- locEnd = compiler.getSourceManager().getImmediateExpansionRange(
- locEnd).first;
+ locEnd = compat::getImmediateExpansionRange(compiler.getSourceManager(), locEnd).first;
}
if (replaceText(SourceRange(compiler.getSourceManager().getSpellingLoc(locStart), compiler.getSourceManager().getSpellingLoc(locEnd)), replacement)) {
return;
diff --git a/compilerplugins/clang/salcall.cxx b/compilerplugins/clang/salcall.cxx
index 2f289033851d..a84cbd9825d5 100644
--- a/compilerplugins/clang/salcall.cxx
+++ b/compilerplugins/clang/salcall.cxx
@@ -428,7 +428,7 @@ bool SalCall::isSalCallFunction(FunctionDecl const* functionDecl, SourceLocation
//TODO: If the macro is a function-like macro with a parameter named "SAL_CALL", uses of
// that parameter in the remainder of the replacement text will be false positives.
assert(SM.isMacroBodyExpansion(startLoc));
- auto const startLoc2 = SM.getImmediateExpansionRange(startLoc).second;
+ auto const startLoc2 = compat::getImmediateExpansionRange(SM, startLoc).second;
auto name = Lexer::getImmediateMacroName(startLoc, SM, compiler.getLangOpts());
while (name.startswith("\\\n"))
{
diff --git a/compilerplugins/clang/sallogareas.cxx b/compilerplugins/clang/sallogareas.cxx
index e31754493523..e18f100043e5 100644
--- a/compilerplugins/clang/sallogareas.cxx
+++ b/compilerplugins/clang/sallogareas.cxx
@@ -11,6 +11,7 @@
#include "sallogareas.hxx"
#include "check.hxx"
+#include "compat.hxx"
#include <clang/Lex/Lexer.h>
@@ -102,7 +103,7 @@ bool SalLogAreas::VisitCallExpr( const CallExpr* call )
const SourceManager& source = compiler.getSourceManager();
for( SourceLocation loc = call->getLocStart();
loc.isMacroID();
- loc = source.getImmediateExpansionRange( loc ).first )
+ loc = compat::getImmediateExpansionRange(source, loc ).first )
{
StringRef inMacro = Lexer::getImmediateMacroName( loc, source, compiler.getLangOpts());
if( inMacro == "SAL_DEBUG" || inMacro == "SAL_DEBUG_BACKTRACE" )