Commit Graph

24025 Commits

Author SHA1 Message Date
Kavon Farvardin
20b060b893 allow discard in generic noncopyable type
A bug was preventing you from writing `discard self`
in a consuming method of a generic noncopyable type.

The main cause was the `isPureMoveOnly` ignored
unbound generic types, claiming none of them are
noncopyable. Then I also needed to pass the contextual
type with the vars bound to the type checker.

rdar://108975216
2023-05-12 16:11:38 -07:00
swift-ci
bc9acf98d8 Merge pull request #65840 from kavon/async-requirement-matching
Witness selection should pick exact matches for effect overloads
2023-05-12 14:14:42 -07:00
Kavon Farvardin
3ae2ce5a7f Witness selection should pick exact matches for effect overloads
You can overload a function based on its `async`-ness, and
resolution is carried out based on async-ness of calling
context.

But during protocol conformance checking, for an `async`
requirement we were accidentally choosing the non-`async
overload instead of the `async` one. The `async` one is
the choice people would expect, since the `async` requirement
is in essence the "context" that forwards to the underlying
witness. This intended behavior is also inferred from:

https://github.com/apple/swift/pull/40088

The problem boiled down to a bad check when categorizing the
witness matches prior to ranking them.

Resolves rdar://109135488 / https://github.com/apple/swift/issues/60318
2023-05-12 11:03:48 -07:00
Rintaro Ishizaki
9fc1521aeb [Macros/Parser] Attributes on MacroExpansionDecl
* Parse `#<identifier>` attribute list as a `MacroExpansionDecl`
  regardless of the position
* Diagnose whitespaces between `#` and the macro name.
* Correctly attach attributes to `MacroExpansionDecl`
* Fix `OrigDeclAttributes` to handle modifiers (use `getLocation()`
  instead of `AtLoc`.)

Type checking is a TODO

rdar://107386648
2023-05-11 12:04:35 -07:00
Pavel Yaskevich
181d2d1371 [CSSimplify] Allow conversions between tuples with pack expansions and Any
Don't attempt to wrap `Any` into a single-element tuple to match
against a tuple with pack expansions, this conversion would be
handled by existential promotion if it's allowed, otherwise it
would produce an error.

Resolves: rdar://109160060
2023-05-11 10:05:15 -07:00
Pavel Yaskevich
c9c631109b [CSDiagnostics] NFC: Move FailureDiagnostic::resolveType out of header 2023-05-09 14:11:45 -07:00
Pavel Yaskevich
440bc39207 [Diagnostics] Don't print pack element archetypes in diagnostics 2023-05-09 14:11:45 -07:00
Pavel Yaskevich
58ffca8f74 [ConstraintSystem] Don't produce partially matching note if none of the overloads matched 2023-05-09 14:11:38 -07:00
Kavon Farvardin
511eb44025 Merge pull request #65787 from kavon/forget-to-discard
rename `_forget` to `discard`; deprecate `_forget`
2023-05-09 07:30:49 -07:00
Allan Shortlidge
e12e16d9a1 Merge pull request #65772 from tshortli/suppress-explicit-availability-diags-non-darwin
Sema: Suppress explicit availability diagnostics on non-Darwin targets
2023-05-08 22:31:00 -07:00
Allan Shortlidge
8b05873a6c Merge pull request #65779 from tshortli/get-enclosing-apply-expr-function-conversion
Sema: Look through `FunctionConversionExpr` in `getEnclosingApplyExpr()`
2023-05-08 22:29:05 -07:00
Kavon Farvardin
3e4bc82aa8 rename _forget to discard; deprecate _forget
SE-390 concluded with choosing the keyword discard rather than forget for
the statement that disables the deinit of a noncopyable type. This commit
adds parsing support for `discard self` and adds a deprecation warning for
`_forget self`.

rdar://108859077
2023-05-08 21:42:19 -07:00
Slava Pestov
fdeb0e5a7f Merge pull request #65767 from slavapestov/variadic-generic-diagnostics
Add a few diagnostics for variadic generic types
2023-05-08 21:03:17 -04:00
Pavel Yaskevich
5f8e3eb6f6 [CSSimplify] Detect and diagnose conformance failures related to AnyHashable conversion
Failure of an argument to AnyHashable parameter to conform to Hashable
protocol should be detected in `simplifyConformsToConstraint` and fixed
there.

Doing so requires impact assessment adjustment because regular conformance
requirements have default impact of 1, this is going to have argument
impact of 2 not avoid clashing with other failures.
2023-05-08 16:16:30 -07:00
Allan Shortlidge
b4e75d1471 Sema: Look through FunctionConversionExpr in getEnclosingApplyExpr().
Follow up to https://github.com/apple/swift/pull/61481.

There is already a test case exercising this case but there happens to be no
observable difference in the compiler output because `noasync` diagnostics
already gracefully fall back to looking up the diagnostic `SourceLoc` another
way.

Resolves rdar://100883622.
2023-05-08 15:27:08 -07:00
Allan Shortlidge
93a96e81c2 Sema: Suppress explicit availability diagnostics on non-Darwin targets.
Suggesting the addition of an `@available` attribute on Linux and Windows is
inapprorpriate given that Swift is not ABI stable on those platforms.

Resolves rdar://107387133
2023-05-08 14:53:12 -07:00
Pavel Yaskevich
e3d1317208 [ConstraintSystem] Detect and diagnose missing each for value pack reference
Detect that a value pack is missing 'each' keyword during constraint
generation and fix-it by injecting `PackElementExpr`.
2023-05-08 13:30:51 -07:00
Pavel Yaskevich
eee7e1879f [CSDiagnostics] Add a diagnostic for missing each and provide a fix-it
Diagnose situations where value pack is referenced without an explicit 'each':

```
func compute<each T>(_: repeat each T) {}

func test<each T>(v: repeat each T) {
  repeat compute(v) // should be `repeat compute(each v)`
}
```
2023-05-08 13:30:51 -07:00
Pavel Yaskevich
583649088a [AST/CSGen] Move expanded pack collection into constraint generator
This is going to help us identify and fix positions were 'each'
keyword is mising.
2023-05-08 13:30:51 -07:00
Pavel Yaskevich
31e0a52be4 [CSFix] Add a skeleton of a fix for missing each in value pack reference 2023-05-08 13:30:51 -07:00
Slava Pestov
8f71dc928f Sema: Diagnose variadic enums, and inheritance from variadic classes
These are just temporary limitations.
2023-05-08 12:57:33 -04:00
Slava Pestov
2e9fd98933 Sema: Diagnose variadic types with more than one type parameter pack 2023-05-08 12:57:33 -04:00
Hamish Knight
d54ee5d680 Merge pull request #65744 from hamishknight/second-place 2023-05-08 17:49:09 +01:00
Alex Lorenz
a1dc63ec46 Merge pull request #65728 from hyp/eng/safe-overloads-and-unavailable-unemitted-decls-in-cxx
[interop][SwiftToCxx] avoid emitting ambiguous C++ overloads and emit unavailable type stubs for top level types that could not be emitted in the C++ section of the generated header
2023-05-07 06:25:03 -07:00
Hamish Knight
c0e013907e [AST] Allocate PlaceholderTypes in the correct arena
We shouldn't be allocating placeholders for type
variables in the permanent arena, and we should be
caching them such that equality works.

To achieve this, we need to introduce a new
"solver allocated" type property. This is required
because we don't want to mark placeholder types
with type variable originators as themselves having
type variables, as it's not part of their structural
type. Also update ErrorType to use this bit, though
I don't believe we currently create ErrorTypes
with type variable originators.
2023-05-06 20:42:02 +01:00
Pavel Yaskevich
ff527269ee Merge pull request #65610 from jreference/65330-unhelpful-error-contextually-required-as
[Sema] Fix issue 65330 Unhelpful error when missing contextually requ…
2023-05-06 12:00:03 -07:00
Kavon Farvardin
c260792e73 Merge pull request #65690 from kavon/forget-usage-fixes
`_forget` usage fixes to match SE-390
2023-05-06 11:50:10 -07:00
jreference
2cf01a18de [Sema] Fix issue 65330 Unhelpful error when missing contextually required as bridging conversion to AnyObject in structural position. Minor formatting change in previous test case 2023-05-06 10:47:15 +08:00
Alex Lorenz
aff3568a12 [interop][SwiftToCxx] emit unavailable type stubs for top level types that could not be emitted in the C++ section of the generated header 2023-05-05 17:03:26 -07:00
Kavon Farvardin
4943beb35e emit error if _forget is used on a type with no deinit
rdar://108877261
2023-05-05 14:50:48 -07:00
Kavon Farvardin
7ac3ea02a6 make it illegal to use _forget in an initializer
we decided against allowing it for now.

rdar://108877261
2023-05-05 14:50:48 -07:00
Kavon Farvardin
f667c867c9 Merge pull request #65673 from kavon/copyable-constraint-performance
Fix a performance issue when answering "is this tuple Copyable"?
2023-05-05 11:14:44 -07:00
Kavon Farvardin
fc636caf61 Merge pull request #65691 from kavon/consuming-nonescaping-closures
consuming cannot be applied to nonescaping closures
2023-05-05 10:03:08 -07:00
Allan Shortlidge
b12537faaf Merge pull request #65667 from tshortli/swiftinterface-missing-conformance-req-assert
Sema: Fix incorrect assert in TypeCheckProtocol.cpp.
2023-05-05 09:06:30 -07:00
Rintaro Ishizaki
0a558117fb Merge pull request #65630 from rintaro/macro-plugin-intiialize-rdar108022847 2023-05-05 06:34:29 -07:00
Kavon Farvardin
32e89875e7 consuming cannot be applied to nonescaping closures
According to SE-377:

consuming cannot be applied to parameters of nonescaping closure type, which by their nature are always borrowed:

// ERROR: cannot `consume` a nonescaping closure
func foo(f: consuming () -> ()) {
}

This commit implements the error message.

rdar://108388132
2023-05-05 00:16:41 -07:00
Becca Royal-Gordon
14665f9d53 Merge pull request #65641 from beccadax/objc-impl-protocols
Two @objcImpl protocol fixes
2023-05-04 19:34:06 -07:00
Kavon Farvardin
f15dadeee7 Merge pull request #65668 from kavon/noncopyable-metatypes-redo
Noncopyable metatypes redo
2023-05-04 16:42:06 -07:00
Allan Shortlidge
ba422f96be Sema: Fix incorrect assert in TypeCheckProtocol.cpp.
We can't assume that we will always find a viable witness for a protocol
requirement when typechecking a `.swiftinterface` file. The assert that assumed
there would be a match could fail when building a broken interface or building
a valid interface with a broken SDK, causing crashes instead of emitting
diagnostics.

Resolves rdar://108688535
2023-05-04 16:24:31 -07:00
Kavon Farvardin
ce04b84489 Fix a performance issue when answering "is this tuple Copyable"?
If we don't split up the tuple into individual constraints,
we end up spending more time querying whether a tuple is
Copyable in `lookupConformance`, because it will naively
check the types of all elements of the tuple recursively
with `lookupConformance`.

This is inefficient because if we know some of the elements
of the tuple are fixed types, we don't need to keep checking
those again. For example, if we have `($T, Int, $U)`, and
then try a binding for `$T`, we might ask again if the whole
tuple conforms. Leading to `lookupConformance` to check
whether `Int` (and all other elements of the tuple) conforms
to Copyable, when we either already know that, or can't
answer it yet because it's still a type variable.

By splitting up a Copyable constraint on a tuple into
invidivual  constraints on each of its type elements,
we can avoid this redundant work by `lookupConformance`.

While today we could short-cut this even further to say
that _all_ tuples are Copyable, since we emit an error if
a noncopyable type appears in one, that won't be true in
the near future. This is the nicer solution we'll want to
keep around long-term.

After discussing this with Pavel, we don't think there's a
good way to add a regression test for this, because the
performance issue primarily comes up in specific example
programs that aren't amenable to scale tests.

resolves rdar://107536402
2023-05-04 14:53:48 -07:00
Rintaro Ishizaki
e181a4d39c [Macros] Improve error handling for plugin errors 2023-05-04 14:40:28 -07:00
Hamish Knight
3087afc1f8 Merge pull request #65651 from hamishknight/placeholder
Resolves https://github.com/apple/swift/issues/65650
2023-05-04 19:50:12 +01:00
Kavon Farvardin
103bd043cd Revert "Revert "Prevent noncopyable metatypes from being converted to Any""
This reverts commit 1a3b42cd63.
2023-05-04 11:38:00 -07:00
Zoe Carver
bd1cc4c64f Merge pull request #65617 from zoecarver/update-diag-text
[diags][cxx-interop] Update diagnostic for 'begin' to suggest using a for-loop instead.
2023-05-04 10:16:11 -07:00
Pavel Yaskevich
002eb34177 Merge pull request #65625 from xedin/reverse-shape-of-constraint
[ConstraintSystem] Reverse direction of `ShapeOf` constraint
2023-05-04 09:10:08 -07:00
Rintaro Ishizaki
e93e4ba2cd [Macro] Handle error during initializing executable plugins
Previously, the compiler fails to read the result from 'getCapability'
IPC message, it used to just emit a fatalError and crashed.
Instead, propagate the error status and diagnose it.

rdar://108022847
2023-05-04 09:03:21 -07:00
Hamish Knight
b07f7b336e [CS] Improve handling of holes for Named/AnyPatterns
Rather than eagerly binding them to holes if the
sequence element type ends up being Any, let's
record the CollectionElementContextualMismatch fix,
and then if the patterns end up becoming holes,
skip penalizing them if we know the fix was
recorded. This avoids prematurely turning type
variables for ExprPatterns into holes, which
should be able to get better bindings from the
expression provided. Also this means we'll apply
the logic to non-Any sequence types, which
previously we would give a confusing diagnostic
to.
2023-05-04 14:53:58 +01:00
Hamish Knight
1be25895b8 [CS] Remove invalid DependentMemberType workaround for tuples
We can produce a hole here now without
regressing diagnostics.
2023-05-04 14:53:58 +01:00
Hamish Knight
b305324179 [CS] Remove obsolete check for a type variable
We no longer need to check for a type variable
here, it no longer regresses diagnostics. Also,
while here, let's bump the impact for an
Any/AnyObject missing conformance, as that's
unlikely going to be helpful since they cannot
conform to protocols even if the user wanted them
to.
2023-05-04 14:53:57 +01:00
Hamish Knight
68075696eb [CS] A couple of minor improvements to operator diagnostics
- Simplify the fix locator when looking for a
fix already present in a pattern match, this
avoids us emitting both a diagnostic for the
argument conversion, and for a conformance failure.
- Include tuples in the diagnostic logic where
we emit a generic "operator cannot be applied"
diagnostic, as a conformance diagnostic is
unlikely to be helpful in that case.
2023-05-04 14:53:57 +01:00