Skip to content
This repository was archived by the owner on Mar 30, 2021. It is now read-only.

Commit 74fd442

Browse files
balazskemartong
authored andcommitted
Import default expression of param before creating the param (#697)
1 parent a2e66ca commit 74fd442

File tree

4 files changed

+35
-9
lines changed

4 files changed

+35
-9
lines changed

lib/AST/ASTImporter.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3929,6 +3929,15 @@ ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
39293929
else
39303930
return Imp.takeError();
39313931

3932+
Expr *DefaultArg = nullptr;
3933+
if (D->hasUninstantiatedDefaultArg()) {
3934+
if (Error Err = importInto(DefaultArg, D->getUninstantiatedDefaultArg()))
3935+
return std::move(Err);
3936+
} else if (D->hasDefaultArg()) {
3937+
if (Error Err = importInto(DefaultArg, D->getDefaultArg()))
3938+
return std::move(Err);
3939+
}
3940+
39323941
ParmVarDecl *ToParm;
39333942
if (GetImportedOrCreateDecl(ToParm, D, Importer.getToContext(), DC,
39343943
ToInnerLocStart, ToLocation,
@@ -3940,19 +3949,12 @@ ExpectedDecl ASTNodeImporter::VisitParmVarDecl(ParmVarDecl *D) {
39403949
// Set the default argument.
39413950
ToParm->setHasInheritedDefaultArg(D->hasInheritedDefaultArg());
39423951
ToParm->setKNRPromoted(D->isKNRPromoted());
3943-
39443952
if (D->hasUninstantiatedDefaultArg()) {
3945-
if (auto ToDefArgOrErr = import(D->getUninstantiatedDefaultArg()))
3946-
ToParm->setUninstantiatedDefaultArg(*ToDefArgOrErr);
3947-
else
3948-
return ToDefArgOrErr.takeError();
3953+
ToParm->setUninstantiatedDefaultArg(DefaultArg);
39493954
} else if (D->hasUnparsedDefaultArg()) {
39503955
ToParm->setUnparsedDefaultArg();
39513956
} else if (D->hasDefaultArg()) {
3952-
if (auto ToDefArgOrErr = import(D->getDefaultArg()))
3953-
ToParm->setDefaultArg(*ToDefArgOrErr);
3954-
else
3955-
return ToDefArgOrErr.takeError();
3957+
ToParm->setDefaultArg(DefaultArg);
39563958
}
39573959

39583960
if (D->isObjCMethodParameter()) {

test/Analysis/Inputs/ctu-other.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,22 @@ int other_macro_diag(int x) {
9393
MACRODIAG();
9494
return x;
9595
}
96+
97+
struct DefParmContext {
98+
static const int I;
99+
int f();
100+
};
101+
102+
int fDefParm(int I = DefParmContext::I) {
103+
return I;
104+
}
105+
106+
int testDefParmIncompleteImport(int I) {
107+
return fDefParm(I);
108+
}
109+
110+
const int DefParmContext::I = 0;
111+
112+
int DefParmContext::f() {
113+
return fDefParm();
114+
}

test/Analysis/Inputs/ctu-other.cpp.externalDefMap.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ c:@N@chns@S@chcls@F@chf4#I# ctu-chain.cpp.ast
1515
c:@N@chns@F@chf2#I# ctu-chain.cpp.ast
1616
c:@F@fun_using_anon_struct#I# ctu-other.cpp.ast
1717
c:@F@other_macro_diag#I# ctu-other.cpp.ast
18+
c:@F@testDefParmIncompleteImport#I# ctu-other.cpp.ast

test/Analysis/ctu-main.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ void test_virtual_functions(mycls* obj) {
7575
clang_analyzer_eval(obj->fvcl(1) == 9); // expected-warning{{FALSE}} expected-warning{{TRUE}}
7676
}
7777

78+
extern int testDefParmIncompleteImport(int);
79+
7880
int main() {
7981
clang_analyzer_eval(f(3) == 2); // expected-warning{{TRUE}}
8082
clang_analyzer_eval(f(4) == 3); // expected-warning{{TRUE}}
@@ -95,4 +97,6 @@ int main() {
9597
clang_analyzer_eval(other_macro_diag(1) == 1); // expected-warning{{TRUE}}
9698
// expected-warning@Inputs/ctu-other.cpp:93{{REACHABLE}}
9799
MACRODIAG(); // expected-warning{{REACHABLE}}
100+
101+
clang_analyzer_eval(testDefParmIncompleteImport(9) == 9); // expected-warning{{TRUE}}
98102
}

0 commit comments

Comments
 (0)