Commit Graph

1428 Commits

Author SHA1 Message Date
Pavel Yaskevich
dfadee3731 [CSDiagnostics] Attach missing member diagnostic to a pattern/statement
If missing member is found in e.g. case statement or a pattern,
let's attach diagnostic directly to it.
2022-05-18 00:28:08 -07:00
Pavel Yaskevich
f3ff87b6f4 [Diagnostics] Diagnose re-labeling failures in ambiguity conditions
If all solutions point to the same overload choice that needs
re-labeling it's safe to diagnose it as if there was no ambiguity
because the call site is static.
2022-05-13 14:25:14 -07:00
Pavel Yaskevich
854f64eff5 [CSClosure] Diagnose invalid re-declarations in multi-statement closures
Calling `typeCheckDecl` on `VarDecl` is what triggers re-declaration
checking and that was skipped by the solution application logic.
2022-05-09 12:50:39 -07:00
Pavel Yaskevich
67895c2927 [CSClosure] Mark partially inferred external declarations as invalid
If a syntactic element references an external declaration (relative
to its own context), let's check whether it has any type variables,
and if so, replace them with errors to remove any possibility of
bringing external constraints into element's scope.

Resolves: rdar://92347054
2022-05-05 11:44:26 -07:00
Josh Soref
92a1c4bc28 Spelling test expr (#58577)
* spelling: expressions

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: lousy

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: refers

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

* spelling: should

Signed-off-by: Josh Soref <jsoref@users.noreply.github.com>

Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
2022-05-04 14:16:58 -07:00
Hamish Knight
04bf10b497 Merge pull request #58524 from hamishknight/condtrail 2022-04-29 19:03:57 +01:00
Pavel Yaskevich
2c140bdf4d Merge pull request #58503 from xedin/rdar-92366212
[ConstraintSystem] Fail `~=` synthesis if constraint generation fails
2022-04-29 10:19:01 -07:00
Hamish Knight
c5a53ef73e [Sema] Don't warn on trailing closures in closure conditions
Add ClosureExpr to the list of expressions we don't
walk into for the purposes of diagnosing trailing
closures in conditional initializers.

rdar://92521618
2022-04-29 14:47:19 +01:00
Pavel Yaskevich
48e70ed6cc [ConstraintSystem] Fail ~= synthesis if constraint generation fails
If constraint generation for application of `~=` failed that should
result in an immediate synthesis failure.

Resolves: rdar://92366212
2022-04-28 18:02:19 -07:00
Pavel Yaskevich
a0d132582e [Diagnostics] Improve diagnostic message for extraneous &
Resolves: https://github.com/apple/swift/issues/58389
2022-04-25 15:08:04 -07:00
Pavel Yaskevich
1c426a30d1 Merge pull request #42484 from xedin/drop-se-0326-flag
[TypeChecker] NFC: Remove `-experimental-multi-statement-closures` flag
2022-04-20 14:39:35 -07:00
Pavel Yaskevich
6db0001863 [TypeChecker] NFC: Remove -experimental-multi-statement-closures flag
SE-0326 has been enabled by default, so this flag is no longer necessary.
2022-04-20 10:40:27 -07:00
Anthony Latsis
934964d49d Use AbstractStorageDecl::isSettableInSwift to prohibit direct writes to optional requirements
Stop pretending that an optional requirement is immutable via the `StorageImplInfo` request.
This approach has lead astray the conformance checker and may have had a negative impact
on other code paths, and it doesn't work for imported declarations because they bypass the
request. Instead, use a forwarding `AbstractStorageDecl::isSettableInSwift` method
that special-cases optional requirements.
2022-04-20 14:27:15 +03:00
Luciano Almeida
a97879d46d Merge pull request #42254 from LucianoPAlmeida/refactor-diag-checked-cast
[Sema] Improvements on typeCheckCheckedCast and checked cast diagnostics
2022-04-15 16:39:36 -03:00
Anthony Latsis
4a0f6cedc9 CS: optional storage key path components are read-only 2022-04-14 18:38:29 +03:00
Luciano Almeida
c2ce16da19 [tests] Additional tests for some checked cast edge cases 2022-04-14 00:12:57 -03:00
Pavel Yaskevich
f7253f253e Merge pull request #42228 from xedin/enable-se-0347-by-default
[TypeChecker] SE-0347: Enable type inference from default expressions
2022-04-08 16:10:20 -07:00
Pavel Yaskevich
73e15c0c4d Merge pull request #42195 from xedin/rdar-91225620
[CSClosure] Handle wrapped variables without explicit initializers
2022-04-07 10:05:37 -07:00
Pavel Yaskevich
b03021dbb7 [TypeChecker] SE-0347: Enable type inference from default expressions 2022-04-06 15:03:00 -07:00
Pavel Yaskevich
869a413aae [CSClosure] Handle wrapped variables without explicit initializers
All variables without explicit initializers were considered to be
uninitialized which is incorrect because if a variable has a property
wrapper attached to it that wrapper needs its initializer type-checked,
for example:

```
@propertyWrapper
struct Wrapper {
  var name: String

  ...
}

test {
  @wrapper(name: "wrapper")
  var v;
}
```

`v` gets initialized via a call to `Wrapper(name: "wrapper")`.

Resolves: rdar://91225620
2022-04-06 14:36:31 -07:00
Evan Wilde
9e6335185b Merge pull request #41898 from etcwilde/ewilde/fixit-capture-name
Improve captured field diagnostics
2022-04-04 18:06:24 -07:00
Evan Wilde
4c7e4615d9 Improve captured field diagnostics
This patch improves the error message emitted when the capture list
contains an item that is a sub-field of a struct/class/etc....

If the closure capture did not include `weak` at the beginning, the
presence of a period would cause the if-chain to fall through the
identifier checking, resulting in an error message about expecting a
`weak` keyword. Instead, I've opted to accept the period at that stage
of parsing so that we can fall through to a better error message.

For the following code
```
{ [self.field] in ... }
```
instead of emitting
`expected 'weak', 'unowned', or no specifier in capture list`,
we now emit
`fields may only be captured by assigning to a specific name`
with a fix-it that changes the code to
```
{ [ field = self.field ] in ... }
```
2022-04-01 18:23:00 -07:00
Anthony Latsis
324913055d CS: Handle unbound references to @objc optional methods 2022-03-30 19:11:29 +03:00
Pavel Yaskevich
8506d9dd98 Merge pull request #42022 from hborla/default-argument-fixes
[ConstraintSystem] Only attempt to infer a type from a default argument if there is a non-null callee.
2022-03-25 12:01:30 -07:00
Holly Borla
0fdb9a38d2 [ConstraintSystem] Bail out of inference from default arguments if there
is no parameter list for the callee.

This can happen when the callee is a closure that has been assigned to
a variable.
2022-03-25 00:20:34 -07:00
Pavel Yaskevich
3c5a6f93e9 Merge pull request #41864 from xedin/improvements-for-diagnoseAmbiguity
[ConstraintSystem] Augment `diagnoseAmbiguity` to handle non-expression anchors
2022-03-21 10:00:19 -07:00
Pavel Yaskevich
ebdef12fe1 [ContraintSystem] Augment diagnoseAmbiguity to diagnose non-expression ambiguities
Since constraint solver can now handle statements, patterns, and declarations,
it's possible to that ambiguity could be detected in a non-expression context,
for example - pattern matching in switch statements. Augment `diagnoseAmbiguity`
to accept overloads with non-expression anchors and diagnose them in order of
their appearance in a solution.
2022-03-17 13:02:20 -07:00
Pavel Yaskevich
613fdca3a8 [CSDiagnostics] Fix trailing closure ambiguity note to not expect that anchor is expression
`TrailingClosureAmbiguityFailure::diagnoseAsNote()` is used by
`diagnoseAmbiguity` opportunistically, which means that anchor
could be a pattern or a statement condition element.
2022-03-17 12:20:23 -07:00
Pavel Yaskevich
2dd97748f3 [CSGen] Use correct locator for member references in enum element patterns
Referencing a member in pattern context is not a regular member reference,
it should use only enum element declarations, just like leading-dot syntax
does, so both locators should end with `pattern matching` element to indicate
that to the member lookup.

Resolves: rdar://90347159
2022-03-17 11:54:40 -07:00
Pavel Yaskevich
5331e276d5 Merge pull request #41730 from xedin/se-0326-solve-pattern-bindings-via-conjunctions
[SE-0326] Re-enable multi-statement closure inference by default
2022-03-15 13:21:03 -07:00
Pavel Yaskevich
894c932ad0 [CSApply] Use decl context of target when applying solution to it
Solution application target can have its declaration context differ
from one used for constraint system, since target could be e.g. a
pattern associated with pattern binding declaration, a statement or
a sub-element of one (e.g. where clause) used in a closure etc.
2022-03-14 10:09:35 -07:00
Pavel Yaskevich
5c3fb222e1 [CSClosure] Explode pattern binding declarations into conjunctions
`one-way` constraints disable some optimizations related to component
selection because they imply strict ordering. This is a problem for
multi-statement closures because variable declarations could involve
complex operator expressions that rely on aforementioned optimizations.

In order to fix that, let's move away from solving whole pattern binding
declaration into scheme that explodes such declarations into indvidual
elements and inlines them into a conjunction.

For example:

```
let x = 42, y = x + 1, z = (x, test())
```

Would result in a conjunction of three elements:

```
x = 42
y = x + 1
z = (x, test())
```

Each element is solved indepedently, which eliminates the need for
`one-way` constraints and re-enables component selection optimizations.
2022-03-08 21:37:40 -08:00
Pavel Yaskevich
966f58f044 [Tests] NFC: Adjust all the test-cases improved by multi-statement inference 2022-03-08 01:13:44 -08:00
Holly Borla
12459cff80 [Diagnostics] Print 'any' in diagnostic arguments. 2022-03-05 14:26:45 -08:00
Pavel Yaskevich
e9f7a6a8f5 [CSClosure] Delay type-checking of local functions until body is rewritten
A local function can capture a variable that has been declared after it,
which means that type-checking such declaration in-order would trigger
sub-typecheck that would corrupt AST underness the solution application
walker.
2022-03-02 16:37:12 -08:00
Pavel Yaskevich
59154d6d71 [ConstraintSystem] Support solving expression patterns via injecting call to ~= operator
Augment the constraint solver to fallback to implicit `~=` application
when member couldn't be found for `EnumElement` patterns because
`case` statement should be able to match enum member directly, as well
as through an implicit `~=` operator application.
2022-02-28 17:02:28 -08:00
Slava Pestov
4655fc359b Sema: Make a couple of TypeResolver methods idempotent
When emitting a diagnostic, mark the TypeRepr as invalid and
return an ErrorType to ensure that the diagnostic is not
emitted again, and to muffle downstream diagnostics.
2022-02-15 04:02:46 -05:00
Louis D'hauwe
7ebdb8e6b4 [ASTPrinter] Fix expression printing for metatype access
And fix operators not printing when we can't get a `MemberOperatorRef`.
2022-02-02 12:43:22 -08:00
Luciano Almeida
3987cb20f0 Merge pull request #40811 from LucianoPAlmeida/minor-is-diag 2022-01-12 12:11:55 -03:00
LucianoAlmeida
4a881739a6 [Diagnostics][Sema] Improving wording same type is check 2022-01-11 22:46:23 -03:00
Louis D'hauwe
9da37466ea [ASTPrinter] More expression printing 2022-01-11 14:24:17 -08:00
Louis D'hauwe
a89ea380a9 [ASTPrinter] Print expressions
Add new `-print-ast-decl` frontend option for only printing declarations,
to match existing behavior.
Some tests want to print the AST, but don't care about expressions.

The existing `-print-ast` option now prints function bodies and expressions.
Not all expressions are printed yet, but most common ones are.
2022-01-11 14:24:16 -08:00
Cal Stephens
369e20f64c Put back unused capture warnings 2021-12-26 14:29:38 -08:00
Cal Stephens
ccdf807211 Move weak self errors to their own file 2021-12-26 14:14:31 -08:00
Cal Stephens
20ed27a5c6 Tests pass, except for 'capture 'y' was never used' issue 2021-12-26 12:34:27 -08:00
Cal Stephens
c6b4a200e1 Make more tests pass 2021-12-25 20:29:36 -08:00
Cal Stephens
66c89f1ab1 More test fixes 2021-12-25 10:49:29 -08:00
Cal Stephens
a5b3312da5 Fix more cases, write more test 2021-12-24 20:51:57 -08:00
Cal Stephens
d909365e2e Update tests 2021-12-24 08:16:56 -08:00
Pavel Yaskevich
f287f7e6e4 [CSClosure] Support empty return when closure result is optional Void
Source compatibility workaround.

func test<T>(_: () -> T?) {
  ...
}

A multi-statement closure passed to `test` that has an optional
`Void` result type inferred from the body allows:
  - empty `return`(s);
  - to skip `return nil` or `return ()` at the end.

Implicit `return ()` has to be inserted as the last element
of the body if there is none. This wasn't needed before SE-0326
because result type was (incorrectly) inferred as `Void` due to
the body being skipped.

Resolves: rdar://85840941
2021-12-08 13:27:21 -08:00