diff --git a/lib/Sema/CSApply.cpp b/lib/Sema/CSApply.cpp index 900375b327fd6..96dbd06c25e82 100644 --- a/lib/Sema/CSApply.cpp +++ b/lib/Sema/CSApply.cpp @@ -3752,7 +3752,11 @@ namespace { return expr; } - Expr *visitAnyTryExpr(AnyTryExpr *expr) { + Expr *visitTryExpr(TryExpr *expr) { + return simplifyExprType(expr); + } + + Expr *visitForceTryExpr(ForceTryExpr *expr) { auto *subExpr = expr->getSubExpr(); auto type = simplifyType(cs.getType(subExpr)); diff --git a/lib/Sema/CSGen.cpp b/lib/Sema/CSGen.cpp index 20ecbaa9567a2..850d858fbbbc5 100644 --- a/lib/Sema/CSGen.cpp +++ b/lib/Sema/CSGen.cpp @@ -2060,10 +2060,20 @@ namespace { return valueTy; } - Type visitAnyTryExpr(AnyTryExpr *expr) { + Type visitTryExpr(AnyTryExpr *expr) { return CS.getType(expr->getSubExpr()); } + Type visitForceTryExpr(AnyTryExpr *expr) { + auto valueTy = CS.createTypeVariable(CS.getConstraintLocator(expr), + TVO_PrefersSubtypeBinding | + TVO_CanBindToNoEscape); + CS.addConstraint(ConstraintKind::Equal, valueTy, + CS.getType(expr->getSubExpr()), + CS.getConstraintLocator(expr)); + return valueTy; + } + Type visitOptionalTryExpr(OptionalTryExpr *expr) { auto valueTy = CS.createTypeVariable(CS.getConstraintLocator(expr), TVO_PrefersSubtypeBinding | diff --git a/lib/Sema/TypeCheckConstraints.cpp b/lib/Sema/TypeCheckConstraints.cpp index 9d3c4fe2310e2..b3c00f731bbc8 100644 --- a/lib/Sema/TypeCheckConstraints.cpp +++ b/lib/Sema/TypeCheckConstraints.cpp @@ -1192,10 +1192,7 @@ TypeChecker::coerceToRValue(ASTContext &Context, Expr *expr, llvm::function_ref getType, llvm::function_ref setType) { Type exprTy = getType(expr); - - // If expr has no type, just assume it's the right expr. - if (!exprTy) - return expr; + ASSERT(exprTy); // If the type is already materializable, then we're already done. if (!exprTy->hasLValueType()) diff --git a/lib/Sema/TypeCheckStmt.cpp b/lib/Sema/TypeCheckStmt.cpp index 0bad17c728222..1a8b3939138ca 100644 --- a/lib/Sema/TypeCheckStmt.cpp +++ b/lib/Sema/TypeCheckStmt.cpp @@ -1702,10 +1702,11 @@ class StmtChecker : public StmtVisitor { // Type-check the subject expression. Expr *subjectExpr = switchStmt->getSubjectExpr(); auto resultTy = TypeChecker::typeCheckExpression(subjectExpr, DC); + auto limitExhaustivityChecks = !resultTy; - if (Expr *newSubjectExpr = - TypeChecker::coerceToRValue(getASTContext(), subjectExpr)) - subjectExpr = newSubjectExpr; + if (resultTy) + subjectExpr = TypeChecker::coerceToRValue(getASTContext(), subjectExpr); + switchStmt->setSubjectExpr(subjectExpr); Type subjectType = switchStmt->getSubjectExpr()->getType(); diff --git a/validation-test/Sema/type_checker_crashers_fixed/rdar78102266.swift b/validation-test/Sema/type_checker_crashers_fixed/rdar78102266.swift index 704728f2f1653..e705239b2d9d9 100644 --- a/validation-test/Sema/type_checker_crashers_fixed/rdar78102266.swift +++ b/validation-test/Sema/type_checker_crashers_fixed/rdar78102266.swift @@ -1,4 +1,4 @@ -// RUN: %target-swift-frontend %s -typecheck +// RUN: %target-swift-emit-silgen %s struct Info { } diff --git a/validation-test/compiler_crashers_fixed/issue-85034.swift b/validation-test/compiler_crashers_fixed/issue-85034.swift new file mode 100644 index 0000000000000..3d1dc75c4497b --- /dev/null +++ b/validation-test/compiler_crashers_fixed/issue-85034.swift @@ -0,0 +1,12 @@ +// RUN: %target-typecheck-verify-swift +// RUN: %target-swift-emit-silgen %s + +class C { + var x = 0 +} + +do { + let x = C() + let _ = (0, try x.x) // expected-warning {{no calls to throwing functions occur within 'try' expression}} + let _ = (0, try! x.x) // expected-warning {{no calls to throwing functions occur within 'try' expression}} +}