Commit Graph

3667 Commits

Author SHA1 Message Date
Slava Pestov
4937d0a242 Merge pull request #79134 from slavapestov/smaller-potential-bindings
Sema: More accurate undo() of PotentialBindings::retract()
2025-02-05 14:05:05 -05:00
Joe Groff
a56ec3e339 Merge pull request #79127 from jckarter/treat-read-accesses-as-borrows
SILGen: Treat read-formal-accessed lvalues as borrows.
2025-02-04 18:32:38 -08:00
Slava Pestov
cda3cda132 Sema: Rework change recording in PotentialBindings::retract()
Instead of making an undo() do an infer(), let's record fine-grained
changes about what was retracted, and directly re-insert the same
elements into the data structures.
2025-02-04 20:26:12 -05:00
Joe Groff
19329e3e03 SILGen: Treat read-formal-accessed lvalues as borrows.
A read access asserts that the memory location is immutable for the duration
of the access, so it can be treated as a borrow rather than a mutable lvalue.
Doing this allows the borrow formal access scope fixes from #79084 to apply
to situations where a loadable type undergoes an accessor-based access with
indirect arguments (such as for public accessors when library evolution is
enabled for the type). Fixes rdar://143334632.
2025-02-04 08:23:34 -08:00
Tony Allevato
c5f0200680 Merge pull request #79059 from allevato/json-ast-followups
[ASTDumper] Some followups from the initial JSON PR and macro dumping improvements.
2025-02-04 01:13:46 -05:00
Joe Groff
9e586f426a Merge pull request #79084 from jckarter/addressor-projection-lifetime
SILGen: Materialize addressor bases for the formal access scope of the entire access.
2025-02-03 08:25:58 -08:00
Slava Pestov
0882a078f7 Regression test for rdar://problem/143338891 2025-02-02 00:43:16 -05:00
Joe Groff
44b431690d SILGen: Materialize addressor bases for the formal access scope of the entire access.
The return pointer may point into the materialized base value, so if the base needs
materialization, ensure that materialization covers any futher projection of the
value.
2025-01-31 18:08:53 -08:00
Pavel Yaskevich
aff0f455cf Merge pull request #79026 from xedin/rdar-143474313
[CSBindings] Allow optional subtype inference when closure result is …
2025-01-30 00:37:46 -08:00
Pavel Yaskevich
654d39b736 Merge pull request #79004 from xedin/rdar-143582881
[CSOptimizer] MemberImportVisibility: Don't consider overloads that c…
2025-01-29 14:23:47 -08:00
Pavel Yaskevich
c922ab5634 [CSBindings] Allow optional subtype inference when closure result is not yet resolved
Similar to `Void?` we need to unwrap `$T?` because it could be later
bound to `Void` from context.

Resolves: rdar://143474313
2025-01-29 13:12:56 -08:00
Tony Allevato
5fe10ce86a ASTDumper: Label "interface type" -> "interface_type". 2025-01-29 13:55:00 -05:00
Pavel Yaskevich
aa4a2b9071 [CSOptimizer] MemberImportVisibility: Don't consider overloads that come from implicit imports
Ignore declarations that come from implicitly imported modules
when `MemberImportVisibility` feature is enabled otherwise
we might end up favoring an overload that would be diagnosed
as unavailable later.

Resolves: rdar://143582881
2025-01-29 10:09:39 -08:00
Slava Pestov
852e3f5f94 Merge pull request #78957 from slavapestov/cgfloat-double-cleanup
Sema: Clean up CSApply for CGFloat <-> Double conversion
2025-01-28 08:06:32 -05:00
Pavel Yaskevich
248c0260f0 Merge pull request #78949 from xedin/rdar-143475850-part-2
[CSOptimizer] Don't consider CGFloat widening when explicit initializ…
2025-01-28 00:04:18 -08:00
Slava Pestov
4ae57acaa2 Sema: Remove ConstraintSystem::ImplicitValueConversions 2025-01-27 17:28:19 -05:00
Pavel Yaskevich
3cc76eacdd [CSOptimizer] Don't consider CGFloat widening when explicit initializer is used
Disable implicit `CGFloat` -> `Double` widening conversion if
argument is an explicit call to `CGFloat` initializer.
2025-01-27 09:57:47 -08:00
Slava Pestov
881c4f775b Sema: Ignore inactive type variables in addTypeVariableConstraintsToWorkList()
Fixes a regression from commit 0c128e5db7.

The old depthFirstSearch() walked all adjacencies via the constraint graph,
and thus it would visit type variables that are currently inactive because
we're solving a conjunction element.

This was inconsistent with the new union-find which only formed the
connected components from the currently active type variables; adjacencies
involving inactive type variables are no longer considered.

Fix the inconsistency by changing gatherConstraints(), which used from
addTypeVariableConstraintsToWorkList(), to also skip inactive type
variables.

Fixes rdar://problem/143340082.
2025-01-27 10:26:59 -05:00
Pavel Yaskevich
e8fe5c3769 Merge pull request #78906 from xedin/rdar-143475850-part-1
[CSBindings] Allow subtype inference from `Void?` for closure result …
2025-01-27 00:30:19 -08:00
Pavel Yaskevich
116d1af911 [CSBindings] Allow subtype inference from Void? for closure result types
We don't want to do that in general because injection should happen
only in one place but Void is special because it allows conversions
in that position.
2025-01-25 00:18:31 -08:00
Slava Pestov
9ddfc9e47b Sema: Fix crash in type resolution when tuple type contains type variables
This can happen when we're generating constraints and resolving the
type annotations written in a closure expression. Just skip the
non-copyable check in this case.

Fixes rdar://problem/143031466.
2025-01-24 17:05:20 -05:00
Anthony Latsis
499146df88 Merge pull request #78739 from AnthonyLatsis/hatzegopteryx
TypeCheckType: Rework IUO diagnostics using behavior limitation
2025-01-22 19:12:02 +00:00
Anthony Latsis
35f1370f6e TypeCheckType: Rework IUO diagnostics using behavior limitation
Also stop suggesting a '?' fix-it for casts, where it is not likely to
be helpful because the common intention is either to force the optional
or declare an IUO.
2025-01-21 21:41:00 +00:00
Anthony Latsis
6c9bb2a283 Merge pull request #78593 from AnthonyLatsis/cocos-nucifera
OpenedExistentials: Do not attempt to erase existential metatypes wit…
2025-01-19 03:35:22 +00:00
Slava Pestov
5f79319c45 Merge pull request #78559 from slavapestov/fix-rdar141968103
Sema: Relax primary associated type matching in matchExistentialTypes()
2025-01-13 12:04:57 -05:00
Anthony Latsis
75953d2b51 OpenedExistentials: Do not attempt to erase existential metatypes with invariant Self
The non-metatype case was never supported. The same should hold for the
existential metatype case, which used to miscompile and now crashes
because the invariant reference is deemed OK but the erasure expectedly
fails to handle it:

```swift
class C<T> {}
protocol P {
  associatedtype A

  func f() -> any P & C<A>
  func fMeta() -> any (P & C<A>).Type
}

do {
  let p: any P
  let _ = p.f() // error
  let _ = p.fMeta() // crash
}
```
2025-01-12 17:47:52 +00:00
Anthony Latsis
078be8595a Add regression test for https://github.com/swiftlang/swift/issues/69390 2025-01-11 14:21:00 +00:00
Slava Pestov
c257cdbc7c Sema: Relax primary associated type matching in matchExistentialTypes()
Recently I found a soundness hole here, where we would allow conversion
between `any P<T>` and `any Q<T>` even if P and Q have different primary
associated types.

However, the fix was too strict, because we still want to allow the
conversion when the associated types have the same name.

Fixes rdar://141968103.
2025-01-10 15:37:10 -05:00
Anthony Latsis
33f03f7a03 Merge pull request #78434 from AnthonyLatsis/each-pack
Sema: Do better at diagnosing missing `each`
2025-01-07 09:11:28 +00:00
Anthony Latsis
492462125d test: Decouple each placement test cases 2025-01-07 05:22:49 +00:00
Anthony Latsis
32cf2d8c2f Sema: Do better at diagnosing missing each 2025-01-07 05:22:48 +00:00
Slava Pestov
2d17294d73 Merge pull request #78301 from slavapestov/remove-one-way-constraints
Sema: Remove ConstraintKind::OneWayBindParam and ConstraintKind::OneWayEqual
2025-01-05 10:38:14 -05:00
Hamish Knight
4cbe481f82 Merge pull request #78377 from hamishknight/no-simplify-result
[CS] Don't simplify `FunctionResult` in `simplifyLocator`
2025-01-02 17:26:22 +00:00
Anthony Latsis
5c24df22a0 Merge pull request #78363 from AnthonyLatsis/dicksonia-arborescens
[NFC] Sema: Tidy up `canOpenExistentialCallArgument`
2025-01-02 15:38:27 +00:00
Hamish Knight
9fe4abc6fd [CS] Simplify Solution::resolveInterfaceType
Rather than attempting to re-implement `simplifyType`,
tweak `Solution::simplifyType` such that it can
map the resulting type out of context, and can
turn type variables into their opened generic
parameters.
2024-12-31 18:39:19 +00:00
Hamish Knight
86e8165569 [CS] Don't simplify FunctionResult in simplifyLocator
Simplifying into the function expression is wrong,
like `FunctionArgument` this isn't an element that
can be simplified. This also means we don't need
to handle it in `MissingCallFailure`, since we
shouldn't be recording that fix in this case.
2024-12-29 12:25:18 +00:00
Anthony Latsis
56d943a77e [NFC] Sema: Tidy up canOpenExistentialCallArgument 2024-12-25 02:25:28 +00:00
Pavel Yaskevich
a892e571b6 [CSSimplify] Retry member lookup on an insufficiently resolved optional base in diagnostic mode
Re-introduce unsolved member constraint when optional object is
a type variable or member until it's bound, otherwise it's impossible
to tell whether unwrapped base would have a member or not.
2024-12-21 00:42:13 -08:00
Slava Pestov
74f8960bd8 Sema: Remove OneWayExpr and Builtin.one_way 2024-12-21 00:42:13 -08:00
Anthony Latsis
08ccfadfa9 Sema: Handle the edge case of in-out metatype parameter in canOpenExistentialCallArgument 2024-12-20 15:49:35 +00:00
Anthony Latsis
9bad13300d test: Actually check if we opened an existential call argument 2024-12-20 15:49:35 +00:00
Slava Pestov
bb55d9c59a Sema: Remove -experimental-one-way-closure-params 2024-12-19 13:14:11 -05:00
Pavel Yaskevich
19350d9737 Merge pull request #63585 from xedin/solver-perf
[CSSolver] Implementation of disjunction choice favoring algorithm
2024-12-18 09:47:59 -08:00
Pavel Yaskevich
43ca7dfff9 [CSOptimizer] Simplify handling of non-applied disjunctions
If a disjunction doesn't have an application, let's prefer
it if it's passed as an argument to an operator application
or involved in a member chain, in such situations attempting
a disjunction could provide context to parent call/member chain.

If disjunction is passed as an unapplied reference to some
parameter i.e. `<base>.map(String.init(describing:))` we don't
favor it for now because optimizer cannot do enough checking
to determine whether preferring such disjunction would help
make forward progress in solving by pruning some space or
providing additional context.
2024-12-17 16:44:06 -08:00
Pavel Yaskevich
f7d81d5271 [TypeCheckEffects] Downgrade missing await to a warning for initializer calls with a single unlabeled parameter
Mitigation for a historic incorrect type-checker behavior
caused by one of the performance hacks that used to favor
sync constructor overload over async one in async context
if initializers take a single unlabeled argument.

```swift
struct S {
  init(_: Int) {}
  init(_: Int) async {}
}

func test(v: Int) async { S(v) }
```

The type-checker should use `init(_: Int) async` in `test` context
but used to select the sync overload. The hack is now gone but we
need to downgrade an error to a warning to give the developers time
to fix their code.
2024-12-17 11:36:42 -08:00
Pavel Yaskevich
40a41c82d9 [CSBindings] Don't attempt to strip optional for closure result types
Let's not perform $T? -> $T for closure result types to avoid having
to re-discover solutions that differ only in location of optional
injection.

The pattern with such type variables is:

```
$T_body <conv/subtype> $T_result <conv/subtype> $T_contextual_result
```

When `$T_contextual_result` is `Optional<$U>`, the optional injection
can either happen from `$T_body` or from `$T_result` (if `return`
expression is non-optional), if we allow  both the solver would
find two solutions that differ only in location of optional
injection.
2024-12-17 11:36:42 -08:00
Pavel Yaskevich
c2a55886f0 [CSOptimizer] Fix selectDisjunction to use favored choices even if disjunction was not optimized
Some disjunctions e.g. explicit coercions, compositions of restrictions,
and implicit CGFloat initializers have favored choices set independently
from optimization algorithm, `selectDisjunction` should account for
such situations.
2024-12-17 11:36:41 -08:00
Pavel Yaskevich
9fb73143f6 [CSOptimizer] Limit "old" behavior compatibility to unlabeled unary arguments
`favorMatchingOverloadExprs` used `getUnlabeledUnaryExpr` and we
need to mimic that exactly because there is code that relies on
this behavior now.
2024-12-17 11:36:41 -08:00
Pavel Yaskevich
2fdd4b6c35 [CSOptimizer] Allow literal arguments to match parameters that conform to ExpressibleBy{Integer, Float}Literal
`scoreCandidateMatch` needs to reflect the fact that literal can
assume any type that conforms to `ExpressibleBy{Integer, Float}Literal`
protocol but since such bindings are non-default and alway produce
a worse solution vs. default literal types if all of the arguments
are literals let's use only exact matches otherwise there is a chance
of "over-favoring" and creating more work for ranking.
2024-12-17 11:36:41 -08:00
Pavel Yaskevich
6caf1ccbb2 [CSOptimizer] Fix Double<->CGFloat implicit conversion support when arguments are literals
Passing Double to CGFloat as well as vice versa constitutes an exact match.
2024-12-17 11:36:41 -08:00