================
@@ -5927,80 +5939,120 @@ ExprResult
Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
// expression is an ExprWithCleanups. Then make sure the normal lifetime
// extension code recurses into the default initializer and does lifetime
// extension when warranted.
- bool ContainsAnyTemporaries =
- isa_and_present<ExprWithCleanups>(Field->getInClassInitializer());
- if (Field->getInClassInitializer() &&
- !Field->getInClassInitializer()->containsErrors() &&
+ bool ContainsAnyTemporaries = isa<ExprWithCleanups>(InClassInit);
+ Expr *Init = InClassInit;
+ if (!InClassInit->containsErrors() &&
(V.HasImmediateCalls || (NeedRebuild && ContainsAnyTemporaries))) {
ExprEvalContexts.back().DelayedDefaultInitializationContext = {Loc, Field,
CurContext};
ExprEvalContexts.back().IsCurrentlyCheckingDefaultArgumentOrInitializer =
NestedDefaultChecking;
// Pass down lifetime extending flag, and collect temporaries in
- // CreateMaterializeTemporaryExpr when we rewrite the call argument.
+ // CreateMaterializeTemporaryExpr when we rewrite the initializer.
currentEvaluationContext().InLifetimeExtendingContext =
parentEvaluationContext().InLifetimeExtendingContext;
+
EnsureImmediateInvocationInDefaultArgs Immediate(*this);
ExprResult Res;
runWithSufficientStackSpace(Loc, [&] {
- Res = Immediate.TransformInitializer(Field->getInClassInitializer(),
+ Res = Immediate.TransformInitializer(InClassInit,
/*CXXDirectInit=*/false);
});
if (!Res.isInvalid())
- Res = ConvertMemberDefaultInitExpression(Field, Res.get(), Loc);
+ Res = ConvertMemberDefaultInitExpression(Field, Entity, Res.get(), Loc);
if (Res.isInvalid()) {
Field->setInvalidDecl();
return ExprError();
}
Init = Res.get();
}
- if (Field->getInClassInitializer()) {
- Expr *E = Init ? Init : Field->getInClassInitializer();
- if (!NestedDefaultChecking)
- runWithSufficientStackSpace(Loc, [&] {
- MarkDeclarationsReferencedInExpr(E, /*SkipLocalVariables=*/false);
- });
- if (isInLifetimeExtendingContext())
- DiscardCleanupsInEvaluationContext();
- // C++11 [class.base.init]p7:
- // The initialization of each base and member constitutes a
- // full-expression.
- ExprResult Res = ActOnFinishFullExpr(E, /*DiscardedValue=*/false);
- if (Res.isInvalid()) {
- Field->setInvalidDecl();
- return ExprError();
- }
- Init = Res.get();
+ if (!NestedDefaultChecking)
+ runWithSufficientStackSpace(Loc, [&] {
+ MarkDeclarationsReferencedInExpr(Init, /*SkipLocalVariables=*/false);
+ });
+ return Init;
+}
- return CXXDefaultInitExpr::Create(Context, InitializationContext->Loc,
- Field, InitializationContext->Context,
- Init);
- }
+ExprResult Sema::BuildCXXCtorDefaultInitExpr(SourceLocation Loc,
+ FieldDecl *Field) {
+ assert(Field->hasInClassInitializer());
- // DR1351:
- // If the brace-or-equal-initializer of a non-static data member
- // invokes a defaulted default constructor of its class or of an
- // enclosing class in a potentially evaluated subexpression, the
- // program is ill-formed.
- //
- // This resolution is unworkable: the exception specification of the
- // default constructor can be needed in an unevaluated context, in
- // particular, in the operand of a noexcept-expression, and we can be
- // unable to compute an exception specification for an enclosed class.
- //
- // Any attempt to resolve the exception specification of a defaulted default
- // constructor before the initializer is lexically complete will ultimately
- // come here at which point we can diagnose it.
- RecordDecl *OutermostClass = ParentRD->getOuterLexicalRecordContext();
- Diag(Loc, diag::err_default_member_initializer_not_yet_parsed)
- << OutermostClass << Field;
- Diag(Field->getEndLoc(),
- diag::note_default_member_initializer_not_yet_parsed);
- // Recover by marking the field invalid, unless we're in a SFINAE context.
- if (!isSFINAEContext())
+ bool NestedDefaultChecking = isCheckingDefaultArgumentOrInitializer();
+ bool NeedRebuild = needsRebuildOfDefaultArgOrInit();
----------------
yronglin wrote:
Good catch! Yes, it's should always false, I have updated the comment.
https://github.com/llvm/llvm-project/pull/219288
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits