]> granicus.if.org Git - clang/commitdiff
[ASTImporter] Support default argument initialization of ParmVarDecls
authorAleksei Sidorin <a.sidorin@samsung.com>
Mon, 20 Feb 2017 11:57:12 +0000 (11:57 +0000)
committerAleksei Sidorin <a.sidorin@samsung.com>
Mon, 20 Feb 2017 11:57:12 +0000 (11:57 +0000)
Patch by Peter Szecsi!

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@295654 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTImporter.cpp
test/ASTMerge/exprs-cpp/Inputs/exprs3.cpp
test/ASTMerge/exprs-cpp/test.cpp

index 9ded89413e8d8c4cab44ad1945220f049f5ab6bd..780d0bc76632a681d63c4107e51b4b36f4477f07 100644 (file)
@@ -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();
index 7ed8e338452f7483a1a8ee146cc3325903c6e015..2a33c35d9ea68adc2c4b5d96e8ddd0d3e4a511a1 100644 (file)
@@ -108,6 +108,10 @@ int testDefaultArg(int a = 2*2) {
   return a;
 }
 
+int testDefaultArgExpr() {
+  return testDefaultArg();
+}
+
 template <typename T> // T has TemplateTypeParmType
 void testTemplateTypeParmType(int i);
 
index ba1f18b2c90c312dc42399d0c75c7d532151ebec..0535aa85330f6c73baef858f7d88c3259bc3d74c 100644 (file)
@@ -41,5 +41,7 @@ void testImport(int *x, const S1 &cs1, S1 &s1) {
   testScalarInit(42);
   testOffsetOf();
   testDefaultArg(12);
+  testDefaultArg();
+  testDefaultArgExpr();
   useTemplateType();
 }