From 8e9048aebab1ba16b21d9df60fe05bc37b5d5f20 Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Thu, 30 Oct 2025 08:48:19 -0700 Subject: [PATCH] [CSApply] NFC: Unify transform for expressions with a single sub-expression Copy, Borrow, {Any, Optional}Try, VarargExpansion expressions have to perform the same transformation - resolve the type and use it to coerce their sub-expression. This change introduces a single method to do just that instead of copying the same code around. --- lib/Sema/CSApply.cpp | 80 ++++++++++++-------------------------------- 1 file changed, 22 insertions(+), 58 deletions(-) diff --git a/lib/Sema/CSApply.cpp b/lib/Sema/CSApply.cpp index db30109fb1f44..b0cd62eefe1f0 100644 --- a/lib/Sema/CSApply.cpp +++ b/lib/Sema/CSApply.cpp @@ -3285,8 +3285,7 @@ namespace { } Expr *visitSuperRefExpr(SuperRefExpr *expr) { - simplifyExprType(expr); - return expr; + return simplifyExprType(expr); } Expr *visitTypeExpr(TypeExpr *expr) { @@ -3710,55 +3709,34 @@ namespace { return expr; } - Expr *visitCopyExpr(CopyExpr *expr) { - auto toType = simplifyType(cs.getType(expr)); - cs.setType(expr, toType); + /// Given an expression that has a single sub-expression, + /// resolve and set the type for the expression and coerce + /// its sub-expression to the resolved type. This is a common + /// operation for expressions like Copy, Consume, and *Try. + template + Expr *transformExprWithSubExpr(E *expr) { + simplifyExprType(expr); auto *subExpr = expr->getSubExpr(); - auto type = simplifyType(cs.getType(subExpr)); - - // Let's load the value associated with this try. - if (type->hasLValueType()) { - subExpr = coerceToType(subExpr, type->getRValueType(), - cs.getConstraintLocator(subExpr)); - - if (!subExpr) - return nullptr; - } + subExpr = coerceToType(subExpr, cs.getType(expr), + cs.getConstraintLocator(subExpr)); + if (!subExpr) + return nullptr; expr->setSubExpr(subExpr); - return expr; } - Expr *visitConsumeExpr(ConsumeExpr *expr) { - auto toType = simplifyType(cs.getType(expr)); - cs.setType(expr, toType); - - auto *subExpr = expr->getSubExpr(); - auto type = simplifyType(cs.getType(subExpr)); - - // Let's load the value associated with this consume. - if (type->hasLValueType()) { - subExpr = coerceToType(subExpr, type->getRValueType(), - cs.getConstraintLocator(subExpr)); - - if (!subExpr) - return nullptr; - } - - expr->setSubExpr(subExpr); + Expr *visitCopyExpr(CopyExpr *expr) { + return transformExprWithSubExpr(expr); + } - return expr; + Expr *visitConsumeExpr(ConsumeExpr *expr) { + return transformExprWithSubExpr(expr); } Expr *visitAnyTryExpr(AnyTryExpr *expr) { - simplifyExprType(expr); - - auto *subExpr = expr->getSubExpr(); - expr->setSubExpr(coerceToType(subExpr, cs.getType(expr), - cs.getConstraintLocator(subExpr))); - return expr; + return transformExprWithSubExpr(expr); } Expr *visitOptionalTryExpr(OptionalTryExpr *expr) { @@ -3775,16 +3753,8 @@ namespace { // Nothing to do for Swift 4 and earlier! return simplifyExprType(expr); } - - Type exprType = simplifyType(cs.getType(expr)); - auto subExpr = coerceToType(expr->getSubExpr(), exprType, - cs.getConstraintLocator(expr)); - if (!subExpr) return nullptr; - expr->setSubExpr(subExpr); - - cs.setType(expr, exprType); - return expr; + return transformExprWithSubExpr(expr); } Expr *visitParenExpr(ParenExpr *expr) { @@ -3793,7 +3763,7 @@ namespace { // A ParenExpr can end up with a tuple type if it contains // a pack expansion. Rewrite it to a TupleExpr. - if (dyn_cast(expr->getSubExpr())) { + if (isa(expr->getSubExpr())) { result = TupleExpr::create(ctx, expr->getLParenLoc(), {expr->getSubExpr()}, /*elementNames=*/{}, @@ -3948,8 +3918,7 @@ namespace { } Expr *visitTupleElementExpr(TupleElementExpr *expr) { - simplifyExprType(expr); - return expr; + return simplifyExprType(expr); } Expr *visitCaptureListExpr(CaptureListExpr *expr) { @@ -3976,12 +3945,7 @@ namespace { } Expr *visitVarargExpansionExpr(VarargExpansionExpr *expr) { - simplifyExprType(expr); - - auto arrayTy = cs.getType(expr); - expr->setSubExpr(coerceToType(expr->getSubExpr(), arrayTy, - cs.getConstraintLocator(expr))); - return expr; + return transformExprWithSubExpr(expr); } Expr *visitPackExpansionExpr(PackExpansionExpr *expr) {