Re: r305850 - Preserve CXX method overrides in ASTImporter

2017-07-10 Thread David Blaikie via cfe-commits
ping on CR feedback

On Mon, Jun 26, 2017 at 7:02 PM David Blaikie  wrote:

> On Tue, Jun 20, 2017 at 2:06 PM Lang Hames via cfe-commits <
> cfe-commits@lists.llvm.org> wrote:
>
>> Author: lhames
>> Date: Tue Jun 20 16:06:00 2017
>> New Revision: 305850
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=305850&view=rev
>> Log:
>> Preserve CXX method overrides in ASTImporter
>>
>> Summary:
>> The ASTImporter should import CXX method overrides from the source context
>> when it imports a method decl.
>>
>> Reviewers: spyffe, rsmith, doug.gregor
>>
>> Reviewed By: spyffe
>>
>> Differential Revision: https://reviews.llvm.org/D34371
>>
>> Modified:
>> cfe/trunk/lib/AST/ASTDumper.cpp
>> cfe/trunk/lib/AST/ASTImporter.cpp
>> cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>>
>> Modified: cfe/trunk/lib/AST/ASTDumper.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=305850&r1=305849&r2=305850&view=diff
>>
>> ==
>> --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jun 20 16:06:00 2017
>> @@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(const
>>   I != E; ++I)
>>dumpCXXCtorInitializer(*I);
>>
>> +  if (const CXXMethodDecl *MD = dyn_cast(D))
>> +if (MD->size_overridden_methods() != 0) {
>>
>
> I'd probably make sure CXXMethodDecl has a range-based accessor for
> overridden_methods and call it once here, check begin != end, then use it
> in the range-based for later. That way it'd avoid multiple lookups of the
> CXXMethodDecl in the ASTContext.
>
> Probably not a big deal/efficiency concern, but just a thought :)
>
>
>> +  auto dumpOverride =
>> +[=](const CXXMethodDecl *D) {
>> +  SplitQualType T_split = D->getType().split();
>> +  OS << D << " " << D->getParent()->getName() << "::"
>> + << D->getName() << " '"
>> + << QualType::getAsString(T_split) << "'";
>> +};
>> +
>> +  dumpChild([=] {
>> +auto FirstOverrideItr = MD->begin_overridden_methods();
>> +OS << "Overrides: [ ";
>> +dumpOverride(*FirstOverrideItr);
>>
>
> Why is this one ^ pulled out separately from the rest of the loop?
>
>
>> +for (const auto *Override :
>> +   llvm::make_range(FirstOverrideItr + 1,
>> +MD->end_overridden_methods()))
>> +  dumpOverride(Override);
>> +OS << " ]";
>> +  });
>> +}
>> +
>>if (D->doesThisDeclarationHaveABody())
>>  dumpStmt(D->getBody());
>>  }
>>
>> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=305850&r1=305849&r2=305850&view=diff
>>
>> ==
>> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 20 16:06:00 2017
>> @@ -319,6 +319,9 @@ namespace clang {
>>  bool ImportArrayChecked(const InContainerTy &InContainer, OIter
>> Obegin) {
>>return ImportArrayChecked(InContainer.begin(), InContainer.end(),
>> Obegin);
>>  }
>> +
>> +// Importing overrides.
>> +void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl
>> *FromMethod);
>>};
>>  }
>>
>> @@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctionDecl
>>// Add this function to the lexical context.
>>LexicalDC->addDeclInternal(ToFunction);
>>
>> +  if (auto *FromCXXMethod = dyn_cast(D))
>> +ImportOverrides(cast(ToFunction), FromCXXMethod);
>> +
>>return ToFunction;
>>  }
>>
>> @@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNonType
>>  Replacement);
>>  }
>>
>> +void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
>> +  CXXMethodDecl *FromMethod) {
>> +  for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
>> +ToMethod->addOverriddenMethod(
>> +  cast(Importer.Import(const_cast(
>> +FromOverriddenMethod;
>> +}
>> +
>>  ASTImporter::ASTImporter(ASTContext &ToContext, FileManager
>> &ToFileManager,
>>   ASTContext &FromContext, FileManager
>> &FromFileManager,
>>   bool MinimalImport)
>>
>> Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff
>>
>> ==
>> --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
>> +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jun 20
>> 16:06:00 2017
>> @@ -17,7 +17,9 @@
>>  #include "clang/Basic/TargetInfo.h"
>>  #include "clang/Basic/TargetOptions.h"
>>  #include "clang/CodeGen/ModuleBuilder.h

Re: r305850 - Preserve CXX method overrides in ASTImporter

2017-06-26 Thread David Blaikie via cfe-commits
On Tue, Jun 20, 2017 at 2:06 PM Lang Hames via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: lhames
> Date: Tue Jun 20 16:06:00 2017
> New Revision: 305850
>
> URL: http://llvm.org/viewvc/llvm-project?rev=305850&view=rev
> Log:
> Preserve CXX method overrides in ASTImporter
>
> Summary:
> The ASTImporter should import CXX method overrides from the source context
> when it imports a method decl.
>
> Reviewers: spyffe, rsmith, doug.gregor
>
> Reviewed By: spyffe
>
> Differential Revision: https://reviews.llvm.org/D34371
>
> Modified:
> cfe/trunk/lib/AST/ASTDumper.cpp
> cfe/trunk/lib/AST/ASTImporter.cpp
> cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>
> Modified: cfe/trunk/lib/AST/ASTDumper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=305850&r1=305849&r2=305850&view=diff
>
> ==
> --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
> +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jun 20 16:06:00 2017
> @@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(const
>   I != E; ++I)
>dumpCXXCtorInitializer(*I);
>
> +  if (const CXXMethodDecl *MD = dyn_cast(D))
> +if (MD->size_overridden_methods() != 0) {
>

I'd probably make sure CXXMethodDecl has a range-based accessor for
overridden_methods and call it once here, check begin != end, then use it
in the range-based for later. That way it'd avoid multiple lookups of the
CXXMethodDecl in the ASTContext.

Probably not a big deal/efficiency concern, but just a thought :)


> +  auto dumpOverride =
> +[=](const CXXMethodDecl *D) {
> +  SplitQualType T_split = D->getType().split();
> +  OS << D << " " << D->getParent()->getName() << "::"
> + << D->getName() << " '"
> + << QualType::getAsString(T_split) << "'";
> +};
> +
> +  dumpChild([=] {
> +auto FirstOverrideItr = MD->begin_overridden_methods();
> +OS << "Overrides: [ ";
> +dumpOverride(*FirstOverrideItr);
>

Why is this one ^ pulled out separately from the rest of the loop?


> +for (const auto *Override :
> +   llvm::make_range(FirstOverrideItr + 1,
> +MD->end_overridden_methods()))
> +  dumpOverride(Override);
> +OS << " ]";
> +  });
> +}
> +
>if (D->doesThisDeclarationHaveABody())
>  dumpStmt(D->getBody());
>  }
>
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=305850&r1=305849&r2=305850&view=diff
>
> ==
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 20 16:06:00 2017
> @@ -319,6 +319,9 @@ namespace clang {
>  bool ImportArrayChecked(const InContainerTy &InContainer, OIter
> Obegin) {
>return ImportArrayChecked(InContainer.begin(), InContainer.end(),
> Obegin);
>  }
> +
> +// Importing overrides.
> +void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl
> *FromMethod);
>};
>  }
>
> @@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctionDecl
>// Add this function to the lexical context.
>LexicalDC->addDeclInternal(ToFunction);
>
> +  if (auto *FromCXXMethod = dyn_cast(D))
> +ImportOverrides(cast(ToFunction), FromCXXMethod);
> +
>return ToFunction;
>  }
>
> @@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNonType
>  Replacement);
>  }
>
> +void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
> +  CXXMethodDecl *FromMethod) {
> +  for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
> +ToMethod->addOverriddenMethod(
> +  cast(Importer.Import(const_cast(
> +FromOverriddenMethod;
> +}
> +
>  ASTImporter::ASTImporter(ASTContext &ToContext, FileManager
> &ToFileManager,
>   ASTContext &FromContext, FileManager
> &FromFileManager,
>   bool MinimalImport)
>
> Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff
>
> ==
> --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
> +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jun 20
> 16:06:00 2017
> @@ -17,7 +17,9 @@
>  #include "clang/Basic/TargetInfo.h"
>  #include "clang/Basic/TargetOptions.h"
>  #include "clang/CodeGen/ModuleBuilder.h"
> +#include "clang/Frontend/ASTConsumers.h"
>  #include "clang/Frontend/CompilerInstance.h"
> +#include "clang/Frontend/MultiplexConsumer.h"
>  #include "clang/Frontend/TextDiagnosticBuffer.h"
>  #include "clang/Lex/Lexe

Re: r305850 - Preserve CXX method overrides in ASTImporter

2017-06-20 Thread Lang Hames via cfe-commits
Should be fixed in r305860.

- Lang.

On Tue, Jun 20, 2017 at 2:19 PM, Lang Hames  wrote:

> Oops - this broke Sema/ms_class_layout.cpp. Looking in to it now...
>
> - Lang.
>
> On Tue, Jun 20, 2017 at 2:06 PM, Lang Hames via cfe-commits <
> cfe-commits@lists.llvm.org> wrote:
>
>> Author: lhames
>> Date: Tue Jun 20 16:06:00 2017
>> New Revision: 305850
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=305850&view=rev
>> Log:
>> Preserve CXX method overrides in ASTImporter
>>
>> Summary:
>> The ASTImporter should import CXX method overrides from the source context
>> when it imports a method decl.
>>
>> Reviewers: spyffe, rsmith, doug.gregor
>>
>> Reviewed By: spyffe
>>
>> Differential Revision: https://reviews.llvm.org/D34371
>>
>> Modified:
>> cfe/trunk/lib/AST/ASTDumper.cpp
>> cfe/trunk/lib/AST/ASTImporter.cpp
>> cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>>
>> Modified: cfe/trunk/lib/AST/ASTDumper.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDum
>> per.cpp?rev=305850&r1=305849&r2=305850&view=diff
>> 
>> ==
>> --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jun 20 16:06:00 2017
>> @@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(const
>>   I != E; ++I)
>>dumpCXXCtorInitializer(*I);
>>
>> +  if (const CXXMethodDecl *MD = dyn_cast(D))
>> +if (MD->size_overridden_methods() != 0) {
>> +  auto dumpOverride =
>> +[=](const CXXMethodDecl *D) {
>> +  SplitQualType T_split = D->getType().split();
>> +  OS << D << " " << D->getParent()->getName() << "::"
>> + << D->getName() << " '"
>> + << QualType::getAsString(T_split) << "'";
>> +};
>> +
>> +  dumpChild([=] {
>> +auto FirstOverrideItr = MD->begin_overridden_methods();
>> +OS << "Overrides: [ ";
>> +dumpOverride(*FirstOverrideItr);
>> +for (const auto *Override :
>> +   llvm::make_range(FirstOverrideItr + 1,
>> +MD->end_overridden_methods()))
>> +  dumpOverride(Override);
>> +OS << " ]";
>> +  });
>> +}
>> +
>>if (D->doesThisDeclarationHaveABody())
>>  dumpStmt(D->getBody());
>>  }
>>
>> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImp
>> orter.cpp?rev=305850&r1=305849&r2=305850&view=diff
>> 
>> ==
>> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
>> +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 20 16:06:00 2017
>> @@ -319,6 +319,9 @@ namespace clang {
>>  bool ImportArrayChecked(const InContainerTy &InContainer, OIter
>> Obegin) {
>>return ImportArrayChecked(InContainer.begin(), InContainer.end(),
>> Obegin);
>>  }
>> +
>> +// Importing overrides.
>> +void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl
>> *FromMethod);
>>};
>>  }
>>
>> @@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctionDecl
>>// Add this function to the lexical context.
>>LexicalDC->addDeclInternal(ToFunction);
>>
>> +  if (auto *FromCXXMethod = dyn_cast(D))
>> +ImportOverrides(cast(ToFunction), FromCXXMethod);
>> +
>>return ToFunction;
>>  }
>>
>> @@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNonType
>>  Replacement);
>>  }
>>
>> +void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
>> +  CXXMethodDecl *FromMethod) {
>> +  for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
>> +ToMethod->addOverriddenMethod(
>> +  cast(Importer.Import(const_cast(
>> +FromOverriddenMethod;
>> +}
>> +
>>  ASTImporter::ASTImporter(ASTContext &ToContext, FileManager
>> &ToFileManager,
>>   ASTContext &FromContext, FileManager
>> &FromFileManager,
>>   bool MinimalImport)
>>
>> Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-im
>> port-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff
>> 
>> ==
>> --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
>> +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jun 20
>> 16:06:00 2017
>> @@ -17,7 +17,9 @@
>>  #include "clang/Basic/TargetInfo.h"
>>  #include "clang/Basic/TargetOptions.h"
>>  #include "clang/CodeGen/ModuleBuilder.h"
>> +#include "clang/Frontend/ASTConsumers.h"
>>  #include "clang/Frontend/CompilerInstance.h"
>> +#include "clang/Frontend/MultiplexConsumer.h"
>>  #include "clang/Frontend/TextDiagnosticBuffer.h"
>>  #include "clang/Lex/Lexer.h"
>>  #include "clang/Lex/Preprocessor.h"
>> @@ -51,6 +53,10 @@ static llvm::c

Re: r305850 - Preserve CXX method overrides in ASTImporter

2017-06-20 Thread Lang Hames via cfe-commits
Oops - this broke Sema/ms_class_layout.cpp. Looking in to it now...

- Lang.

On Tue, Jun 20, 2017 at 2:06 PM, Lang Hames via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

> Author: lhames
> Date: Tue Jun 20 16:06:00 2017
> New Revision: 305850
>
> URL: http://llvm.org/viewvc/llvm-project?rev=305850&view=rev
> Log:
> Preserve CXX method overrides in ASTImporter
>
> Summary:
> The ASTImporter should import CXX method overrides from the source context
> when it imports a method decl.
>
> Reviewers: spyffe, rsmith, doug.gregor
>
> Reviewed By: spyffe
>
> Differential Revision: https://reviews.llvm.org/D34371
>
> Modified:
> cfe/trunk/lib/AST/ASTDumper.cpp
> cfe/trunk/lib/AST/ASTImporter.cpp
> cfe/trunk/tools/clang-import-test/clang-import-test.cpp
>
> Modified: cfe/trunk/lib/AST/ASTDumper.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/
> ASTDumper.cpp?rev=305850&r1=305849&r2=305850&view=diff
> 
> ==
> --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
> +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jun 20 16:06:00 2017
> @@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(const
>   I != E; ++I)
>dumpCXXCtorInitializer(*I);
>
> +  if (const CXXMethodDecl *MD = dyn_cast(D))
> +if (MD->size_overridden_methods() != 0) {
> +  auto dumpOverride =
> +[=](const CXXMethodDecl *D) {
> +  SplitQualType T_split = D->getType().split();
> +  OS << D << " " << D->getParent()->getName() << "::"
> + << D->getName() << " '"
> + << QualType::getAsString(T_split) << "'";
> +};
> +
> +  dumpChild([=] {
> +auto FirstOverrideItr = MD->begin_overridden_methods();
> +OS << "Overrides: [ ";
> +dumpOverride(*FirstOverrideItr);
> +for (const auto *Override :
> +   llvm::make_range(FirstOverrideItr + 1,
> +MD->end_overridden_methods()))
> +  dumpOverride(Override);
> +OS << " ]";
> +  });
> +}
> +
>if (D->doesThisDeclarationHaveABody())
>  dumpStmt(D->getBody());
>  }
>
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/
> ASTImporter.cpp?rev=305850&r1=305849&r2=305850&view=diff
> 
> ==
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 20 16:06:00 2017
> @@ -319,6 +319,9 @@ namespace clang {
>  bool ImportArrayChecked(const InContainerTy &InContainer, OIter
> Obegin) {
>return ImportArrayChecked(InContainer.begin(), InContainer.end(),
> Obegin);
>  }
> +
> +// Importing overrides.
> +void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl
> *FromMethod);
>};
>  }
>
> @@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctionDecl
>// Add this function to the lexical context.
>LexicalDC->addDeclInternal(ToFunction);
>
> +  if (auto *FromCXXMethod = dyn_cast(D))
> +ImportOverrides(cast(ToFunction), FromCXXMethod);
> +
>return ToFunction;
>  }
>
> @@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNonType
>  Replacement);
>  }
>
> +void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
> +  CXXMethodDecl *FromMethod) {
> +  for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
> +ToMethod->addOverriddenMethod(
> +  cast(Importer.Import(const_cast(
> +FromOverriddenMethod;
> +}
> +
>  ASTImporter::ASTImporter(ASTContext &ToContext, FileManager
> &ToFileManager,
>   ASTContext &FromContext, FileManager
> &FromFileManager,
>   bool MinimalImport)
>
> Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-
> import-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff
> 
> ==
> --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
> +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jun 20
> 16:06:00 2017
> @@ -17,7 +17,9 @@
>  #include "clang/Basic/TargetInfo.h"
>  #include "clang/Basic/TargetOptions.h"
>  #include "clang/CodeGen/ModuleBuilder.h"
> +#include "clang/Frontend/ASTConsumers.h"
>  #include "clang/Frontend/CompilerInstance.h"
> +#include "clang/Frontend/MultiplexConsumer.h"
>  #include "clang/Frontend/TextDiagnosticBuffer.h"
>  #include "clang/Lex/Lexer.h"
>  #include "clang/Lex/Preprocessor.h"
> @@ -51,6 +53,10 @@ static llvm::cl::list
>llvm::cl::desc("Argument to pass to the
> CompilerInvocation"),
>llvm::cl::CommaSeparated);
>
> +static llvm::cl::opt
> +DumpAST("dump-ast", llvm::cl::init(false),
> +llvm::cl::des

r305850 - Preserve CXX method overrides in ASTImporter

2017-06-20 Thread Lang Hames via cfe-commits
Author: lhames
Date: Tue Jun 20 16:06:00 2017
New Revision: 305850

URL: http://llvm.org/viewvc/llvm-project?rev=305850&view=rev
Log:
Preserve CXX method overrides in ASTImporter

Summary:
The ASTImporter should import CXX method overrides from the source context
when it imports a method decl.

Reviewers: spyffe, rsmith, doug.gregor

Reviewed By: spyffe

Differential Revision: https://reviews.llvm.org/D34371

Modified:
cfe/trunk/lib/AST/ASTDumper.cpp
cfe/trunk/lib/AST/ASTImporter.cpp
cfe/trunk/tools/clang-import-test/clang-import-test.cpp

Modified: cfe/trunk/lib/AST/ASTDumper.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=305850&r1=305849&r2=305850&view=diff
==
--- cfe/trunk/lib/AST/ASTDumper.cpp (original)
+++ cfe/trunk/lib/AST/ASTDumper.cpp Tue Jun 20 16:06:00 2017
@@ -1184,6 +1184,28 @@ void ASTDumper::VisitFunctionDecl(const
  I != E; ++I)
   dumpCXXCtorInitializer(*I);
 
+  if (const CXXMethodDecl *MD = dyn_cast(D))
+if (MD->size_overridden_methods() != 0) {
+  auto dumpOverride =
+[=](const CXXMethodDecl *D) {
+  SplitQualType T_split = D->getType().split();
+  OS << D << " " << D->getParent()->getName() << "::"
+ << D->getName() << " '"
+ << QualType::getAsString(T_split) << "'";
+};
+
+  dumpChild([=] {
+auto FirstOverrideItr = MD->begin_overridden_methods();
+OS << "Overrides: [ ";
+dumpOverride(*FirstOverrideItr);
+for (const auto *Override :
+   llvm::make_range(FirstOverrideItr + 1,
+MD->end_overridden_methods()))
+  dumpOverride(Override);
+OS << " ]";
+  });
+}
+
   if (D->doesThisDeclarationHaveABody())
 dumpStmt(D->getBody());
 }

Modified: cfe/trunk/lib/AST/ASTImporter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=305850&r1=305849&r2=305850&view=diff
==
--- cfe/trunk/lib/AST/ASTImporter.cpp (original)
+++ cfe/trunk/lib/AST/ASTImporter.cpp Tue Jun 20 16:06:00 2017
@@ -319,6 +319,9 @@ namespace clang {
 bool ImportArrayChecked(const InContainerTy &InContainer, OIter Obegin) {
   return ImportArrayChecked(InContainer.begin(), InContainer.end(), 
Obegin);
 }
+
+// Importing overrides.
+void ImportOverrides(CXXMethodDecl *ToMethod, CXXMethodDecl *FromMethod);
   };
 }
 
@@ -2025,6 +2028,9 @@ Decl *ASTNodeImporter::VisitFunctionDecl
   // Add this function to the lexical context.
   LexicalDC->addDeclInternal(ToFunction);
 
+  if (auto *FromCXXMethod = dyn_cast(D))
+ImportOverrides(cast(ToFunction), FromCXXMethod);
+
   return ToFunction;
 }
 
@@ -5499,6 +5505,14 @@ Expr *ASTNodeImporter::VisitSubstNonType
 Replacement);
 }
 
+void ASTNodeImporter::ImportOverrides(CXXMethodDecl *ToMethod,
+  CXXMethodDecl *FromMethod) {
+  for (auto *FromOverriddenMethod : FromMethod->overridden_methods())
+ToMethod->addOverriddenMethod(
+  cast(Importer.Import(const_cast(
+FromOverriddenMethod;
+}
+
 ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
  ASTContext &FromContext, FileManager &FromFileManager,
  bool MinimalImport)

Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=305850&r1=305849&r2=305850&view=diff
==
--- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
+++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jun 20 16:06:00 
2017
@@ -17,7 +17,9 @@
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/TargetOptions.h"
 #include "clang/CodeGen/ModuleBuilder.h"
+#include "clang/Frontend/ASTConsumers.h"
 #include "clang/Frontend/CompilerInstance.h"
+#include "clang/Frontend/MultiplexConsumer.h"
 #include "clang/Frontend/TextDiagnosticBuffer.h"
 #include "clang/Lex/Lexer.h"
 #include "clang/Lex/Preprocessor.h"
@@ -51,6 +53,10 @@ static llvm::cl::list
   llvm::cl::desc("Argument to pass to the CompilerInvocation"),
   llvm::cl::CommaSeparated);
 
+static llvm::cl::opt
+DumpAST("dump-ast", llvm::cl::init(false),
+llvm::cl::desc("Dump combined AST"));
+
 namespace init_convenience {
 class TestDiagnosticConsumer : public DiagnosticConsumer {
 private:
@@ -233,7 +239,7 @@ std::unique_ptr BuildI
 }
 
 llvm::Error ParseSource(const std::string &Path, CompilerInstance &CI,
-CodeGenerator &CG) {
+ASTConsumer &Consumer) {
   SourceManager &SM = CI.getSourceManager();
   const FileEntry *FE = CI.getFile