Commit Graph

2604 Commits

Author SHA1 Message Date
Doug Gregor
51abd3d56f Prevent opening existentials when the corresponding parameter is variant
Ensure that we only open existentials in an argument when the corresponding
parameter's type is a generic parameter that is only used in covariant
positions, because either invariant or contravariant uses mean that we
won't be able to type-erase other uses of that parameter. This mirrors
the requirement placed when opening existentials as a member of protocol
type.
2022-02-18 11:22:57 -08:00
Doug Gregor
fa6c3c15d8 Opaque types are only invariant when they involve same-type constraints.
An opaque type is only invariant with respect to the existential Self
when the constraints on the opaque type involve Self. Such constraints
are not expressible in the type-erased value, so treat them as
invariant. This loosens the restriction on using members of protocol
type that return an opaque type, such that (e.g.) the following is
still well-formed:

    protocol P { }
    protocol Q { }

    extension P {
      func getQ() -> some Q { ... }
    }

    func test(p: any P) {
      let q = p.getQ() // formerly an error, now returns an "any Q"
    }

However, this does not permit uses of members such as:

    extension P {
      func getCollection() -> some Collection<Self> { ... } // error
    }

because the type system cannot express the corresponding existential
type `any Collection<Self>`.
2022-02-18 11:22:56 -08:00
Allan Shortlidge
212043840f SIL: Add flag to SILDeclRef for back deployment thunks. 2022-02-17 11:28:12 -08:00
Konrad `ktoso` Malawski
7c145cc55b Merge pull request #41179 from ktoso/wip-improved-adhoc-checks
[Distributed] improve ad-hoc requirement typechecking
2022-02-17 09:16:42 +09:00
Slava Pestov
a1c03db381 AST: Generalize ProtocolDecl::getRequirementSignature() to a new RequirementSignature type
The RequirementSignature generalizes the old ArrayRef<Requirement>
which stores the minimal requirements that a conforming type's
witnesses must satisfy, to also record the protocol typealiases
defined in the protocol.
2022-02-13 00:24:23 -05:00
Konrad `ktoso` Malawski
bffd956033 [Distributed] improve ad-hoc requirement typechecking 2022-02-11 19:25:48 +09:00
Slava Pestov
46bfbde812 Merge pull request #41303 from slavapestov/rqm-superclass-unification
RequirementMachine: Record rewrite loops during superclass unification
2022-02-10 12:11:36 -05:00
Slava Pestov
4c6cef062a AST: Const-ify some methods on ClassDecl 2022-02-09 16:49:24 -05:00
Doug Gregor
a37f291c18 Remove ActorIsolation::DistributedActorInstance.
The distributed case is distinguishable from the non-distributed case
based on the actor type itself for those rare cases where we care. The
vast majority of code is simplified by treating this identically to
`ActorInstance`.
2022-02-09 11:16:23 -08:00
Konrad `ktoso` Malawski
42108f33e5 [Distributed] allow get only distributed computed properties 2022-02-08 23:06:29 +09:00
Allan Shortlidge
70a7d85e4a Merge pull request #41112 from tshortli/diagnose-available-wrapped-properties
[Sema] Diagnose @available attribute on wrapped and lazy properties
2022-02-07 10:26:53 -08:00
swift-ci
d5568199df Merge pull request #40868 from kavon/drop-redundant-isolation 2022-02-04 21:08:42 -08:00
Rintaro Ishizaki
747c7cfa8a Merge pull request #41139 from rintaro/ide-completion-rdar80602940
[CodeCompletion] Handle clang async attributes for visibilities
2022-02-04 15:00:08 -08:00
Kavon Farvardin
057e69668a replace NominalTypeDecl::isValueType with a direct struct test
enums don't and will never have stored properties, so just be direct.
2022-02-04 14:41:49 -07:00
Kavon Farvardin
bd024caca9 [SE-327] Remove redundant global-actor isolation.
As part of SE-327, global-actor isolation applied to
the instance-stored properties of a value type do
not require any isolation, since there is no way to
create a race on access to that storage.

https://github.com/apple/swift-evolution/blob/main/proposals/0327-actor-initializers.md#removing-redundant-isolation

This change turns global-actor annotations on such
properties into an error in Swift 6+, and a warning
in Swift 5 and earlier.

In addition, inference for global-actor isolation
no longer applies global-actor isolation to such
properties. Since this latter change only results
in warnings in existing Swift 5 code, about a now
superflous 'await', this change will happen in
Swift 5+.

Fixes rdar://87568381
2022-02-03 15:19:59 -07:00
Allan Shortlidge
093b8d32db [Sema] Emit an error for attempts to use @available on var declarations that have attached property wrappers. Availability is not supported on stored properties, and properties with property wrappers are stored properties with a layer of indirection. Also, add the same missing diagnostic for lazy vars.
Resolves rdar://82713248
2022-02-03 09:02:59 -08:00
Kavon Farvardin
4f28b87de9 basic implementation of flow-isolation for SE-327
Flow-isolation is a diagnostic SIL pass that finds
unsafe accesses to properties in initializers and
deinitializers that cannot gain isolation to otherwise
protect those accesses from concurrent modifications.
See SE-327 for more details about how and why it exists.

This commit includes changes and features like:

- The removal of the escaping-use restriction
- Flow-isolation that works properly with `defer` statements
- Flow-isolation with an emphasis on helpful diagnostics.

It also includes known issues like:

- Local / nonescaping functions are not analyzed by
  flow-isolation, despite it being technically possible.
  The main challenge in supporting it efficiently is that
  such functions do not have a single exit-point, like
  a `defer`. In particular, arbitrary functions can throw
  so there are points where nonisolation should _not_ flow
  out of the function at a call-site in the initializer, etc.

- The implementation of the flow-isolation pass is not
  particularly memory efficient; it relies on BitDataflow
  even though the particular flow problem is simple.
  So, a more efficient implementation would be specialized for
  this particular problem, etc.

There are also some changes to the Swift language itself: defer
will respect its context when deciding its property access kind.

Previously, a defer in an initializer would always access a stored
property through its accessor methods, instead of doing so directly
like its enclosing function might. This inconsistency is unfortunate,
so for Swift 6+ we make this consistent. For Swift 5, only a defer
in a function that is a member of the following kinds of types
will gain this consistency:

- an actor type
- any nominal type that is actor-isolated, excluding UnsafeGlobalActor.

These types are still rather new, so there is much less of a chance of
breaking expected behaviors around defer. In particular, the danger is
that users are relying on the behavior of defer triggering a property
observer within an init or deinit, when it would not be triggering it
without the defer.
2022-02-02 13:31:14 -07:00
Anthony Latsis
c7fd60f2dd Merge pull request #39492 from AnthonyLatsis/se-309-2
SE-309: Covariant erasure for dependent member types
2022-02-02 07:07:17 +03:00
Anthony Latsis
6a25198ff8 AST: Minor optimization for ProtocolCompositionType handling in 'findExistentialSelfReferences' 2022-02-02 02:10:06 +03:00
Anthony Latsis
b3ee4b0718 AST, Sema: Use the opened archetype's generic signature to determine existential member availability 2022-02-02 02:09:59 +03:00
Rintaro Ishizaki
a9bbc1f727 [CodeCompletion] Handle clang async attributes for visibilities
Control 'async' variant of imported ObjC methods.

For non-'async' variant:
1) if 'swift_private' is specified, hide.

For 'async' variant:
1) if 'swift_async(swift_private)' is specified, hide.
2) if 'swift_async(not_swift_private)' is specified, show.
3) if 'swift_async_name()' is specified, show.
4) if 'swift_private' is specified, hide.

rdar://80602940
2022-02-01 14:53:23 -08:00
Anthony Latsis
b2fe028885 [NFC] Turn SelfReferenceKind into a standalone utility type 2022-02-01 20:55:47 +03:00
Anthony Latsis
3206f5ab34 [NFC] Preemptively relocate ProtocolDecl::isAvailableInExistential() and co. 2022-02-01 20:55:46 +03:00
Evan Wilde
7188f40a3b Replace experimental-async flag with checking decl context
This patch replaces the use of the experimental-async-top-level flag
with checking the decl context of the top-level variable to determine
whether the top-level contexts should be async.
2022-01-28 07:55:14 -08:00
Evan Wilde
d265ec9f91 Merge pull request #40998 from etcwilde/ewilde/mainactor-top-level-vars
Make top-level code variables `@MainActor @preconcurrency`
2022-01-28 07:09:55 -08:00
swift-ci
3e228bdaca Merge pull request #41056 from ktoso/wip-roundtrip 2022-01-28 06:45:07 -08:00
Konrad `ktoso` Malawski
e2c61d37ba [Distributed] Move dist funcdecl getters to ASTContext 2022-01-28 18:50:22 +09:00
Evan Wilde
089b78fe59 Add @preconcurrency to toplevel vars
Top-level global variables should have the `@predatesConcurrency
@MainActor` behaviour. This allows them to be somewhat concurrency safe
while still working with old code.
2022-01-27 23:07:28 -08:00
Evan Wilde
f4e93bd9bb Top-level code is executed on the main actor
This patch sets the actor isolation of the top-level code contexts to be
on the main actor. This holds since the implicit `async_Main` function
generated is executed on the main actor executor.
2022-01-27 22:29:12 -08:00
Konrad `ktoso` Malawski
89b0a4ce89 Merge pull request #41036 from ktoso/wip-distributed-remove-dynamic-sil-remotecall-squashed
[Distributed] Remove @_dynamic replacements; impl remoteCall ad-hoc reqs
2022-01-28 11:13:34 +09:00
Doug Gregor
45e64e45ef Merge pull request #40680 from DougGregor/preconcurrency-attr 2022-01-27 16:48:11 -08:00
Konrad `ktoso` Malawski
4bf2a92bda [Distributed] Remove @_dynamic replacements; impl remoteCall ad-hoc reqs
Squashed commit of the following:

commit e5a05ffe44
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 27 17:45:31 2022 +0900

    cleanup

commit 1f751cea5a
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 27 14:50:33 2022 +0900

    cleanups

commit c632f3215d
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 27 14:01:09 2022 +0900

    add test for generic from actor decl

commit 09b8bd50a7
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 27 14:00:58 2022 +0900

    cleanups

commit 31f4d0cffd
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 27 11:40:51 2022 +0900

    fix test

commit ad4db2fb6c
Merge: 97227edcca 07e2dfda56
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 26 23:31:41 2022 +0900

    Merge branch 'main' into wip-zzz

commit 97227edcca
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 26 21:01:25 2022 +0900

    remove @_dynamic methods!

    fix tests

commit 1c79344dbb
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 19 12:51:09 2022 +0900

    cleanup

    wip

    stuck

    fixed the stack cleanups

    cleanups pretty good now

    weird load

    rki

    works

    remove hack

    add take + throw + return

    fix test

    more tests fixed

    more tests fixed

    more tests fixed

commit 3ed494c175
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Tue Jan 18 21:09:28 2022 +0900

    stack issues in SIL verification

commit 5cf43a7f86
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Tue Jan 18 09:19:51 2022 +0900

    about to call the remoteCall

    goot to return, but missing subs

commit df8e47122a
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 13 14:09:49 2022 +0900

    [Distributed] Refactor Invocation to Decoder/Encoder

    getting there

    done-recording

    working on the string init

    stuck trying to get String initializer SILFunction

    created the remote call target

commit fc7bd62f32
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 23:01:14 2022 +0900

    [Distributed] Pass arguments from Invocation to HBuffer

commit cafc2cc058
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 22:08:47 2022 +0900

    works

commit a7d01837ff
Author: Pavel Yaskevich <pyaskevich@apple.com>
Date:   Tue Jan 11 15:48:58 2022 -0800

    [Distributed] Adjust interface of `swift_distributed_execute_target`

    Since this is a special function, `calleeContext` doesn't point to
    a direct parent but instead both parent context (uninitialized)
    and resume function are passed as last arguments which means that
    `callContext` has to act as an intermediate context in call to accessor.

commit c1f830be27
Author: Pavel Yaskevich <pyaskevich@apple.com>
Date:   Tue Jan 11 17:00:08 2022 -0800

    [Distributed] Drop optionality from result buffer in `_executeDistributedTarget`

    `RawPointer?` is lowered into a two arguments since it's a struct,
    to make it easy let's just allocate an empty pointer for `Void` result.

commit c83c2c37b6
Author: Pavel Yaskevich <pyaskevich@apple.com>
Date:   Tue Jan 11 17:02:45 2022 -0800

    [Distributed] NFC: Update _remoteCall test-case to check multiple different result types

commit 29e7cf50e4
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 21:32:37 2022 +0900

    wip

commit 9128ecc6f8
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 20:46:20 2022 +0900

    wip

commit a6b2a62a67
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 20:38:22 2022 +0900

    wip

commit 8b188f0d43
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 16:55:10 2022 +0900

    wip

commit 3796bec2b9
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Jan 12 16:55:02 2022 +0900

    wip

commit 0ffc68b5ef
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Tue Jan 11 21:44:58 2022 +0900

    [Distributed] Implementing ad-hoc protocol requirements

commit 78862575e4
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 6 18:03:54 2022 +0900

    cleanup

commit 5f4ab89e25
Merge: 24a628e7c0 fdda6f2ee4
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 6 15:51:39 2022 +0900

    Merge branch 'main' into wip-impl-execute-swift

commit 24a628e7c0
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Thu Jan 6 15:33:21 2022 +0900

    wip

commit 69e7fed09d
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Dec 22 06:36:45 2021 +0900

    [Distributed] comment out distributed_actor_remoteCall for now

commit 376733a9f6
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Tue Dec 21 16:00:06 2021 +0900

    reimplement distributed get type info impls

commit 74ab47886a
Author: Konrad `ktoso` Malawski <konrad_malawski@apple.com>
Date:   Wed Dec 15 21:37:08 2021 +0900

    [Distributed] Implement func metadata and executeDistributedTarget

    dont expose new entrypoints

    able to get all the way to calling _execute
2022-01-27 17:51:43 +09:00
Doug Gregor
4c9bca9c53 Implement basic support for opaque parameters.
Implement function parameters of the form `some P` be synthesizing an
implicit generic parameter whose requirements come from the opaque
type. We then map the opaque type back to the generic parameter, and
print as the opaque type. This allows us to write functions with
implicit generic parameters:

```swift
func f(_: some Collection) { }
```

which is equivalent to:

```swift
func f<T: Collection>(_: some T) { }
```

where `T` is an otherwise-unused generic parameter name.

All of this is behind the experimental frontend flag
`-enable-experimental-opaque-parameters`.
2022-01-26 14:47:12 -08:00
Doug Gregor
0416ec708b Augment GenericTypeParamDecl with bits indicating they came from opaque types 2022-01-26 14:47:11 -08:00
Doug Gregor
7149702d12 Rename @_predatesConcurrency to @preconcurrency.
Introduce the `@preconcurrency` attribute name for `@_predatesConcurrency`,
which has been the favored name in the pitch thread so far. Retain the
old name for now to help smooth migration.
2022-01-26 08:39:01 -08:00
Slava Pestov
dcadc0db18 AST: Introduce ProtocolDecl::getPrimaryAssociatedType() 2022-01-26 00:11:38 -05:00
Arnold Schwaighofer
3791207fae Merge pull request #40990 from aschwaighofer/fix_isNativeMethodReplacement
AST: Fix ValueDecl::isNativeMethodReplacement
2022-01-25 06:40:29 -08:00
Anthony Latsis
00abccbd36 Merge pull request #39694 from AnthonyLatsis/mincomp
Sema: Explicit stricter minimization of protocol composition types for redeclaration checking
2022-01-25 16:38:54 +03:00
Anthony Latsis
4b1424ef19 Sema: Explicit stricter minimization of protocol composition types for redeclaration checking 2022-01-25 09:07:19 +03:00
Arnold Schwaighofer
1447cde65f AST: Fix ValueDecl::isNativeMethodReplacement
When we want to figure out whether a `@_dynamicReplacement(for:)` decl
should use native method replacement we need to check whether _the
replaced decl_ is objc dynamic in a generic class.

rdar://87428993
2022-01-24 14:19:21 -08:00
Doug Gregor
baf7ef18c9 Merge pull request #40945 from DougGregor/explicit-generic-param-list-storage 2022-01-21 17:28:08 -08:00
Doug Gregor
e2a49f4d3b Rework the storage of generic parameter lists in generic contexts.
In generic contexts, rework the storage for generic parameter lists
to make it more explicit when we have parsed vs. synthesized vs.
parsed-and-type-checked generic parameter lists.
2022-01-20 17:15:35 -08:00
Kavon Farvardin
6823744779 reimplement nonisolated initializing exprs for instance properties
It's possible to create an impossible set of constraints for
instance-member stored properties of a type. For example:

@MainActor func getStatus() -> Int { /* ... */ }
@PIDActor func genPID() -> ProcessID { /* ... */ }

class Process {
  @MainActor var status: Int = getStatus()
  @PIDActor var pid: ProcessID = genPID()

  init() {} // Problem: what is the isolation of this init?
}

We cannot satisfy the isolation of the initilizing expressions,
which demand that genStatus and genPID are run with isolation
from a non-async designated initializer, which is not possible.

This patch changes the isolation for those initializer expressions
for instance members, saying that the isolation is unspecified.

fixes rdar://84225474

The first attempt to do this was in
https://github.com/apple/swift/pull/40652
But, I implemented that as a hard source break, since the isolation
was changed in a way that an error diagnostic would be emitted.
This commit reimplements the change more gently, as a warning for
Swift 5 users.
2022-01-19 13:01:22 -08:00
Kavon Farvardin
be8c931771 Revert "some vars need unspecified isolation for initializing exprs"
This reverts commit 386940ce6d.
2022-01-18 11:08:53 -08:00
Doug Gregor
b1c83afc72 Merge pull request #40862 from DougGregor/param-decl-is-compile-time-const-overflow 2022-01-15 08:22:29 -08:00
Doug Gregor
f739411349 Move ParamDecl's IsCompileTimeConst bit elsewhere.
PointerIntPair shouldn't be used with 4 low bits, because the
allocator won't necessarily provide enough padding. Move the
recently-added IsCompileTimeConst bit into a separate field.

Fixes rdar://87614547.
2022-01-14 15:29:24 -08:00
Holly Borla
6e6ca13268 [Type System] Use the constraint type of an existential type in
various places that expect ProtocolType or ProtocoolCompositionType.
2022-01-13 19:30:44 -08:00
Slava Pestov
fa570fe072 ASTMangler: Respect @_originallyDefinedIn in mangleOpaqueTypeDecl()
mangleOpaqueTypeDecl() used to enable DWARFMangling, which
ignores @_originallyDefinedIn, which would in turn break module
interfaces.

Fixes rdar://problem/86480663.
2022-01-06 23:44:14 -05:00
Doug Gregor
791c9c7d13 Implement most of the semantic analysis for named opaque result types.
Address small gaps in several places to make named opaque result types
partially work:

* Augment name lookup to look into the generic parameters when inside the
result type, which is used both to create structure and add requirements
via a `where` clause.
* Resolve opaque generic type parameter references to
OpaqueTypeArchetypeType instances, as we do for the "some" types
* Customize some opaque-type-specific diagnostics and type printing to
refer to the opaque generic parameter names specifically
* Fix some minor issues with the constraint system not finding
already-opened opaque generic type parameters and with the handling of
the opaque result type candidate set.

The major limitation on opaque types, where we cannot add requirements
that aren't strictly protocol or superclass requirements on the
generic parameters, remains. Until then, named opaque result types are
no more expressive than structural opaque result types.
2022-01-04 21:14:04 -08:00
Doug Gregor
43324e8130 Merge pull request #40710 from DougGregor/structural-opaque-result-types 2022-01-04 20:51:14 -08:00