Skip to content

Commit 7a43b44

Browse files
authored
Merge pull request swiftlang#77440 from DougGregor/no-fallback-diag-in-transaction
[Constraint solver] Disable fallback diagnostic when error emitted into a transaction
2 parents 64e08d7 + 720429d commit 7a43b44

File tree

6 files changed

+38
-16
lines changed

6 files changed

+38
-16
lines changed

include/swift/Sema/ConstraintSystem.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,13 @@ std::optional<BraceStmt *> applyResultBuilderBodyTransform(FuncDecl *func,
7777

7878
std::optional<constraints::SyntacticElementTarget>
7979
typeCheckExpression(constraints::SyntacticElementTarget &target,
80-
OptionSet<TypeCheckExprFlags> options);
80+
OptionSet<TypeCheckExprFlags> options,
81+
DiagnosticTransaction *diagnosticTransaction = nullptr);
8182

8283
std::optional<constraints::SyntacticElementTarget>
8384
typeCheckTarget(constraints::SyntacticElementTarget &target,
84-
OptionSet<TypeCheckExprFlags> options);
85+
OptionSet<TypeCheckExprFlags> options,
86+
DiagnosticTransaction *diagnosticTransaction = nullptr);
8587

8688
Type typeCheckParameterDefault(Expr *&, DeclContext *, Type, bool, bool);
8789

@@ -2111,6 +2113,7 @@ class ConstraintSystem {
21112113
public:
21122114
DeclContext *DC;
21132115
ConstraintSystemOptions Options;
2116+
DiagnosticTransaction *diagnosticTransaction;
21142117
std::optional<ExpressionTimer> Timer;
21152118

21162119
friend class Solution;
@@ -2782,7 +2785,8 @@ class ConstraintSystem {
27822785
};
27832786

27842787
ConstraintSystem(DeclContext *dc,
2785-
ConstraintSystemOptions options);
2788+
ConstraintSystemOptions options,
2789+
DiagnosticTransaction *diagnosticTransaction = nullptr);
27862790
~ConstraintSystem();
27872791

27882792
/// Retrieve the constraint graph associated with this constraint system.
@@ -2823,11 +2827,13 @@ class ConstraintSystem {
28232827

28242828
friend std::optional<SyntacticElementTarget>
28252829
swift::TypeChecker::typeCheckExpression(
2826-
SyntacticElementTarget &target, OptionSet<TypeCheckExprFlags> options);
2830+
SyntacticElementTarget &target, OptionSet<TypeCheckExprFlags> options, DiagnosticTransaction *diagnosticTransaction);
28272831

28282832
friend std::optional<SyntacticElementTarget>
2829-
swift::TypeChecker::typeCheckTarget(SyntacticElementTarget &target,
2830-
OptionSet<TypeCheckExprFlags> options);
2833+
swift::TypeChecker::typeCheckTarget(
2834+
SyntacticElementTarget &target,
2835+
OptionSet<TypeCheckExprFlags> options,
2836+
DiagnosticTransaction *diagnosticTransaction);
28312837

28322838
friend Type swift::TypeChecker::typeCheckParameterDefault(Expr *&,
28332839
DeclContext *, Type,

lib/Sema/CSSolver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1498,7 +1498,7 @@ ConstraintSystem::solveImpl(SyntacticElementTarget &target,
14981498
Timer.emplace(expr, *this);
14991499

15001500
if (generateConstraints(target, allowFreeTypeVariables))
1501-
return SolutionResult::forError();;
1501+
return SolutionResult::forError();
15021502

15031503
// Try to solve the constraint system using computed suggestions.
15041504
SmallVector<Solution, 4> solutions;

lib/Sema/ConstraintSystem.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,10 @@ ExpressionTimer::~ExpressionTimer() {
117117
}
118118

119119
ConstraintSystem::ConstraintSystem(DeclContext *dc,
120-
ConstraintSystemOptions options)
120+
ConstraintSystemOptions options,
121+
DiagnosticTransaction *diagnosticTransaction)
121122
: Context(dc->getASTContext()), DC(dc), Options(options),
123+
diagnosticTransaction(diagnosticTransaction),
122124
Arena(dc->getASTContext(), Allocator),
123125
CG(*new ConstraintGraph(*this))
124126
{
@@ -4710,7 +4712,8 @@ void ConstraintSystem::maybeProduceFallbackDiagnostic(
47104712
// diagnostics already emitted or waiting to be emitted. Because they are
47114713
// a better indication of the problem.
47124714
ASTContext &ctx = getASTContext();
4713-
if (ctx.hadError())
4715+
if (ctx.hadError() ||
4716+
(diagnosticTransaction && diagnosticTransaction->hasErrors()))
47144717
return;
47154718

47164719
ctx.Diags.diagnose(target.getLoc(), diag::failed_to_produce_diagnostic);

lib/Sema/TypeCheckConstraints.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -386,19 +386,21 @@ Type TypeChecker::typeCheckExpression(Expr *&expr, DeclContext *dc,
386386
// instead of each individual syntactic element types.
387387
std::optional<SyntacticElementTarget>
388388
TypeChecker::typeCheckExpression(SyntacticElementTarget &target,
389-
TypeCheckExprOptions options) {
389+
TypeCheckExprOptions options,
390+
DiagnosticTransaction *diagnosticTransaction) {
390391
DeclContext *dc = target.getDeclContext();
391392
auto &Context = dc->getASTContext();
392393
FrontendStatsTracer StatsTracer(Context.Stats, "typecheck-expr",
393394
target.getAsExpr());
394395
PrettyStackTraceExpr stackTrace(Context, "type-checking", target.getAsExpr());
395396

396-
return typeCheckTarget(target, options);
397+
return typeCheckTarget(target, options, diagnosticTransaction);
397398
}
398399

399400
std::optional<SyntacticElementTarget>
400401
TypeChecker::typeCheckTarget(SyntacticElementTarget &target,
401-
TypeCheckExprOptions options) {
402+
TypeCheckExprOptions options,
403+
DiagnosticTransaction *diagnosticTransaction) {
402404
auto errorResult = [&]() -> std::optional<SyntacticElementTarget> {
403405
// Fill in ErrorTypes for the target if we can.
404406
if (!options.contains(TypeCheckExprFlags::AvoidInvalidatingAST))
@@ -435,7 +437,7 @@ TypeChecker::typeCheckTarget(SyntacticElementTarget &target,
435437
if (options.contains(TypeCheckExprFlags::DisableMacroExpansions))
436438
csOptions |= ConstraintSystemFlags::DisableMacroExpansions;
437439

438-
ConstraintSystem cs(dc, csOptions);
440+
ConstraintSystem cs(dc, csOptions, diagnosticTransaction);
439441

440442
if (auto *expr = target.getAsExpr()) {
441443
// Tell the constraint system what the contextual type is. This informs
@@ -523,7 +525,8 @@ Type TypeChecker::typeCheckParameterDefault(Expr *&defaultValue,
523525
// First, let's try to type-check default expression using
524526
// archetypes, which guarantees that it would work for any
525527
// substitution of the generic parameter (if they are involved).
526-
if (auto result = typeCheckExpression(defaultExprTarget, options)) {
528+
if (auto result = typeCheckExpression(
529+
defaultExprTarget, options, &diagnostics)) {
527530
defaultValue = result->getAsExpr();
528531
return defaultValue->getType();
529532
}

lib/Sema/TypeChecker.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,11 +607,13 @@ Type typeCheckExpression(Expr *&expr, DeclContext *dc,
607607

608608
std::optional<constraints::SyntacticElementTarget>
609609
typeCheckExpression(constraints::SyntacticElementTarget &target,
610-
TypeCheckExprOptions options = TypeCheckExprOptions());
610+
TypeCheckExprOptions options = TypeCheckExprOptions(),
611+
DiagnosticTransaction *diagnosticTransaction);
611612

612613
std::optional<constraints::SyntacticElementTarget>
613614
typeCheckTarget(constraints::SyntacticElementTarget &target,
614-
TypeCheckExprOptions options = TypeCheckExprOptions());
615+
TypeCheckExprOptions options = TypeCheckExprOptions(),
616+
DiagnosticTransaction *diagnosticTransaction);
615617

616618
/// Remove any solutions from the provided vector that require more fixes than
617619
/// the best score or don't contain a type for the code completion token.

test/Macros/macros_diagnostics.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,11 @@ macro multipleFreestandingRoles<T>(_: T) -> Void = #externalMacro(module: "A", t
226226
@attached(peer)
227227
macro Foo() = #externalMacro(module: "ThisMacroModuleDoesNotExist", type: "ThisMacroTypeDoesNotExist")
228228
// expected-warning@-1{{external macro implementation type}}
229+
230+
231+
@available(SwiftStdlib 5.1, *)
232+
func someGlobalNext(
233+
isolation actor: isolated (any Actor)? = #isolated // expected-error{{no macro named 'isolated'}}
234+
) async throws {
235+
fatalError()
236+
}

0 commit comments

Comments
 (0)