diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3842,6 +3842,15 @@ else return Imp.takeError(); + Expr *DefaultArg = nullptr; + if (D->hasUninstantiatedDefaultArg()) { + if (Error Err = importInto(DefaultArg, D->getUninstantiatedDefaultArg())) + return std::move(Err); + } else if (D->hasDefaultArg()) { + if (Error Err = importInto(DefaultArg, D->getDefaultArg())) + return std::move(Err); + } + ParmVarDecl *ToParm; if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC, ToInnerLocStart, ToLocation, @@ -3853,19 +3862,12 @@ // Set the default argument. ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg()); ToParm->setKNRPromoted(D->isKNRPromoted()); - if (D->hasUninstantiatedDefaultArg()) { - if (auto ToDefArgOrErr = import(D->getUninstantiatedDefaultArg())) - ToParm->setUninstantiatedDefaultArg(*ToDefArgOrErr); - else - return ToDefArgOrErr.takeError(); + ToParm->setUninstantiatedDefaultArg(DefaultArg); } else if (D->hasUnparsedDefaultArg()) { ToParm->setUnparsedDefaultArg(); } else if (D->hasDefaultArg()) { - if (auto ToDefArgOrErr = import(D->getDefaultArg())) - ToParm->setDefaultArg(*ToDefArgOrErr); - else - return ToDefArgOrErr.takeError(); + ToParm->setDefaultArg(DefaultArg); } if (D->isObjCMethodParameter()) { diff --git a/clang/test/Analysis/Inputs/ctu-other.cpp b/clang/test/Analysis/Inputs/ctu-other.cpp --- a/clang/test/Analysis/Inputs/ctu-other.cpp +++ b/clang/test/Analysis/Inputs/ctu-other.cpp @@ -131,3 +131,22 @@ const unsigned int b; }; U extU = {.a = 4}; + +struct DefParmContext { + static const int I; + int f(); +}; + +int fDefParm(int I = DefParmContext::I) { + return I; +} + +int testDefParmIncompleteImport(int I) { + return fDefParm(I); +} + +const int DefParmContext::I = 0; + +int DefParmContext::f() { + return fDefParm(); +} diff --git a/clang/test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt b/clang/test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt --- a/clang/test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt +++ b/clang/test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt @@ -25,3 +25,4 @@ c:@extSubSCN ctu-other.cpp.ast c:@extSCC ctu-other.cpp.ast c:@extU ctu-other.cpp.ast +c:@F@testDefParmIncompleteImport#I# ctu-other.cpp.ast diff --git a/clang/test/Analysis/ctu-main.cpp b/clang/test/Analysis/ctu-main.cpp --- a/clang/test/Analysis/ctu-main.cpp +++ b/clang/test/Analysis/ctu-main.cpp @@ -112,6 +112,8 @@ clang_analyzer_eval(obj->fvcl(1) == 8); // expected-warning{{FALSE}} expected-warning{{TRUE}} } +extern int testDefParmIncompleteImport(int); + int main() { clang_analyzer_eval(f(3) == 2); // expected-warning{{TRUE}} clang_analyzer_eval(f(4) == 3); // expected-warning{{TRUE}} @@ -144,4 +146,6 @@ clang_analyzer_eval(extSubSCN.a == 1); // expected-warning{{TRUE}} // clang_analyzer_eval(extSCC.a == 7); // TODO clang_analyzer_eval(extU.a == 4); // expected-warning{{TRUE}} + + clang_analyzer_eval(testDefParmIncompleteImport(9) == 9); // expected-warning{{TRUE}} }