diff --git a/ClangVisitor.cpp b/ClangVisitor.cpp
index 79918c99b1a48a9fafe8d3da7994ca04f0e50c13..73c4e655d8a3a5742bab9e6d5a2e3ef2a35ef359 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 6487e60f5e0745d35c773ad09d2341bdaaec1549..127e3bb6583796048262e87c9aeffe285dd15167 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 8c764895eddbf04dd058b2326c546233dcdaf6e2..0ed0ef99381bf7cec58b69b9057a0afb1e937bda 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 66c595697829f5c06f0e77c8980bf1556ae1a994..ca946f8eaa7c4724dc47e5774c8fd5f319bccbce 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 2666b7559cdd2431da13c810a6f18b9e8c50945b..de47d309deaf94255ba097ac44013c47fc0781e5 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)