Skip to content

Commit 2ba29d3

Browse files
authored
Merge pull request #85183 from slavapestov/fix-issue-85034
Sema: Don't coerce subexpression of 'try' to rvalue
2 parents 5f45e5a + 8fd7a1d commit 2ba29d3

File tree

6 files changed

+34
-10
lines changed

6 files changed

+34
-10
lines changed

lib/Sema/CSApply.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3752,7 +3752,11 @@ namespace {
37523752
return expr;
37533753
}
37543754

3755-
Expr *visitAnyTryExpr(AnyTryExpr *expr) {
3755+
Expr *visitTryExpr(TryExpr *expr) {
3756+
return simplifyExprType(expr);
3757+
}
3758+
3759+
Expr *visitForceTryExpr(ForceTryExpr *expr) {
37563760
auto *subExpr = expr->getSubExpr();
37573761
auto type = simplifyType(cs.getType(subExpr));
37583762

lib/Sema/CSGen.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2060,10 +2060,20 @@ namespace {
20602060
return valueTy;
20612061
}
20622062

2063-
Type visitAnyTryExpr(AnyTryExpr *expr) {
2063+
Type visitTryExpr(AnyTryExpr *expr) {
20642064
return CS.getType(expr->getSubExpr());
20652065
}
20662066

2067+
Type visitForceTryExpr(AnyTryExpr *expr) {
2068+
auto valueTy = CS.createTypeVariable(CS.getConstraintLocator(expr),
2069+
TVO_PrefersSubtypeBinding |
2070+
TVO_CanBindToNoEscape);
2071+
CS.addConstraint(ConstraintKind::Equal, valueTy,
2072+
CS.getType(expr->getSubExpr()),
2073+
CS.getConstraintLocator(expr));
2074+
return valueTy;
2075+
}
2076+
20672077
Type visitOptionalTryExpr(OptionalTryExpr *expr) {
20682078
auto valueTy = CS.createTypeVariable(CS.getConstraintLocator(expr),
20692079
TVO_PrefersSubtypeBinding |

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,10 +1192,7 @@ TypeChecker::coerceToRValue(ASTContext &Context, Expr *expr,
11921192
llvm::function_ref<Type(Expr *)> getType,
11931193
llvm::function_ref<void(Expr *, Type)> setType) {
11941194
Type exprTy = getType(expr);
1195-
1196-
// If expr has no type, just assume it's the right expr.
1197-
if (!exprTy)
1198-
return expr;
1195+
ASSERT(exprTy);
11991196

12001197
// If the type is already materializable, then we're already done.
12011198
if (!exprTy->hasLValueType())

lib/Sema/TypeCheckStmt.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,10 +1702,11 @@ class StmtChecker : public StmtVisitor<StmtChecker, Stmt*> {
17021702
// Type-check the subject expression.
17031703
Expr *subjectExpr = switchStmt->getSubjectExpr();
17041704
auto resultTy = TypeChecker::typeCheckExpression(subjectExpr, DC);
1705+
17051706
auto limitExhaustivityChecks = !resultTy;
1706-
if (Expr *newSubjectExpr =
1707-
TypeChecker::coerceToRValue(getASTContext(), subjectExpr))
1708-
subjectExpr = newSubjectExpr;
1707+
if (resultTy)
1708+
subjectExpr = TypeChecker::coerceToRValue(getASTContext(), subjectExpr);
1709+
17091710
switchStmt->setSubjectExpr(subjectExpr);
17101711
Type subjectType = switchStmt->getSubjectExpr()->getType();
17111712

validation-test/Sema/type_checker_crashers_fixed/rdar78102266.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend %s -typecheck
1+
// RUN: %target-swift-emit-silgen %s
22

33
struct Info {
44
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %target-typecheck-verify-swift
2+
// RUN: %target-swift-emit-silgen %s
3+
4+
class C {
5+
var x = 0
6+
}
7+
8+
do {
9+
let x = C()
10+
let _ = (0, try x.x) // expected-warning {{no calls to throwing functions occur within 'try' expression}}
11+
let _ = (0, try! x.x) // expected-warning {{no calls to throwing functions occur within 'try' expression}}
12+
}

0 commit comments

Comments
 (0)