Commit Graph

28382 Commits

Author SHA1 Message Date
Doug Gregor
6e419b6345 Revert "[6.2] Accept @cdecl global functions and enums, behind experimental feature flags" 2025-07-16 10:05:35 -07:00
Doug Gregor
73530bf957 Merge pull request #83088 from DougGregor/se-0466-nested-no-inference-6.2
[6.2] [SE-0466] Nested types of nonisolated types don't infer main-actor isolation
2025-07-16 09:44:00 -07:00
Alexis Laferrière
ed65bb9a46 Merge pull request #82791 from xymus/cdecl-6.2
[6.2] Accept `@cdecl` global functions and enums, behind experimental feature flags
2025-07-16 09:27:04 -07:00
Doug Gregor
a4a39f2a98 [SE-0466] Nested types of nonisolated types don't infer main-actor isolation
Under discussion as part of an amendment to SE-0466, limit default main
actor inference so it doesn't apply to a nested type within a
nonisolated type.
2025-07-15 20:15:35 -07:00
Xi Ge
6f4d55a901 Merge branch 'release/6.2' into cdecl-6.2 2025-07-15 14:50:10 -07:00
Pavel Yaskevich
84f70f3792 [Concurrency] Replace nonisolated with nonisolated(nonsending) when isolation is inferred
With `NonisolatedNonsendingByDefault` an explicit `nonisolated`
attribute in declaration context is inferred to mean `nonisolated(nonsending)`
and it should be printed as such in interface files and other places.

The inference logic that did didn't remove the original attribute
which meant that it would be printed twice i.e.
`nonisolated nonisolated(nonsending) func test() async` which is
incorrect and would fail swift interface validation.

Resolves: rdar://155847011
(cherry picked from commit b519c07428)
2025-07-15 09:20:33 -07:00
Hamish Knight
234a41567f Merge pull request #83036 from hamishknight/origami-6.2
[6.2] [Sema] Avoid folding sequences multiple times for completion
2025-07-15 09:15:17 +01:00
Doug Gregor
e5658e0087 Merge pull request #83020 from DougGregor/prohibit-isolated-conformance-capture-check-6.2 2025-07-14 15:37:31 -07:00
Michael Gottesman
187b1eedf7 Merge pull request #82776 from gottesmm/release/6.2-154139237
[6.2] [nonisolated-nonsending] Make the AST not consider nonisolated(nonsending) to be an actor isolation crossing point.
2025-07-14 13:19:55 -07:00
Hamish Knight
e653a22431 [Sema] Make change less risky for 6.2
Revert assertion changes and flip the condition to only apply when
doing completion.
2025-07-14 17:49:30 +01:00
Hamish Knight
5d93006d4c [Sema] Avoid folding sequences multiple times for completion
Completion can end up calling into pre-checking multiple times in
certain cases, make sure we don't attempt to fold a SequenceExpr
multiple times since its original AST is in a broken state
post-folding. Instead, just return the already-folded expression.

rdar://133717866
2025-07-14 17:49:23 +01:00
Pavel Yaskevich
c4a3d31ad0 Merge pull request #82998 from xedin/rdar-155589753-6.2
[6.2][Concurrency] Don't downgrade explicit isolation attribute clashes
2025-07-13 08:22:58 -07:00
Doug Gregor
74b54fea5c Use the "prohibits isolated conformances" check for capture metatypes
When checking whether a capture of a metatype is Sendable, we had an
incomplete and incorrect check for SendableMetatype conformance.
Replace that with the proper "prohibits isolated conformances" check
on the generic signature, which matches what we do on the caller side.

Fixes issue #82905 / rdar://155399531.
2025-07-12 08:47:14 -07:00
Pavel Yaskevich
4e93e74898 [Concurrency] Don't downgrade explicit isolation attribute clashes
The compiler shouldn't accept mismatch in explicit isolation attributes
because it could lead to incorrect isolation selection.

Resolves: rdar://155589753

(cherry picked from commit a9373c0f3f)
2025-07-10 22:29:20 -07:00
Michael Gottesman
35c3b9e12c [concurrency] Perform some fixes so that transfernonsendable_closureliterals_isolationinference.swift now passes.
The reason why this failed is that concurrently to @xedin landing
79af04ccc4, I enabled
NonisolatedNonsendingByDefault on a bunch of other tests. That change broke the
test and so we needed to fix it.

This commit fixes a few issues that were exposed:

1. We do not propagate nonisolated(nonsending) into a closure if its inferred
context isolation is global actor isolated or if the closure captures an
isolated parameter. We previously just always inferred
nonisolated(nonsending). Unfortunately since we do not yet have capture
information in CSApply, this required us to put the isolation change into
TypeCheckConcurrency.cpp and basically have function conversions of the form:

```
(function_conversion_expr type="nonisolated(nonsending) () async -> Void"
   (closure_expr type="() async -> ()" isolated_to_caller_isolation))
```

Notice how we have a function conversion to nonisolated(nonsending) from a
closure expr that has an isolation that is isolated_to_caller.

2. With this in hand, we found that this pattern caused us to first thunk a
nonisolated(nonsending) function to an @concurrent function and then thunk that
back to nonisolated(nonsending), causing the final function to always be
concurrent. I put into SILGen a peephole that recognizes this pattern and emits
the correct code.

3. With that in hand, we found that we were emitting nonisolated(nonsending)
parameters for inheritActorContext functions. This was then fixed by @xedin in

With all this in hand, closure literal isolation and all of the other RBI tests
with nonisolated(nonsending) enabled pass.

rdar://154969621
(cherry picked from commit 648bb8fe30)
2025-07-10 17:24:48 -07:00
Doug Gregor
8c34d57874 [Strict memory safety] Eliminate spurious warnings with synthesized Codable
When synthesizing code for Codable conformances involving unsafe types,
make sure to wrap the resulting expressions in "unsafe" when strict memory safety is enabled.

Tweak the warning-emission logic to suppress warnings about spurious
"unsafe" expressions when the compiler generated the "unsafe" itself,
so we don't spam the developer with warnings they can't fix. Also make
the checking for other suppression considerations safe when there are
no source locations, eliminating a potential assertion.

Fixes rdar://153665692.
2025-07-10 09:12:49 -07:00
Doug Gregor
d6deeccc81 [Strict memory safety] Fix "unsafe" checking for the for..in loop
The `$generator` variable we create for the async for..in loop is
`nonisolated(unsafe)`, so ensure that we generate an `unsafe`
expression when we use it. This uncovered some inconsistencies in how
we do `unsafe` checking for for..in loops, so fix those.

Fixes rdar://154775389.

(cherry picked from commit 35628cb503)
2025-07-10 09:12:07 -07:00
Michael Gottesman
f24ff98f9a [nonisolated-nonsending] Make the AST not consider nonisolated(nonsending) to be an actor isolation crossing point.
We were effectively working around this previously at the SIL level. This caused
us not to obey the semantics of the actual evolution proposal. As an example of
this, in the following, x should not be considered main actor isolated:

```swift
nonisolated(nonsending) func useValue<T>(_ t: T) async {}
@MainActor func test() async {
  let x = NS()
  await useValue(x)
  print(x)
}
```

we should just consider this to be a merge and since useValue does not have any
MainActor isolated parameters, x should not be main actor isolated and we should
not emit an error here.

I also fixed a separate issue where we were allowing for parameters of
nonisolated(nonsending) functions to be passed to @concurrent functions. We
cannot allow for this to happen since the nonisolated(nonsending) parameters
/could/ be actor isolated. Of course, we have lost that static information at
this point so we cannot allow for it. Given that we have the actual dynamic
actor isolation information, we could dynamically allow for the parameters to be
passed... but that is something that is speculative and is definitely outside of
the scope of this patch.

rdar://154139237
(cherry picked from commit c12c99fb73)
2025-07-09 12:24:17 -07:00
Doug Gregor
457d44c624 [SE-0466] Enable SendableProhibitsMainActorInference by default
This implements the SE-0466 amendment under discussion for all code
with default main-actor isolation.

Finalizes rdar://151029300.
2025-07-09 10:49:03 -07:00
Nate Cook
4f87475f73 [6.2] Allow inout parameters in expression macros (#82824)
Cherry pick of #82370 to 6.2 branch.

---

* **Explanation**: Resolves an issue where sema is flagging inout
expressions in expression macros as invalid, setting up a catch 22 where
Sema emits an error when a parameter has the '&' sigil and type checking
fails when it doesn't.
* **Risk**: Low. It allows inout expressions in one additional context.
* **Testing**: Tested by lit tests, including new tests for the newly
allowed expression.
* **Issue**: rdar://153840234
* **Reviewer**:  @slavapestov
* **Main branch PR**:  https://github.com/swiftlang/swift/pull/82370
2025-07-08 15:00:53 -05:00
Doug Gregor
719fb9ca26 Merge pull request #82848 from DougGregor/isolated-conformance-to-sendablemetatype-proto-error-6.2
[6.2] Diagnose isolated conformance to SendableMetatype-inheriting protocol
2025-07-08 09:09:07 -07:00
John McCall
c0db6b64f6 Merge pull request #82868 from rjmccall/dont-capture-defer-isolation-6.2
[6.2] Don't force a capture of an isolated parameter in defer bodies
2025-07-08 11:58:33 -04:00
Konrad `ktoso` Malawski
0bf7b29acf Merge pull request #82826 from ktoso/pick-wip-correct-isolated-handling-with-caller-isolation 2025-07-08 20:16:41 +09:00
John McCall
fb9e730fc9 Don't force a capture of an isolated parameter in defer bodies.
SILGen already has an exception for this from -enable-actor-data-race-checks,
so there's no need for it, and it causes problems in actor inits.

Fixes rdar://155239032
2025-07-07 23:30:22 -04:00
Doug Gregor
6b4271c3a8 Fixup for 6.2 branch 2025-07-07 14:17:59 -07:00
Doug Gregor
3755a6b7e1 [SE-0470] Promote isolated-conformance-to-sendable-metatype protocol to error
Forming an isolated conformance to a SendableMetatype-inherting
protocol opens up a soundness hole any time the conformance is used.
Reword the recently-introduced diagnostic for this case and promote it
to an error (except when it's preconcurrency).

Fixes rdar://154808002.
2025-07-07 13:17:12 -07:00
Doug Gregor
7b369d02dc [SE-0470] Warn about isolated conformance to SendableMetatype-inheriting protocol
An isolated conformance to a SendableMetatype-inheriting protocol
cannot actually be used in generic code, because the SendableMetatype
requirement itself prevents it. Warn about this case so folks aren't
surprised at runtime.

This is a part of issue #82550 / rdar://154437489.
2025-07-07 13:17:04 -07:00
Hamish Knight
ee5f4df5ee Merge pull request #82775 from hamishknight/simple-fix-6.2
[6.2] [CS] Ensure type variables are eliminated by `Solution::simplifyType`
2025-07-04 10:56:34 +01:00
Alexis Laferrière
1c5c76f2b5 Sema: Type-check @cdecl enums
@cdecl enums are Swift enums representable in C. These enums must have
an integer raw type. They can be referenced from @cdecl functions and
@objc methods. @objc enums are still rejected from @cdecl functions.
2025-07-03 14:11:27 -07:00
Alexis Laferrière
076ae9edb3 Sema: Reject enums marked with both @cdecl and @objc 2025-07-03 14:11:27 -07:00
Alexis Laferrière
5c2efaca9a AST: Begin accepting @cdecl on enums (but not @_cdecl) 2025-07-03 14:11:27 -07:00
Alexis Laferrière
83c0667b16 Sema: Add missing range on notes about representability 2025-07-03 14:11:27 -07:00
Alexis Laferrière
3a0ba5fc1c Sema: @cdecl functions C name defaults to the Swift name 2025-07-03 14:11:27 -07:00
Alexis Laferrière
eedc7c2857 Sema: Update more diagnostics for @cdecl vs @objc 2025-07-03 14:11:27 -07:00
Alexis Laferrière
0600ddd2e9 Sema: Use ForeignLanguage directly in diagnostic definitions 2025-07-03 14:11:27 -07:00
Alexis Laferrière
e38fd7f174 Sema: Simplify tracking the foreign language of an @objc decl
Apply review comments from #80744.
2025-07-03 14:11:26 -07:00
Alexis Laferrière
41f126fde6 Sema: Basic type-checking of @cdecl on global functions
This implements basic checks on the validity of the @cdecl attribute and
ensures the parameters and result types are representable in C. Many
more diagnostics will need to be updated to verify full representability
in C.
2025-07-03 14:11:26 -07:00
Alexis Laferrière
3209730bac Parser: Intro @cdecl attribute and gate it behind feature flag CDecl 2025-07-03 13:45:33 -07:00
Alexis Laferrière
221a6f09f1 Sema: Requestify most checks on @_cdecl 2025-07-03 13:45:33 -07:00
Slava Pestov
0022c312f0 Merge pull request #82758 from slavapestov/fix-issue-60552-6.2
[6.2] Sema: Fix leading dot with protocol composition or parameterized protocol contextual type
2025-07-03 14:05:35 -04:00
Hamish Knight
3f2d1ddcdd [CS] Downgrade an ASSERT for 6.2 2025-07-03 17:57:42 +01:00
Hamish Knight
7e537b7f00 [CS] Ensure type variables are eliminated by Solution::simplifyType
`TypeSimplifier` may not eliminate type variables from e.g the
pattern types of pattern expansion types since they can remain
unresolved due to e.g having a placeholder count type. Make sure we
eliminate any remaining type variables along with the placeholders.
There's probably a more principled fix here, but this is a quick and
low risk fix we can hopefully take for 6.2.

rdar://154954995
2025-07-03 17:53:23 +01:00
Pavel Yaskevich
01404bf1ae Merge pull request #82735 from xedin/rdar-154754939-6.2
[6.2][Concurency] Allow declarations with `@isolated(any)` parameters be m…
2025-07-03 09:17:34 -07:00
Pavel Yaskevich
cf5ab749eb Merge pull request #82744 from xedin/rdar-154808850-6.2
[6.2][Concurrency] SE-0461: Extend `nonisolated(nonsending)` inference to …
2025-07-03 09:17:21 -07:00
Hamish Knight
ef8e576d23 Merge pull request #82741 from hamishknight/err-val-6.2
[6.2] [AST] Use ErrorType for invalid value generic parameter
2025-07-03 14:32:44 +01:00
Hamish Knight
2e0b9d7f8a Merge pull request #82743 from hamishknight/diag-it-6.2 2025-07-03 09:24:25 +01:00
Slava Pestov
8e78de3a70 Sema: Fix leading dot with protocol composition or parameterized protocol contextual type
- Fixes https://github.com/swiftlang/swift/issues/60552.
- Fixes rdar://problem/99699879.
2025-07-03 00:22:31 -04:00
Pavel Yaskevich
d1a1b2fb31 [Concurrency] SE-0461: Extend nonisolated(nonsending) inference to function types
Currently only declarations would get `nonisolated(nonsending)`
inferred if the upcoming flag is enabled, this changes extend
this to apply to asynchronous nonisolated function types as well.

Resolves: rdar://154808850
(cherry picked from commit bb0cd6f0a6)
2025-07-02 14:25:02 -07:00
Hamish Knight
ce273f4527 [Sema] Downgrade an ASSERT for 6.2 2025-07-02 21:30:31 +01:00
Hamish Knight
a9d72fb695 [Sema] Avoid applying diagnostic hack to caller-side expression macros
We can't assume that type-checking the expression macro in the
parameter will also fail if it fails at the call site since e.g
name lookup may differ. Make sure we only apply this logic to simple
literals.

rdar://154771596
2025-07-02 21:29:32 +01:00