<div dir="ltr">Should be fixed in r<span style="font-size:12.800000190734863px">305860.</span><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">- Lang.</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 20, 2017 at 2:19 PM, Lang Hames <span dir="ltr"><<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Oops - this broke Sema/ms_class_layout.cpp. Looking in to it now...<span class="HOEnZb"><font color="#888888"><div><br></div><div>- Lang.</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 20, 2017 at 2:06 PM, Lang Hames via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lhames<br>
Date: Tue Jun 20 16:06:00 2017<br>
New Revision: 305850<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305850&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=305850&view=rev</a><br>
Log:<br>
Preserve CXX method overrides in ASTImporter<br>
<br>
Summary:<br>
The ASTImporter should import CXX method overrides from the source context<br>
when it imports a method decl.<br>
<br>
Reviewers: spyffe, rsmith, doug.gregor<br>
<br>
Reviewed By: spyffe<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D34371" rel="noreferrer" target="_blank">https://reviews.llvm.org/D3437<wbr>1</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/ASTDumper.cp<wbr>p<br>
    cfe/trunk/lib/AST/ASTImporter.<wbr>cpp<br>
    cfe/trunk/tools/clang-import-t<wbr>est/clang-import-test.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/ASTDumper.cp<wbr>p<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=305850&r1=305849&r2=305850&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/lib/AST/ASTDum<wbr>per.cpp?rev=305850&r1=305849&<wbr>r2=305850&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/ASTDumper.cp<wbr>p (original)<br>
+++ cfe/trunk/lib/AST/ASTDumper.cp<wbr>p Tue Jun 20 16:06:00 2017<br>
@@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(c<wbr>onst<br>
          I != E; ++I)<br>
       dumpCXXCtorInitializer(*I);<br>
<br>
+  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D))<br>
+    if (MD->size_overridden_methods() != 0) {<br>
+      auto dumpOverride =<br>
+        [=](const CXXMethodDecl *D) {<br>
+          SplitQualType T_split = D->getType().split();<br>
+          OS << D << " " << D->getParent()->getName() << "::"<br>
+             << D->getName() << " '"<br>
+             << QualType::getAsString(T_split) << "'";<br>
+        };<br>
+<br>
+      dumpChild([=] {<br>
+        auto FirstOverrideItr = MD->begin_overridden_methods()<wbr>;<br>
+        OS << "Overrides: [ ";<br>
+        dumpOverride(*FirstOverrideItr<wbr>);<br>
+        for (const auto *Override :<br>
+               llvm::make_range(FirstOverrid<wbr>eItr + 1,<br>
+                                MD->end_overridden_methods()))<br>
+          dumpOverride(Override);<br>
+        OS << " ]";<br>
+      });<br>
+    }<br>
+<br>
   if (D->doesThisDeclarationHaveABo<wbr>dy())<br>
     dumpStmt(D->getBody());<br>
 }<br>
<br>
Modified: cfe/trunk/lib/AST/ASTImporter.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=305850&r1=305849&r2=305850&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/lib/AST/ASTImp<wbr>orter.cpp?rev=305850&r1=305849<wbr>&r2=305850&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/ASTImporter.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/AST/ASTImporter.<wbr>cpp Tue Jun 20 16:06:00 2017<br>
@@ -319,6 +319,9 @@ namespace clang {<br>
     bool ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {<br>
       return ImportArrayChecked(InContainer<wbr>.begin(), InContainer.end(), Obegin);<br>
     }<br>
+<br>
+    // Importing overrides.<br>
+    void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod);<br>
   };<br>
 }<br>
<br>
@@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctio<wbr>nDecl<br>
   // Add this function to the lexical context.<br>
   LexicalDC->addDeclInternal(To<wbr>Function);<br>
<br>
+  if (auto *FromCXXMethod = dyn_cast<CXXMethodDecl>(D))<br>
+    ImportOverrides(cast<CXXMethod<wbr>Decl>(ToFunction), FromCXXMethod);<br>
+<br>
   return ToFunction;<br>
 }<br>
<br>
@@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNo<wbr>nType<br>
         Replacement);<br>
 }<br>
<br>
+void ASTNodeImporter::ImportOverrid<wbr>es(CXXMethodDecl *ToMethod,<br>
+                                      CXXMethodDecl *FromMethod) {<br>
+  for (auto *FromOverriddenMethod : FromMethod->overridden_methods<wbr>())<br>
+    ToMethod->addOverriddenMethod(<br>
+      cast<CXXMethodDecl>(Importer.I<wbr>mport(const_cast<CXXMethodDecl<wbr>*>(<br>
+                                            FromOverriddenMethod))));<br>
+}<br>
+<br>
 ASTImporter::ASTImporter(ASTC<wbr>ontext &ToContext, FileManager &ToFileManager,<br>
                          ASTContext &FromContext, FileManager &FromFileManager,<br>
                          bool MinimalImport)<br>
<br>
Modified: cfe/trunk/tools/clang-import-t<wbr>est/clang-import-test.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/tools/clang-im<wbr>port-test/clang-import-test.cp<wbr>p?rev=305850&r1=305849&r2=3058<wbr>50&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/clang-import-t<wbr>est/clang-import-test.cpp (original)<br>
+++ cfe/trunk/tools/clang-import-t<wbr>est/clang-import-test.cpp Tue Jun 20 16:06:00 2017<br>
@@ -17,7 +17,9 @@<br>
 #include "clang/Basic/TargetInfo.h"<br>
 #include "clang/Basic/TargetOptions.h"<br>
 #include "clang/CodeGen/ModuleBuilder.h<wbr>"<br>
+#include "clang/Frontend/ASTConsumers.h<wbr>"<br>
 #include "clang/Frontend/CompilerInstan<wbr>ce.h"<br>
+#include "clang/Frontend/MultiplexConsu<wbr>mer.h"<br>
 #include "clang/Frontend/TextDiagnostic<wbr>Buffer.h"<br>
 #include "clang/Lex/Lexer.h"<br>
 #include "clang/Lex/Preprocessor.h"<br>
@@ -51,6 +53,10 @@ static llvm::cl::list<std::string><br>
               llvm::cl::desc("Argument to pass to the CompilerInvocation"),<br>
               llvm::cl::CommaSeparated);<br>
<br>
+static llvm::cl::opt<bool><br>
+DumpAST("dump-ast", llvm::cl::init(false),<br>
+        llvm::cl::desc("Dump combined AST"));<br>
+<br>
 namespace init_convenience {<br>
 class TestDiagnosticConsumer : public DiagnosticConsumer {<br>
 private:<br>
@@ -233,7 +239,7 @@ std::unique_ptr<CompilerInstan<wbr>ce> BuildI<br>
 }<br>
<br>
 llvm::Error ParseSource(const std::string &Path, CompilerInstance &CI,<br>
-                        CodeGenerator &CG) {<br>
+                        ASTConsumer &Consumer) {<br>
   SourceManager &SM = CI.getSourceManager();<br>
   const FileEntry *FE = CI.getFileManager().getFile(Pa<wbr>th);<br>
   if (!FE) {<br>
@@ -241,13 +247,14 @@ llvm::Error ParseSource(const std::strin<br>
         llvm::Twine("Couldn't open ", Path), std::error_code());<br>
   }<br>
   SM.setMainFileID(SM.createFil<wbr>eID(FE, SourceLocation(), SrcMgr::C_User));<br>
-  ParseAST(CI.getPreprocessor(), &CG, CI.getASTContext());<br>
+  ParseAST(CI.getPreprocessor(), &Consumer, CI.getASTContext());<br>
   return llvm::Error::success();<br>
 }<br>
<br>
 llvm::Expected<std::unique_pt<wbr>r<CompilerInstance>><br>
 Parse(const std::string &Path,<br>
-      llvm::ArrayRef<std::unique_ptr<wbr><CompilerInstance>> Imports) {<br>
+      llvm::ArrayRef<std::unique_ptr<wbr><CompilerInstance>> Imports,<br>
+      bool ShouldDumpAST) {<br>
   std::vector<const char *> ClangArgv(ClangArgs.size());<br>
   std::transform(ClangArgs.begi<wbr>n(), ClangArgs.end(), ClangArgv.begin(),<br>
                  [](const std::string &s) -> const char * { return s.data(); });<br>
@@ -261,14 +268,20 @@ Parse(const std::string &Path,<br>
   if (Imports.size())<br>
     AddExternalSource(*CI, Imports);<br>
<br>
+  std::vector<std::unique_ptr<AS<wbr>TConsumer>> ASTConsumers;<br>
+<br>
   auto LLVMCtx = llvm::make_unique<llvm::LLVMCo<wbr>ntext>();<br>
-  std::unique_ptr<CodeGenerator> CG =<br>
-      init_convenience::BuildCodeGen<wbr>(*CI, *LLVMCtx);<br>
-  CG->Initialize(CI->getASTConte<wbr>xt());<br>
+  ASTConsumers.push_back(init_co<wbr>nvenience::BuildCodeGen(*CI, *LLVMCtx));<br>
+<br>
+  if (ShouldDumpAST)<br>
+    ASTConsumers.push_back(CreateA<wbr>STDumper("", true, false, false));<br>
<br>
   CI->getDiagnosticClient().Beg<wbr>inSourceFile(CI->getLangOpts()<wbr>,<br>
                                             &CI->getPreprocessor());<br>
-  if (llvm::Error PE = ParseSource(Path, *CI, *CG)) {<br>
+  MultiplexConsumer Consumers(std::move(ASTConsume<wbr>rs));<br>
+  Consumers.Initialize(CI->getAS<wbr>TContext());<br>
+<br>
+  if (llvm::Error PE = ParseSource(Path, *CI, Consumers)) {<br>
     return std::move(PE);<br>
   }<br>
   CI->getDiagnosticClient().End<wbr>SourceFile();<br>
@@ -288,7 +301,8 @@ int main(int argc, const char **argv) {<br>
   llvm::cl::ParseCommandLineOpt<wbr>ions(argc, argv);<br>
   std::vector<std::unique_ptr<C<wbr>ompilerInstance>> ImportCIs;<br>
   for (auto I : Imports) {<br>
-    llvm::Expected<std::unique_ptr<wbr><CompilerInstance>> ImportCI = Parse(I, {});<br>
+    llvm::Expected<std::unique_ptr<wbr><CompilerInstance>> ImportCI =<br>
+      Parse(I, {}, false);<br>
     if (auto E = ImportCI.takeError()) {<br>
       llvm::errs() << llvm::toString(std::move(E));<br>
       exit(-1);<br>
@@ -310,7 +324,7 @@ int main(int argc, const char **argv) {<br>
     }<br>
   }<br>
   llvm::Expected<std::unique_pt<wbr>r<CompilerInstance>> ExpressionCI =<br>
-      Parse(Expression, Direct ? ImportCIs : IndirectCIs);<br>
+      Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST);<br>
   if (auto E = ExpressionCI.takeError()) {<br>
     llvm::errs() << llvm::toString(std::move(E));<br>
     exit(-1);<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>