@@ -1485,9 +1485,11 @@ Optional<BraceStmt *> TypeChecker::applyFunctionBuilderBodyTransform(
1485
1485
// If we encountered an error or there was an explicit result type,
1486
1486
// bail out and report that to the caller.
1487
1487
auto &ctx = func->getASTContext ();
1488
- auto request = PreCheckFunctionBuilderRequest{AnyFunctionRef (func)};
1489
- switch (evaluateOrDefault (
1490
- ctx.evaluator , request, FunctionBuilderBodyPreCheck::Error)) {
1488
+ auto request =
1489
+ PreCheckFunctionBuilderRequest{{AnyFunctionRef (func),
1490
+ /* SuppressDiagnostics=*/ false }};
1491
+ switch (evaluateOrDefault (ctx.evaluator , request,
1492
+ FunctionBuilderBodyPreCheck::Error)) {
1491
1493
case FunctionBuilderBodyPreCheck::Okay:
1492
1494
// If the pre-check was okay, apply the function-builder transform.
1493
1495
break ;
@@ -1619,7 +1621,8 @@ ConstraintSystem::matchFunctionBuilder(
1619
1621
1620
1622
// Pre-check the body: pre-check any expressions in it and look
1621
1623
// for return statements.
1622
- auto request = PreCheckFunctionBuilderRequest{fn};
1624
+ auto request =
1625
+ PreCheckFunctionBuilderRequest{{fn, /* SuppressDiagnostics=*/ false }};
1623
1626
switch (evaluateOrDefault (getASTContext ().evaluator , request,
1624
1627
FunctionBuilderBodyPreCheck::Error)) {
1625
1628
case FunctionBuilderBodyPreCheck::Okay:
@@ -1705,14 +1708,17 @@ namespace {
1705
1708
class PreCheckFunctionBuilderApplication : public ASTWalker {
1706
1709
AnyFunctionRef Fn;
1707
1710
bool SkipPrecheck = false ;
1711
+ bool SuppressDiagnostics = false ;
1708
1712
std::vector<ReturnStmt *> ReturnStmts;
1709
1713
bool HasError = false ;
1710
1714
1711
1715
bool hasReturnStmt () const { return !ReturnStmts.empty (); }
1712
1716
1713
1717
public:
1714
- PreCheckFunctionBuilderApplication (AnyFunctionRef fn, bool skipPrecheck)
1715
- : Fn(fn), SkipPrecheck(skipPrecheck) {}
1718
+ PreCheckFunctionBuilderApplication (AnyFunctionRef fn, bool skipPrecheck,
1719
+ bool suppressDiagnostics)
1720
+ : Fn(fn), SkipPrecheck(skipPrecheck),
1721
+ SuppressDiagnostics (suppressDiagnostics) {}
1716
1722
1717
1723
const std::vector<ReturnStmt *> getReturnStmts () const { return ReturnStmts; }
1718
1724
@@ -1753,7 +1759,9 @@ class PreCheckFunctionBuilderApplication : public ASTWalker {
1753
1759
E, DC, /* replaceInvalidRefsWithErrors=*/ false );
1754
1760
HasError |= transaction.hasDiagnostics ();
1755
1761
1756
- transaction.abort ();
1762
+ if (SuppressDiagnostics)
1763
+ transaction.abort ();
1764
+
1757
1765
return std::make_pair (false , HasError ? nullptr : E);
1758
1766
}
1759
1767
}
@@ -1788,11 +1796,15 @@ FunctionBuilderBodyPreCheck PreCheckFunctionBuilderRequest::evaluate(
1788
1796
owner.Fn .getAbstractClosureExpr ()))
1789
1797
skipPrecheck = shouldTypeCheckInEnclosingExpression (closure);
1790
1798
1791
- return PreCheckFunctionBuilderApplication (owner.Fn , false ).run ();
1799
+ return PreCheckFunctionBuilderApplication (
1800
+ owner.Fn , /* skipPrecheck=*/ false ,
1801
+ /* suppressDiagnostics=*/ owner.SuppressDiagnostics )
1802
+ .run ();
1792
1803
}
1793
1804
1794
1805
std::vector<ReturnStmt *> TypeChecker::findReturnStatements (AnyFunctionRef fn) {
1795
- PreCheckFunctionBuilderApplication precheck (fn, true );
1806
+ PreCheckFunctionBuilderApplication precheck (fn, /* skipPreCheck=*/ true ,
1807
+ /* SuppressDiagnostics=*/ true );
1796
1808
(void )precheck.run ();
1797
1809
return precheck.getReturnStmts ();
1798
1810
}
0 commit comments