[Libreoffice-commits] core.git: compilerplugins/clang

Stephan Bergmann sbergman at redhat.com
Fri May 4 11:57:15 UTC 2018


 compilerplugins/clang/compat.hxx                  |   12 +++++++++++
 compilerplugins/clang/constparams.cxx             |    2 -
 compilerplugins/clang/cppunitassertequals.cxx     |    3 +-
 compilerplugins/clang/cstylecast.cxx              |   24 ++++++++++++----------
 compilerplugins/clang/literaltoboolconversion.cxx |    4 +--
 compilerplugins/clang/nullptr.cxx                 |   11 ++++------
 compilerplugins/clang/salcall.cxx                 |    2 -
 compilerplugins/clang/sallogareas.cxx             |    3 +-
 8 files changed, 39 insertions(+), 22 deletions(-)

New commits:
commit b72a31b37f9bdcfd3f59b3256b465bf0fb5a50ca
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu May 3 21:13:35 2018 +0200

    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 at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

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" )


More information about the Libreoffice-commits mailing list