From 24aa6cf727d13f137fc51b069aea49be30175cda Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Thu, 18 Jun 2020 16:45:21 +0200
Subject: [PATCH] [compat] Enable LLVM-10 compatibility

---
 ClangVisitor.cpp   | 13 +++++++++++--
 Clang_utils.h      | 11 +++++++++++
 Makefile.clang     |  9 +++++++++
 Makefile.config.in |  1 +
 configure.ac       |  1 +
 5 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/ClangVisitor.cpp b/ClangVisitor.cpp
index 79918c99..73c4e655 100644
--- a/ClangVisitor.cpp
+++ b/ClangVisitor.cpp
@@ -541,7 +541,11 @@ init_expr FramacVisitor::make_explicit_initializer_list(const clang::Expr* e) {
   // but there might be cases where clang give the list directly in e.
   if (e->getStmtClass() == clang::Stmt::MaterializeTemporaryExprClass) {
     auto tmp = llvm::dyn_cast<const clang::MaterializeTemporaryExpr>(e);
+#if CLANG_VERSION_MAJOR >= 10
+    e = tmp->getSubExpr();
+#else
     e = tmp->GetTemporaryExpr();
+#endif
   }
   assert("Expecting an InitListExpr under a CXXStdInitializeListExpr"
          && e->getStmtClass() == clang::Stmt::InitListExprClass);
@@ -2294,8 +2298,13 @@ exp_node FramacVisitor::makeMaterializeTemporaryExpression(
   expression etmp =
     expression_cons(loc, exp_node_Variable(variable_Local(qtmp)));
   _implicitThisStar = etmp;
-  init_expr temp =
-    makeInitExpr(tmpExpr->getType(), tmpExpr->GetTemporaryExpr(), shouldDelay);
+  const clang::Expr* e =
+#if CLANG_VERSION_MAJOR >= 10
+    tmpExpr->getSubExpr();
+#else
+    tmpExpr->GetTemporaryExpr();
+#endif
+  init_expr temp = makeInitExpr(tmpExpr->getType(), e, shouldDelay);
   qual_type temp_type =
     makeDefaultType(tmpExpr->getExprLoc(), tmpExpr->getType());
   _implicitThisStar = oldThisStar;
diff --git a/Clang_utils.h b/Clang_utils.h
index 6487e60f..127e3bb6 100644
--- a/Clang_utils.h
+++ b/Clang_utils.h
@@ -792,8 +792,19 @@ public:
   clang::SourceLocation getSourceLocation(const location loc) const {
     if (!loc) return clang::SourceLocation();
     const clang::SourceManager& sm = _context->getSourceManager();
+#if CLANG_VERSION_MAJOR >= 10
+    auto fileOpt = sm.getFileManager().getFileRef(std::string(loc->filename1));
+    if (fileOpt) {
+      const clang::FileEntry& file = fileOpt.get().getFileEntry();
+      return sm.translateFileLineCol(&file, loc->linenum1, loc->charnum1);
+    } else {
+      // use dummy FileID if we don't have a valid FileEntry
+      return sm.translateLineCol(clang::FileID(), loc->linenum1, loc->charnum1);
+    }
+#else
     const clang::FileEntry* file=sm.getFileManager().getFile(std::string(loc->filename1));
     return sm.translateFileLineCol(file,loc->linenum1,loc->charnum1);
+#endif
   }
 
 };
diff --git a/Makefile.clang b/Makefile.clang
index 8c764895..0ed0ef99 100644
--- a/Makefile.clang
+++ b/Makefile.clang
@@ -71,9 +71,18 @@ CFLAGS+=-g
 CLANG_LINKFLAGS+=-g
 endif
 
+LLVM_MAJOR:= $(shell echo $(LLVM_VERSION) | sed -e 's/^\([0-9]*\).*/\1/')
+
+LLVM_MAJOR_10:= \
+  $(shell if test $(LLVM_MAJOR) -ge 10; then echo "yes"; else echo "no"; fi)
+
 #LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser support mc
+ifeq ("$(LLVM_MAJOR_10)","yes")
+USEDLIBS=clang-cpp
+else
 USEDLIBS = clangFrontend clangDriver clangParse clangSema clangAnalysis \
            clangEdit clangAST clangLex clangSerialization clangBasic
+endif
 
 # for use in main Makefile
 default: $(PLUGIN_DIR)/bin/$(TOOLNAME)
diff --git a/Makefile.config.in b/Makefile.config.in
index 66c59569..ca946f8e 100644
--- a/Makefile.config.in
+++ b/Makefile.config.in
@@ -30,6 +30,7 @@ CLANG_LINKFLAGS=@CLANG_LINKFLAGS@
 CLANG_SYSLIBS=@CLANG_SYSLIBS@
 CLANG_BIN_DIR=@CLANG_BIN_DIR@
 LLVM_LIBS=@LLVM_LIBS@
+LLVM_VERSION=@LLVM_VERSION@
 DEFAULT_FC_C_HEADERS=@DEFAULT_FC_C_HEADERS@
 DEFAULT_FC_CXX_HEADERS=@DEFAULT_FC_CXX_HEADERS@
 RUN_TESTS=@RUN_TESTS@
diff --git a/configure.ac b/configure.ac
index 2666b755..de47d309 100644
--- a/configure.ac
+++ b/configure.ac
@@ -53,6 +53,7 @@ AC_SUBST(CLANG_LINKFLAGS)
 AC_SUBST(CLANG_SYSLIBS)
 AC_SUBST(CLANG_BIN_DIR)
 AC_SUBST(LLVM_LIBS)
+AC_SUBST(LLVM_VERSION)
 AC_SUBST(DEFAULT_FC_C_HEADERS)
 AC_SUBST(DEFAULT_FC_CXX_HEADERS)
 AC_SUBST(RUN_TESTS)
-- 
GitLab