Commit Graph

1487 Commits

Author SHA1 Message Date
Hamish Knight
a40f1abaff Introduce if/switch expressions
Introduce SingleValueStmtExpr, which allows the
embedding of a statement in an expression context.
This then allows us to parse and type-check `if`
and `switch` statements as expressions, gated
behind the `IfSwitchExpression` experimental
feature for now. In the future,
SingleValueStmtExpr could also be used for e.g
`do` expressions.

For now, only single expression branches are
supported for producing a value from an
`if`/`switch` expression, and each branch is
type-checked independently. A multi-statement
branch may only appear if it ends with a `throw`,
and it may not `break`, `continue`, or `return`.

The placement of `if`/`switch` expressions is also
currently limited by a syntactic use diagnostic.
Currently they're only allowed in bindings,
assignments, throws, and returns. But this could
be lifted in the future if desired.
2023-02-01 15:30:18 +00:00
Alex Hoppen
2c5b193892 [Sema] Type check multi-statement closures inside result builders 2023-02-01 10:29:56 +01:00
Holly Borla
9b5cf1d2ff [Diagnostics] Remove the MacroMissingArguments constraint fix and its
associated failure diagnostic.

This constraint fix is unused now that MacroExpansionExpr always has an
argument list, and goes through the AddMissingArguments constraint fix for
this error.
2023-01-31 17:45:31 -08:00
John McCall
c491d25d06 Fix printing and implement parsing of opened element archetypes in SIL
Also, fix a couple places that were checking for opened existentials
to check for any local archetype.
2023-01-31 19:54:31 -05:00
John McCall
5dd6c4ee5f [NFC] Pass SIL-specific type resolution state abstractly into Sema
This is in preparation for parsing pack element archetypes.
2023-01-31 19:54:31 -05:00
swift-ci
820156338d Merge remote-tracking branch 'origin/main' into rebranch 2023-01-31 12:54:11 -08:00
Pavel Yaskevich
9b688e9ca6 [CSFix] Move diagnoseForAmbiguity to RequirementFix
The logic is common for all types of fixes that represent
a requirement failure.
2023-01-26 15:55:50 -08:00
Pavel Yaskevich
edb6ef0d9a [CSFix] NFC: Add a common base class for all requirement failures 2023-01-26 15:55:50 -08:00
swift-ci
6e6d419476 Merge remote-tracking branch 'origin/main' into rebranch 2023-01-26 13:34:34 -08:00
Hamish Knight
76da268b4b [CS] Debug: Print ASTNode for contextual type
If we don't have an associated TypeRepr for a
contextual type in the constraint system, dump the
ASTNode that it's for instead.

Before:

```
Contextual Type: $T2
```

After:

```
Contextual Type: $T2 at DeclRef@/Users/hamish/src/swift-test-arena/swift-test-arena/main.swift:1493:21
```
2023-01-26 17:21:49 +00:00
swift-ci
2e517c6ffe Merge remote-tracking branch 'origin/main' into rebranch 2023-01-16 15:13:31 -08:00
Pavel Yaskevich
a5bcf13ea9 Merge pull request #63031 from xedin/diag-inaccessible-member-in-ambiguous-context
[CSFix] Diagnose use of inaccessible members in ambiguous contexts
2023-01-16 15:10:57 -08:00
swift-ci
7bf2d164d7 Merge remote-tracking branch 'origin/main' into rebranch 2023-01-14 05:04:52 -08:00
Luciano Almeida
e513d23c0b [Sema] Improving global actor function mismatch diagnostic 2023-01-13 20:47:23 -03:00
Pavel Yaskevich
d43d2ccb8e [CSFix] Diagnose use of inaccessible members in ambiguous contexts 2023-01-13 09:39:02 -08:00
swift-ci
a32e3d57f4 Merge remote-tracking branch 'origin/main' into rebranch 2023-01-09 01:34:36 -08:00
Doug Gregor
97ee7024cf Merge pull request #62917 from DougGregor/macro-expansion-diags 2023-01-09 01:29:58 -08:00
Erik Eckstein
712fd7922b Merge remote-tracking branch 'origin/main' into rebranch 2023-01-09 08:48:47 +01:00
Doug Gregor
c06216c36d [Macros] Disable macro expansion within the definition of macros.
... and once we do that, ensure that `#externalMacro` can only be
expanded as the definition of another macro.
2023-01-08 22:43:07 -08:00
Holly Borla
715de13dbf [Sema] Key opened pack element generic on the shape class of the expansion. 2023-01-07 15:07:51 -08:00
Holly Borla
6e28f996ce [ConstraintSystem] Create opened pack element generic environments lazily
in the constraint system.
2023-01-07 09:50:14 -08:00
Holly Borla
b01fc1a7a7 [ConstraintSystem] Pack element type variables can bind to noescape. 2023-01-07 09:50:14 -08:00
Kavon Farvardin
f594699c99 Merge pull request #62153 from kavon/lose-mainactor-94462333
Allow a global-actor to be dropped for some non-async functions.
2023-01-06 09:45:31 -08:00
Kavon Farvardin
3f6a0ccb90 Allow a global-actor to be dropped for some non-async functions.
It's ok to drop the global-actor qualifier `@G` from a function's type if:

- the cast is happening in a context isolated to global-actor `G`
- the function value will not be `@Sendable`
- the function value is not `async`

It's primarily safe to drop the attribute because we're already in the
same isolation domain. So it's OK to simply drop the global-actor
if we prevent the value from later leaving that isolation domain.
This means we no longer need to warn about code like this:

```
@MainActor func doIt(_ x: [Int], _ f: @MainActor (Int) -> ()) {
  x.forEach(f)
// warning: converting function value of type '@MainActor (Int) -> ()' to '(Int) throws -> Void' loses global actor 'MainActor'
}
```

NOTE: this implementation is a bit gross in that the constraint solver
might emit false warnings about casts it introduced that are actually
safe. This is mainly because closure isolation is only fully determined
after constraint solving. See the FIXME's for more details.

resolves rdar://94462333
2023-01-05 17:54:00 -08:00
Artem Chikin
b205a9c2c5 Merge pull request #62696 from artemcm/BetterScannerDependencyResolution
[Dependency Scanning] Refactor the scanner to resolve unqualified module imports
2023-01-05 17:48:21 -08:00
Artem Chikin
12477b7b79 [Dependency Scanning] Refactor the scanner to resolve unqualified module imports
This changes the scanner's behavior to "resolve" a discovered module's dependencies to a set of Module IDs: module name + module kind (swift textual, swift binary, clang, etc.).

The 'ModuleDependencyInfo' objects that are stored in the dependency scanner's cache now carry a set of kind-qualified ModuleIDs for their dependencies, in addition to unqualified imported module names of their dependencies.

Previously, the scanner's internal state would cache a module dependnecy as having its own set of dependencies which were stored as names of imported modules. This led to a design where any time we needed to process the dependency downstream from its discovery (e.g. cycle detection, graph construction), we had to query the ASTContext to resolve this dependency's imports, which shouldn't be necessary. Now, upon discovery, we "resolve" a discovered dependency by executing a lookup for each of its imported module names (this operation happens regardless of this patch) and store a fully-resolved set of dependencies in the dependency module info.

Moreover, looking up a given module dependency by name (via `ASTContext`'s `getModuleDependencies`) would result in iterating over the scanner's module "loaders" and querying each for the module name. The corresponding modules would then check the scanner's cache for a respective discovered module, and if no such module is found the "loader" would search the filesystem.

This meant that in practice, we searched the filesystem on many occasions where we actually had cached the required dependency, as follows:
Suppose we had previously discovered a Clang module "foo" and cached its dependency info.
-> ASTContext.getModuleDependencies("foo")
--> (1) Swift Module "Loader" checks caches for a Swift module "foo" and doesn't find one, so it searches the filesystem for "foo" and fails to find one.
--> (2) Clang Module "Loader" checks caches for a Clang module "foo", finds one and returns it to the client.

This means that we were always searching the filesystem in (1) even if we knew that to be futile.
With this change, queries to `ASTContext`'s `getModuleDependencies` will always check all the caches first, and only delegate to the scanner "loaders" if no cached dependency is found. The loaders are then no longer in the business of checking the cached contents.

To handle cases in the scanner where we must only lookup either a Swift-only module or a Clang-only module, this patch splits 'getModuleDependencies' into an alrady-existing 'getSwiftModuleDependencies' and a newly-added 'getClangModuleDependencies'.
2023-01-05 11:44:06 -08:00
Pavel Yaskevich
2e25c2fc80 Merge pull request #62791 from xedin/rdar-103739206
[Diagnostics] Relax contextual type presence from assertion to a check
2023-01-04 09:47:19 -08:00
swift-ci
990588a938 Merge remote-tracking branch 'origin/main' into rebranch 2023-01-03 07:24:05 -08:00
Doug Gregor
0c5436211c Merge pull request #62768 from DougGregor/macro-omnibus 2023-01-03 07:13:16 -08:00
swift-ci
1a625f2706 Merge remote-tracking branch 'origin/main' into rebranch 2023-01-03 01:13:18 -08:00
Pavel Yaskevich
24bd6fc545 Merge pull request #62734 from xedin/enable-result-builder-ast-transform-by-default-with-old-impl
[TypeChecker] Enable result builder AST transform by default
2023-01-03 00:55:43 -08:00
Doug Gregor
71ca9c86e6 [Macros] Diagnose when we forget to provide macro arguments.
Unlike functions, you can't curry macros; diagnose when one omits the
arguments in a macro expansion of a macro that has a parameter list.
2023-01-02 21:22:04 -08:00
Doug Gregor
806b5a8777 [Macros] Diagnose errors where a macro is used without the '#'. 2023-01-02 21:22:04 -08:00
Pavel Yaskevich
eaf0532a04 [Diagnostics] Relax contextual type presence from assertion to a check
In some situations `getContextualType` for a contextual type
locator is going to return then empty type. This happens because
e.g. optional-some patterns and patterns with incorrect type don't
have a contextual type for initialization expression but use
a conversion with contextual locator nevertheless to indicate
the purpose. This doesn't affect non-ambiguity diagnostics
because mismatches carry both `from` and `to` types.

Resolves: rdar://problem/103739206
2023-01-02 21:11:07 -08:00
Alex Hoppen
3c90c892e9 [CodeCompletion] Drop ForCodeCompletion constraint system option for syntactic elements that don't contain completion token 2022-12-21 12:17:56 -08:00
swift-ci
65c33c0310 Merge remote-tracking branch 'origin/main' into rebranch 2022-12-21 10:55:04 -08:00
Holly Borla
0d3504fba6 Merge pull request #62729 from hborla/pack-diagnostics
[CSDiagnostics] Add an error message for pack expansion expressions over packs that don't have the same shape.
2022-12-21 13:44:08 -05:00
swift-ci
06a400d795 Merge remote-tracking branch 'origin/main' into rebranch 2022-12-21 07:53:50 -08:00
Holly Borla
42ede18fb0 Merge pull request #62713 from hborla/open-pack-element-type-repr
[ConstraintSystem] Enable pack element type reprs in expressions.
2022-12-21 10:48:42 -05:00
Holly Borla
e966b4ef7d [CSDiagnostics] Add an error message for pack expansion expressions over
packs that don't have the same shape.
2022-12-21 08:25:10 -05:00
Holly Borla
58953567b3 [CSGen] Use PackExpansionExpr::getExpandedPacks to generate ShapeOf constraints
rather than relying on PackElementExprs collected by preCheck.

This handles pack element expressions and pack element type reprs, and enforces that
all packs expanded by a given pack expansion expression all have the same shape.

Once the parser creates PackExpansionExpr directly (based on a dedicated syntax instead
of postfix '...'), the code in preCheck for identifying and creating pack expansions
can simply be deleted.
2022-12-20 22:34:16 -05:00
Holly Borla
a2346db445 [ConstraintSystem] Add a getAsTypeRepr helper method for casting ASTNodes. 2022-12-20 21:28:16 -05:00
Holly Borla
334efb9975 [ConstraintSystem] Always pass in a direct instance of OpenPackElementType instead
of assigning it to std::function_ref.

std::function_ref does not own the function reference, so assigning an OpenPackElementType
to a local function_ref lead to stale constraint system references when invoking
operator () later on.
2022-12-20 15:44:42 -05:00
Holly Borla
27aa3651e8 [ConstraintSystem] Open pack element types using a PackElementOf constraint
when resolving pack reference type reprs inside pack expansion expressions.
2022-12-20 11:36:58 -05:00
swift-ci
8f88e3d522 Merge remote-tracking branch 'origin/main' into rebranch 2022-12-19 15:44:32 -08:00
Artem Chikin
514b7031a8 Merge pull request #62628 from artemcm/ScannerRefactor
[NFC][Dependency Scanner] Rename scanner classes to better represent their meaning
2022-12-19 15:24:49 -08:00
swift-ci
53edbec88e Merge remote-tracking branch 'origin/main' into rebranch 2022-12-16 08:55:12 -08:00
Artem Chikin
1230966e80 [Dependency Scanner] Rename 'ModuleDependenceis' -> 'ModuleDependencyInfo' 2022-12-15 14:18:29 -08:00
Holly Borla
dc941de45e [ConstraintLocator] Add a locator path element that stores an opened pack element
generic signature.
2022-12-14 20:45:51 -08:00
swift-ci
446f63fdc1 Merge remote-tracking branch 'origin/main' into rebranch 2022-12-13 07:53:58 -08:00