From 20fca52da739ebefa47e35f6b338bb99a0da3cfe Mon Sep 17 00:00:00 2001
From: Cristian Adam <cristian.adam@qt.io>
Date: Tue, 6 Sep 2022 16:30:02 +0200
Subject: [PATCH] Build fixes for LLVM/Clang 15.0.0

Change-Id: Icc39a0b1acffb5a6a4798b1259d8ad4e7dd47bc5
---
 CMakeLists.txt                              |  6 ++++++
 src/PreProcessorVisitor.cpp                 |  2 +-
 src/PreProcessorVisitor.h                   |  2 +-
 src/SourceCompatibilityHelpers.h            | 15 +++++++++++++++
 src/Utils.cpp                               |  3 ++-
 src/checkbase.cpp                           |  4 ++--
 src/checkbase.h                             |  4 ++--
 src/checks/manuallevel/qt6-fwd-fixes.cpp    |  2 +-
 src/checks/manuallevel/qt6-fwd-fixes.h      |  2 +-
 src/checks/manuallevel/qt6-header-fixes.cpp |  2 +-
 src/checks/manuallevel/qt6-header-fixes.h   |  2 +-
 11 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3c780b0d..100135af 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -114,6 +114,10 @@ else()
     set(clang_tooling_refactoring_lib clangToolingRefactor)
 endif()
 
+if (${LLVM_VERSION} VERSION_GREATER_EQUAL "15.0.0")
+  set(clang_support_lib clangSupport)
+endif()
+
 macro(link_to_llvm name is_standalone)
   if (CLAZY_LINK_CLANG_DYLIB)
     target_link_libraries(${name} clang-cpp)
@@ -131,6 +135,7 @@ macro(link_to_llvm name is_standalone)
 
       target_link_libraries(${name} ${clang_lib})
     endforeach()
+    target_link_libraries(${name} ${clang_support_lib})
     target_link_libraries(${name} clangTooling)
     target_link_libraries(${name} clangToolingCore)
     target_link_libraries(${name} ${clang_tooling_refactoring_lib})
@@ -302,6 +307,7 @@ else()
     clangFrontendTool
     clangRewrite
     clangSerialization
+    ${clang_support_lib}
     clangTooling
     clangStaticAnalyzerCheckers
     clangStaticAnalyzerCore
diff --git a/src/PreProcessorVisitor.cpp b/src/PreProcessorVisitor.cpp
index 5e63a131..5fdfe5f3 100644
--- a/src/PreProcessorVisitor.cpp
+++ b/src/PreProcessorVisitor.cpp
@@ -185,7 +185,7 @@ void PreProcessorVisitor::MacroExpands(const Token &MacroNameTok, const MacroDef
 
 void PreProcessorVisitor::InclusionDirective (clang::SourceLocation, const clang::Token &,
                                               clang::StringRef FileName, bool IsAngled, clang::CharSourceRange FilenameRange,
-                                              const clang::FileEntry *, clang::StringRef, clang::StringRef,
+                                              clazy::OptionalFileEntryRef, clang::StringRef, clang::StringRef,
                                               const clang::Module *, clang::SrcMgr::CharacteristicKind)
 {
    if (m_ci.getPreprocessor().isInPrimaryFile() && !clazy::endsWith(FileName.str(), ".moc")) {
diff --git a/src/PreProcessorVisitor.h b/src/PreProcessorVisitor.h
index dc80ff36..1bb17a5e 100644
--- a/src/PreProcessorVisitor.h
+++ b/src/PreProcessorVisitor.h
@@ -71,7 +71,7 @@ class PreProcessorVisitor
                       clang::SourceRange range, const clang::MacroArgs *) override;
     void InclusionDirective (clang::SourceLocation HashLoc, const clang::Token &IncludeTok,
                              clang::StringRef FileName, bool IsAngled, clang::CharSourceRange FilenameRange,
-                             const clang::FileEntry *File, clang::StringRef SearchPath, clang::StringRef RelativePath,
+                             clazy::OptionalFileEntryRef File, clang::StringRef SearchPath, clang::StringRef RelativePath,
                              const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType) override;
 private:
     std::string getTokenSpelling(const clang::MacroDefinition &) const;
diff --git a/src/SourceCompatibilityHelpers.h b/src/SourceCompatibilityHelpers.h
index 4ea923a2..c1a23a4b 100644
--- a/src/SourceCompatibilityHelpers.h
+++ b/src/SourceCompatibilityHelpers.h
@@ -144,6 +144,21 @@ inline bool contains_lower(clang::StringRef haystack, clang::StringRef needle)
 #endif
 }
 
+#if LLVM_VERSION_MAJOR >= 15
+using OptionalFileEntryRef = clang::Optional<clang::FileEntryRef>;
+#else
+using OptionalFileEntryRef = const clang::FileEntry*;
+#endif
+
+inline bool isAscii(clang::StringLiteral *lt)
+{
+#if LLVM_VERSION_MAJOR >= 15
+    return lt->isOrdinary();
+#else
+    return lt->isAscii();
+#endif
+}
+
 }
 
 #endif
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 3cdf7876..70e0577c 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -25,6 +25,7 @@
 #include "Utils.h"
 #include "StringUtils.h"
 #include "HierarchyUtils.h"
+#include "SourceCompatibilityHelpers.h"
 #include "StmtBodyRange.h"
 #include "clazy_stl.h"
 
@@ -670,7 +671,7 @@ const CXXRecordDecl *Utils::recordForMemberCall(CXXMemberCallExpr *call, string
 bool Utils::isAscii(StringLiteral *lt)
 {
     // 'é' for some reason has isAscii() == true, so also call containsNonAsciiOrNull
-    return lt && lt->isAscii() && !lt->containsNonAsciiOrNull();
+    return lt && clazy::isAscii(lt) && !lt->containsNonAsciiOrNull();
 }
 
 bool Utils::isInDerefExpression(Stmt *s, ParentMap *map)
diff --git a/src/checkbase.cpp b/src/checkbase.cpp
index f5936dfd..dcc7c999 100644
--- a/src/checkbase.cpp
+++ b/src/checkbase.cpp
@@ -105,7 +105,7 @@ void ClazyPreprocessorCallbacks::MacroDefined(const Token &macroNameTok, const M
 }
 
 void ClazyPreprocessorCallbacks::InclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                                                    clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                                                    clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                                                     clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType)
 {
     check->VisitInclusionDirective(HashLoc, IncludeTok, FileName, IsAngled, FilenameRange, File, SearchPath, RelativePath, Imported, FileType);
@@ -182,7 +182,7 @@ void CheckBase::VisitEndif(SourceLocation, SourceLocation)
 }
 
 void CheckBase::VisitInclusionDirective(clang::SourceLocation , const clang::Token &, clang::StringRef , bool ,
-                        clang::CharSourceRange , const clang::FileEntry *, clang::StringRef ,
+                        clang::CharSourceRange , clazy::OptionalFileEntryRef, clang::StringRef ,
                         clang::StringRef , const clang::Module *, clang::SrcMgr::CharacteristicKind )
 {
     // Overriden in derived classes
diff --git a/src/checkbase.h b/src/checkbase.h
index c5db2daf..02f6a6bf 100644
--- a/src/checkbase.h
+++ b/src/checkbase.h
@@ -91,7 +91,7 @@ class ClazyPreprocessorCallbacks
     void Else(clang::SourceLocation loc, clang::SourceLocation ifLoc) override;
     void Endif(clang::SourceLocation loc, clang::SourceLocation ifLoc) override;
     void InclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                            clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                            clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                             clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType) override;
 private:
     CheckBase *const check;
@@ -151,7 +151,7 @@ class CheckBase
     virtual void VisitElse(clang::SourceLocation loc, clang::SourceLocation ifLoc);
     virtual void VisitEndif(clang::SourceLocation loc, clang::SourceLocation ifLoc);
     virtual void VisitInclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                            clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                            clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                             clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType);
 
     void enablePreProcessorCallbacks();
diff --git a/src/checks/manuallevel/qt6-fwd-fixes.cpp b/src/checks/manuallevel/qt6-fwd-fixes.cpp
index 83bf81ee..c87d9ca0 100644
--- a/src/checks/manuallevel/qt6-fwd-fixes.cpp
+++ b/src/checks/manuallevel/qt6-fwd-fixes.cpp
@@ -166,7 +166,7 @@ void Qt6FwdFixes::VisitDecl(clang::Decl *decl)
 }
 
 void Qt6FwdFixes::VisitInclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                        clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                        clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                         clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType)
 {
     auto current_file = m_sm.getFilename(HashLoc);
diff --git a/src/checks/manuallevel/qt6-fwd-fixes.h b/src/checks/manuallevel/qt6-fwd-fixes.h
index 37b59d95..bb928ba6 100644
--- a/src/checks/manuallevel/qt6-fwd-fixes.h
+++ b/src/checks/manuallevel/qt6-fwd-fixes.h
@@ -47,7 +47,7 @@ class Qt6FwdFixes
     explicit Qt6FwdFixes(const std::string &name, ClazyContext *context);
     void VisitDecl(clang::Decl *decl) override;
     void VisitInclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                            clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                            clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                             clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType) override;
     bool m_including_qcontainerfwd = false;
     std::set<clang::StringRef> m_qcontainerfwd_included_in_files;
diff --git a/src/checks/manuallevel/qt6-header-fixes.cpp b/src/checks/manuallevel/qt6-header-fixes.cpp
index d458b77c..aaa28093 100644
--- a/src/checks/manuallevel/qt6-header-fixes.cpp
+++ b/src/checks/manuallevel/qt6-header-fixes.cpp
@@ -270,7 +270,7 @@ Qt6HeaderFixes::Qt6HeaderFixes(const std::string &name, ClazyContext *context)
 }
 
 void Qt6HeaderFixes::VisitInclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                        clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                        clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                         clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType)
 {
     if (shouldIgnoreFile(HashLoc))
diff --git a/src/checks/manuallevel/qt6-header-fixes.h b/src/checks/manuallevel/qt6-header-fixes.h
index ae09f7ad..8ffbb100 100644
--- a/src/checks/manuallevel/qt6-header-fixes.h
+++ b/src/checks/manuallevel/qt6-header-fixes.h
@@ -46,7 +46,7 @@ class Qt6HeaderFixes
 public:
     explicit Qt6HeaderFixes(const std::string &name, ClazyContext *context);
     void VisitInclusionDirective(clang::SourceLocation HashLoc, const clang::Token &IncludeTok, clang::StringRef FileName, bool IsAngled,
-                            clang::CharSourceRange FilenameRange, const clang::FileEntry *File, clang::StringRef SearchPath,
+                            clang::CharSourceRange FilenameRange, clazy::OptionalFileEntryRef File, clang::StringRef SearchPath,
                             clang::StringRef RelativePath, const clang::Module *Imported, clang::SrcMgr::CharacteristicKind FileType) override;
 
 };
