Skip to content

Commit c565183

Browse files
committed
[Clang][AST] {CXXDefaultArgExpr, CXXDefaultInitExpr}::hasRewrittenInit return true iif the init expression was really rebuild
Signed-off-by: yronglin <[email protected]>
1 parent 9d86722 commit c565183

File tree

8 files changed

+45
-39
lines changed

8 files changed

+45
-39
lines changed

clang/include/clang/AST/ExprCXX.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,8 @@ class CXXDefaultArgExpr final
12771277
DeclContext *UsedContext;
12781278

12791279
CXXDefaultArgExpr(StmtClass SC, SourceLocation Loc, ParmVarDecl *Param,
1280-
Expr *RewrittenExpr, DeclContext *UsedContext)
1280+
DeclContext *UsedContext, Expr *RewrittenExpr,
1281+
bool HasRewrittenInit)
12811282
: Expr(SC,
12821283
Param->hasUnparsedDefaultArg()
12831284
? Param->getType().getNonReferenceType()
@@ -1286,7 +1287,7 @@ class CXXDefaultArgExpr final
12861287
Param->getDefaultArg()->getObjectKind()),
12871288
Param(Param), UsedContext(UsedContext) {
12881289
CXXDefaultArgExprBits.Loc = Loc;
1289-
CXXDefaultArgExprBits.HasRewrittenInit = RewrittenExpr != nullptr;
1290+
CXXDefaultArgExprBits.HasRewrittenInit = HasRewrittenInit;
12901291
if (RewrittenExpr)
12911292
*getTrailingObjects<Expr *>() = RewrittenExpr;
12921293
setDependence(computeDependence(this));
@@ -1304,8 +1305,8 @@ class CXXDefaultArgExpr final
13041305
// \p Param is the parameter whose default argument is used by this
13051306
// expression.
13061307
static CXXDefaultArgExpr *Create(const ASTContext &C, SourceLocation Loc,
1307-
ParmVarDecl *Param, Expr *RewrittenExpr,
1308-
DeclContext *UsedContext);
1308+
ParmVarDecl *Param, DeclContext *UsedContext,
1309+
Expr *InitExpr, bool HasRewrittenInit);
13091310
// Retrieve the parameter that the argument was created from.
13101311
const ParmVarDecl *getParam() const { return Param; }
13111312
ParmVarDecl *getParam() { return Param; }
@@ -1385,7 +1386,7 @@ class CXXDefaultInitExpr final
13851386

13861387
CXXDefaultInitExpr(const ASTContext &Ctx, SourceLocation Loc,
13871388
FieldDecl *Field, QualType Ty, DeclContext *UsedContext,
1388-
Expr *RewrittenInitExpr);
1389+
Expr *InitExpr, bool HasRewrittenInit);
13891390

13901391
CXXDefaultInitExpr(EmptyShell Empty, bool HasRewrittenInit)
13911392
: Expr(CXXDefaultInitExprClass, Empty) {
@@ -1399,7 +1400,7 @@ class CXXDefaultInitExpr final
13991400
/// by this expression.
14001401
static CXXDefaultInitExpr *Create(const ASTContext &Ctx, SourceLocation Loc,
14011402
FieldDecl *Field, DeclContext *UsedContext,
1402-
Expr *RewrittenInitExpr);
1403+
Expr *InitExpr, bool HasRewrittenInit);
14031404

14041405
bool hasRewrittenInit() const {
14051406
return CXXDefaultInitExprBits.HasRewrittenInit;

clang/lib/AST/ASTImporter.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8107,8 +8107,8 @@ ExpectedStmt ASTNodeImporter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
81078107
RewrittenInit = ExprOrErr.get();
81088108
}
81098109
return CXXDefaultArgExpr::Create(Importer.getToContext(), *ToUsedLocOrErr,
8110-
*ToParamOrErr, RewrittenInit,
8111-
*UsedContextOrErr);
8110+
*ToParamOrErr, *UsedContextOrErr,
8111+
RewrittenInit, E->hasRewrittenInit());
81128112
}
81138113

81148114
ExpectedStmt
@@ -8814,7 +8814,8 @@ ExpectedStmt ASTNodeImporter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
88148814
}
88158815

88168816
return CXXDefaultInitExpr::Create(Importer.getToContext(), *ToBeginLocOrErr,
8817-
ToField, *UsedContextOrErr, RewrittenInit);
8817+
ToField, *UsedContextOrErr, RewrittenInit,
8818+
E->hasRewrittenInit());
88188819
}
88198820

88208821
ExpectedStmt ASTNodeImporter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {

clang/lib/AST/ExprCXX.cpp

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,15 +1013,15 @@ CXXDefaultArgExpr *CXXDefaultArgExpr::CreateEmpty(const ASTContext &C,
10131013
return new (Mem) CXXDefaultArgExpr(EmptyShell(), HasRewrittenInit);
10141014
}
10151015

1016-
CXXDefaultArgExpr *CXXDefaultArgExpr::Create(const ASTContext &C,
1017-
SourceLocation Loc,
1018-
ParmVarDecl *Param,
1019-
Expr *RewrittenExpr,
1020-
DeclContext *UsedContext) {
1016+
CXXDefaultArgExpr *
1017+
CXXDefaultArgExpr::Create(const ASTContext &C, SourceLocation Loc,
1018+
ParmVarDecl *Param, DeclContext *UsedContext,
1019+
Expr *RewrittenExpr, bool HasRewrittenInit) {
10211020
size_t Size = totalSizeToAlloc<Expr *>(RewrittenExpr != nullptr);
10221021
auto *Mem = C.Allocate(Size, alignof(CXXDefaultArgExpr));
1023-
return new (Mem) CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param,
1024-
RewrittenExpr, UsedContext);
1022+
return new (Mem)
1023+
CXXDefaultArgExpr(CXXDefaultArgExprClass, Loc, Param, UsedContext,
1024+
RewrittenExpr, HasRewrittenInit);
10251025
}
10261026

10271027
Expr *CXXDefaultArgExpr::getExpr() {
@@ -1042,18 +1042,18 @@ Expr *CXXDefaultArgExpr::getAdjustedRewrittenExpr() {
10421042
CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx,
10431043
SourceLocation Loc, FieldDecl *Field,
10441044
QualType Ty, DeclContext *UsedContext,
1045-
Expr *RewrittenInitExpr)
1045+
Expr *InitExpr, bool HasRewrittenInit)
10461046
: Expr(CXXDefaultInitExprClass, Ty.getNonLValueExprType(Ctx),
10471047
Ty->isLValueReferenceType() ? VK_LValue
10481048
: Ty->isRValueReferenceType() ? VK_XValue
10491049
: VK_PRValue,
10501050
/*FIXME*/ OK_Ordinary),
10511051
Field(Field), UsedContext(UsedContext) {
10521052
CXXDefaultInitExprBits.Loc = Loc;
1053-
CXXDefaultInitExprBits.HasRewrittenInit = RewrittenInitExpr != nullptr;
1053+
CXXDefaultInitExprBits.HasRewrittenInit = HasRewrittenInit;
10541054

10551055
if (CXXDefaultInitExprBits.HasRewrittenInit)
1056-
*getTrailingObjects<Expr *>() = RewrittenInitExpr;
1056+
*getTrailingObjects<Expr *>() = InitExpr;
10571057

10581058
assert(Field->hasInClassInitializer());
10591059

@@ -1067,16 +1067,15 @@ CXXDefaultInitExpr *CXXDefaultInitExpr::CreateEmpty(const ASTContext &C,
10671067
return new (Mem) CXXDefaultInitExpr(EmptyShell(), HasRewrittenInit);
10681068
}
10691069

1070-
CXXDefaultInitExpr *CXXDefaultInitExpr::Create(const ASTContext &Ctx,
1071-
SourceLocation Loc,
1072-
FieldDecl *Field,
1073-
DeclContext *UsedContext,
1074-
Expr *RewrittenInitExpr) {
1070+
CXXDefaultInitExpr *
1071+
CXXDefaultInitExpr::Create(const ASTContext &Ctx, SourceLocation Loc,
1072+
FieldDecl *Field, DeclContext *UsedContext,
1073+
Expr *InitExpr, bool HasRewrittenInit) {
10751074

1076-
size_t Size = totalSizeToAlloc<Expr *>(RewrittenInitExpr != nullptr);
1075+
size_t Size = totalSizeToAlloc<Expr *>(InitExpr != nullptr);
10771076
auto *Mem = Ctx.Allocate(Size, alignof(CXXDefaultInitExpr));
10781077
return new (Mem) CXXDefaultInitExpr(Ctx, Loc, Field, Field->getType(),
1079-
UsedContext, RewrittenInitExpr);
1078+
UsedContext, InitExpr, HasRewrittenInit);
10801079
}
10811080

10821081
Expr *CXXDefaultInitExpr::getExpr() {

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,11 +1579,11 @@ void JSONNodeDumper::VisitMaterializeTemporaryExpr(
15791579
}
15801580

15811581
void JSONNodeDumper::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node) {
1582-
attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1582+
JOS.attribute("hasRewrittenInit", Node->hasRewrittenInit());
15831583
}
15841584

15851585
void JSONNodeDumper::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node) {
1586-
attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1586+
JOS.attribute("hasRewrittenInit", Node->hasRewrittenInit());
15871587
}
15881588

15891589
void JSONNodeDumper::VisitCXXDependentScopeMemberExpr(

clang/lib/Sema/SemaExpr.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5426,6 +5426,7 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
54265426

54275427
bool NestedDefaultChecking = isCheckingDefaultArgumentOrInitializer();
54285428
bool InLifetimeExtendingContext = isInLifetimeExtendingContext();
5429+
bool HasRewrittenInit = false;
54295430
std::optional<ExpressionEvaluationContextRecord::InitializationContext>
54305431
InitializationContext =
54315432
OutermostDeclarationWithDelayedImmediateInvocations();
@@ -5458,10 +5459,10 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
54585459
ImmediateCallVisitor V(getASTContext());
54595460
if (!NestedDefaultChecking)
54605461
V.TraverseDecl(Param);
5461-
5462+
HasRewrittenInit = V.HasImmediateCalls || InLifetimeExtendingContext;
54625463
// Rewrite the call argument that was created from the corresponding
54635464
// parameter's default argument.
5464-
if (V.HasImmediateCalls || InLifetimeExtendingContext) {
5465+
if (HasRewrittenInit) {
54655466
if (V.HasImmediateCalls)
54665467
ExprEvalContexts.back().DelayedDefaultInitializationContext = {
54675468
CallLoc, Param, CurContext};
@@ -5490,7 +5491,8 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc,
54905491
return ExprError();
54915492

54925493
return CXXDefaultArgExpr::Create(Context, InitializationContext->Loc, Param,
5493-
Init, InitializationContext->Context);
5494+
InitializationContext->Context, Init,
5495+
HasRewrittenInit);
54945496
}
54955497

54965498
ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
@@ -5548,7 +5550,9 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
55485550
ImmediateCallVisitor V(getASTContext());
55495551
if (!NestedDefaultChecking)
55505552
V.TraverseDecl(Field);
5551-
if (V.HasImmediateCalls) {
5553+
5554+
bool HasRewrittenInit = V.HasImmediateCalls;
5555+
if (HasRewrittenInit) {
55525556
ExprEvalContexts.back().DelayedDefaultInitializationContext = {Loc, Field,
55535557
CurContext};
55545558
ExprEvalContexts.back().IsCurrentlyCheckingDefaultArgumentOrInitializer =
@@ -5587,7 +5591,7 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
55875591

55885592
return CXXDefaultInitExpr::Create(Context, InitializationContext->Loc,
55895593
Field, InitializationContext->Context,
5590-
Init);
5594+
Init, HasRewrittenInit);
55915595
}
55925596

55935597
// DR1351:

clang/lib/Sema/TreeTransform.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3369,9 +3369,10 @@ class TreeTransform {
33693369
/// require any semantic analysis. Subclasses may override this routine to
33703370
/// provide different behavior.
33713371
ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3372-
Expr *RewrittenExpr) {
3372+
Expr *InitExpr, bool HasRewrittenExpr) {
33733373
return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3374-
RewrittenExpr, getSema().CurContext);
3374+
getSema().CurContext, InitExpr,
3375+
HasRewrittenExpr);
33753376
}
33763377

33773378
/// Build a new C++11 default-initialization expression.
@@ -13307,8 +13308,8 @@ TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1330713308
InitRes.get() == E->getRewrittenExpr())
1330813309
return E;
1330913310

13310-
return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
13311-
InitRes.get());
13311+
return getDerived().RebuildCXXDefaultArgExpr(
13312+
E->getUsedLocation(), Param, InitRes.get(), E->hasRewrittenInit());
1331213313
}
1331313314

1331413315
template<typename Derived>

clang/test/AST/ast-dump-default-init-json.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ void test() {
745745
// CHECK-NEXT: "qualType": "const A"
746746
// CHECK-NEXT: },
747747
// CHECK-NEXT: "valueCategory": "lvalue",
748-
// CHECK-NEXT: "hasRewrittenInit": true,
748+
// CHECK-NEXT: "hasRewrittenInit": false,
749749
// CHECK-NEXT: "inner": [
750750
// CHECK-NEXT: {
751751
// CHECK-NEXT: "id": "0x{{.*}}",

clang/test/AST/ast-dump-default-init.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct B {
1111
void test() {
1212
B b{};
1313
}
14-
// CHECK: -CXXDefaultInitExpr 0x{{[^ ]*}} <{{.*}}> 'const A' lvalue has rewritten init
14+
// CHECK: -CXXDefaultInitExpr 0x{{[^ ]*}} <{{.*}}> 'const A' lvalue
1515
// CHECK-NEXT: `-ExprWithCleanups 0x{{[^ ]*}} <{{.*}}> 'const A' lvalue
1616
// CHECK-NEXT: `-MaterializeTemporaryExpr 0x{{[^ ]*}} <{{.*}}> 'const A' lvalue extended by Field 0x{{[^ ]*}} 'a' 'const A &'
1717
// CHECK-NEXT: `-ImplicitCastExpr 0x{{[^ ]*}} <{{.*}}> 'const A' <NoOp>

0 commit comments

Comments
 (0)