From 55a63506131cf41de20c18a2e9f8c1d21082694d Mon Sep 17 00:00:00 2001 From: Aleksei Sidorin Date: Mon, 20 Feb 2017 11:57:12 +0000 Subject: [PATCH] [ASTImporter] Support default argument initialization of ParmVarDecls Patch by Peter Szecsi! Differential Revision: https://reviews.llvm.org/D29612 llvm-svn: 295654 --- clang/lib/AST/ASTImporter.cpp | 21 ++++++++++++++++++- .../test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp | 4 ++++ clang/test/ASTMerge/exprs-cpp/test.cpp | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 9ded89413e8d..780d0bc76632 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3859,8 +3859,27 @@ Decl *ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) { Importer.Import(D->getInnerLocStart()), Loc, Name.getAsIdentifierInfo(), T, TInfo, D->getStorageClass(), - /*FIXME: Default argument*/nullptr); + /*DefaultArg*/ nullptr); + + // Set the default argument. ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); + ToParm->setKNRPromoted(D->isKNRPromoted()); + + Expr *ToDefArg = nullptr; + Expr *FromDefArg = nullptr; + if (D->hasUninstantiatedDefaultArg()) { + FromDefArg = D->getUninstantiatedDefaultArg(); + ToDefArg = Importer.Import(FromDefArg); + ToParm->setUninstantiatedDefaultArg(ToDefArg); + } else if (D->hasUnparsedDefaultArg()) { + ToParm->setUnparsedDefaultArg(); + } else if (D->hasDefaultArg()) { + FromDefArg = D->getDefaultArg(); + ToDefArg = Importer.Import(FromDefArg); + ToParm->setDefaultArg(ToDefArg); + } + if (FromDefArg && !ToDefArg) + return nullptr; if (D->isUsed()) ToParm->setIsUsed(); diff --git a/clang/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp b/clang/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp index 7ed8e338452f..2a33c35d9ea6 100644 --- a/clang/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp +++ b/clang/test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp @@ -108,6 +108,10 @@ int testDefaultArg(int a = 2*2) { return a; } +int testDefaultArgExpr() { + return testDefaultArg(); +} + template // T has TemplateTypeParmType void testTemplateTypeParmType(int i); diff --git a/clang/test/ASTMerge/exprs-cpp/test.cpp b/clang/test/ASTMerge/exprs-cpp/test.cpp index ba1f18b2c90c..0535aa85330f 100644 --- a/clang/test/ASTMerge/exprs-cpp/test.cpp +++ b/clang/test/ASTMerge/exprs-cpp/test.cpp @@ -41,5 +41,7 @@ void testImport(int *x, const S1 &cs1, S1 &s1) { testScalarInit(42); testOffsetOf(); testDefaultArg(12); + testDefaultArg(); + testDefaultArgExpr(); useTemplateType(); }