Commit Graph

1493 Commits

Author SHA1 Message Date
Luciano Almeida
d6bf34e65c [CSSimplify] Thin to thin is also allowed 2020-06-08 20:36:09 -03:00
Luciano Almeida
baccbde0d1 [CSSimplify] Simplify logic for valiting to thick conversion on subtype 2020-06-08 20:36:09 -03:00
Luciano Almeida
8f2f14bbad [CSSimplify] Modify logic on match representations to allow ONLY thick to thin and thick to thick representations on subtype context 2020-06-08 20:36:09 -03:00
Doug Gregor
64f903fe2a [Type checker] Experimental support for one-way parameter constraints.
Introduce an experimental mode (behind the flag
`experimental-one-way-closure-params`) that places one-way
constraints between closure parameter types and references to those
parameters within the body of the closure. The intent here is to
break up constraint systems further, potentially improving type
checking performance and making way for larger closure bodies to be
supported.

This is a source-breaking change when the body of a single-expression
closure is used to determine the parameter types. One obvious example
is when there is no contextual type, e.g.,

    let _ = { $0 + 1 }

this type-checks today because `1` becomes `Int`, which matches the
`+` overload with the type `(Int, Int) -> Int`, determining the
parameter type `Int` for the closure. Such code would not type-check
with one-way constraints.
2020-06-05 22:47:21 -07:00
Doug Gregor
7d4da10843 Merge pull request #32200 from DougGregor/single-expression-closure-cleanup
[AST] Clean up handling of single-expression closures
2020-06-05 21:02:58 -07:00
Doug Gregor
836bc57fe5 [AST Walker] Stop visiting the bodies of closures as expressions.
Single-expression closures have always been traversed differently
from multi-statement closures. The former were traversed as if the
expression was their only child, skipping the BraceStmt and implicit
return, while the later was traversed as a normal BraceStmt.
Unify on the latter treatment, so that traversal

There are a few places where we unintentionally relied on this
expression-as-child behavior. Clean those up to work with arbitrary
closures, which is an overall simplification in the logic.
2020-06-04 23:06:32 -07:00
Doug Gregor
8e6840ddd5 Merge pull request #32178 from DougGregor/single-expression-closure-cleanup
[AST] Clean up handling of single-expression closures
2020-06-04 10:20:59 -07:00
Doug Gregor
f55e7643fa [Constaint system] Add a predicate for when to check closures in enclosing expr
Introduce a new predicate, shouldTypeCheckInEnclosingExpression(), to
determine when the body of a closure should be checked as part of the
enclosing expression rather than separately, and use it in the various
places where "hasSingleExpressionBody()" was used for that purpose.
2020-06-03 22:48:58 -07:00
Pavel Yaskevich
651503b147 Merge pull request #32128 from xedin/adjust-raw-representable-diag
[Diagnostics] Refactor diagnostics related to raw representable types
2020-06-03 11:26:22 -07:00
Pavel Yaskevich
b938f960df [Diagnostics] NFC: Rename a fix/diagnostic for missing .rawValue reference 2020-06-03 08:48:33 -07:00
Pavel Yaskevich
734f5b660c [Diagnostics] NFC: Fix typo(s) raw representative -> representable 2020-06-02 12:24:42 -07:00
Pavel Yaskevich
9805b0ab89 [ConstraintSystem] Do more checking before suggesting to use of .rawValue
Introduce `repairByUsingRawValueOfRawRepresentableType` which is used for
assignment, argument-to-parameter conversions and contextual mismatches.

It checks whether `from` side is a raw representable type and tries
to match `to` side to its `rawValue`.

Also extract logic common for `repairByUsingRawValueOfRawRepresentableType`
and `repairByExplicitRawRepresentativeUse` into `isValueOfRawRepresentable`.
2020-06-01 14:10:24 -07:00
Doug Gregor
6def0303a9 [Constraint system] Separate out constraint generation for closures. 2020-05-29 20:51:17 -07:00
Pavel Yaskevich
f048652a2b [ConstraintSystem] Do more checking before suggesting to explicitly contruct raw representable
Introduce `repairByExplicitRawRepresentativeUse` which is used for
assignment, argument-to-parameter conversions and contextual mismatches.

It checks whether `to` side is a raw representable type and tries
to match `from` side to its `rawValue`.
2020-05-29 12:14:07 -07:00
Pavel Yaskevich
c884068bfa [ConstraintSystem] Tally implicit optional wraps into impact of pointer mismatch
Impact of cases where pointer types mismatch after implict optional
wrap(s) should be higher than mismatch alone.

Distinguishing that helps to disambiguate following case (and other similar ones)
without using ranking:

```swift
func foo(_: UnsafePointer<Int>) {}
func foo(_: UnsafePointer<Int>?) {}

func test(_ ptr: UnsafePointer<Float>) {
  foo(ptr)
}
```
2020-05-26 12:46:34 -07:00
Luciano Almeida
2e1609e533 [tests] Adjusting SR-12869 test cases for optional mismatches 2020-05-24 16:13:23 -03:00
Luciano Almeida
ab0e8a8e8e [CSSimplify] Do not record IgnoreAssignmentDestinationType or contextual if we already record a tuple mismatch 2020-05-24 16:08:58 -03:00
Robert Widmann
afe8f2b63f Drop TypeCheckerDebugConsumer 2020-05-18 22:49:55 -07:00
Hamish Knight
aa0ad55706 [CS] Don't leave key path with holes unsolved
We currently leave a key path constraint unsolved
if one of its components hasn't yet had its
overload resolved. However, for e.g a missing
member component, the overload type variable will
be bound to a hole and an overload will never be
resolved.

Tweak the logic to consider the key path constraint
trivially solved if one of its components has been
marked as a hole, which will allow the key path
type itself to be marked as a hole.

Resolves SR-12437 & SR-12823.
Resolves rdar://62201037.
2020-05-16 16:52:35 -07:00
Pavel Yaskevich
d111f119d8 [ConstraintSystem] Detect and diagnose inability to infer type of closure parameter(s)
Detect situation when it's impossible to determine types for
closure parameters used in the body from the context. E.g.
when a call closure is associated with refers to a missing
member.

```swift
struct S {
}

S.foo { a, b in } // `S` doesn't have static member `foo`

let _ = { v in } // not enough context to infer type of `v`

_ = .foo { v in } // base type for `.foo` couldn't be determined
```

Resolves: [SR-12815](https://bugs.swift.org/browse/SR-12815)
Resolves: rdar://problem/63230293
2020-05-15 01:14:30 -07:00
Robert Widmann
2bca013457 Move "isDebugMode" into ConstraintSystem
This eliminates the final source of mutation of the TypeCheckerFlags on the ASTContext.
2020-05-13 09:13:44 -07:00
Artem Chikin
8aceb03858 Merge pull request #31716 from artemcm/UnlabeledKeypathFix
[Type-checker] Improve diagnostic for keypath used without 'keyPath:' label
2020-05-13 06:17:26 -07:00
Artem Chikin
97e32abc3c Improve diagnostic for keypath used without 'keyPath:' label 2020-05-12 15:58:11 -07:00
Luciano Almeida
02c454c976 [Diagnostics] Diagnose that we cannot infer the key path type when binding to a hole 2020-05-11 18:08:40 -03:00
Artem Chikin
3abb0bd6eb Merge pull request #31563 from artemcm/TypeCheckKeypathAsClosure
Add IgnoreContextualType fix on Keypath -> Function type mismatch.
2020-05-07 09:11:05 -07:00
Pavel Yaskevich
156066997a Merge pull request #31600 from xedin/rdar-62428353
[Diagnostics] Diagnose passing r-value without `&` to `inout` paramet…
2020-05-07 00:05:10 -07:00
Artem Chikin
7aed042817 Add fix on Keypath -> Function with multiple arguments type mismatch.
When simplifying a keypath constraint with a function type binding, single-parameter functions have the parameter type and the return type matched against the keypath root and value; whereas multiple-parameter functions cause an ambiguous failure (in `simplifyKeyPathConstraint`).

Resolves rdar://problem/57930643
2020-05-06 19:15:08 -07:00
Pavel Yaskevich
595b198f8e [Diagnostics] Diagnose passing r-value without & to inout parameter as mutability problem
If argument is immutable, with or without explicit `&`, let's
diagnose that as mutability problem because suggesting
to add `&` to immutable declaration is not the best possible fix.

Resolves: rdar://problem/62428353
2020-05-06 13:13:16 -07:00
John McCall
015d838441 Claim trailing closure arguments like we used to in error cases. 2020-05-06 01:56:40 -04:00
John McCall
882035f003 Implement the conservative option for typechecking multiple trailing closures.
The current approach for type-checking single trailing closures
is to scan backwards from the end of the parameter list, looking
for something that can be passed a closure.  This generalizes that
to perform label-matching in reverse on any later trailing closures,
then pick up from that point when trying to place the unlabeled
trailing closure.

The current approach is really not a good language rule, but changing
it as much as we'd really like will require evolution approval and a
source break, so we have to be cautious.
2020-05-06 01:56:40 -04:00
John McCall
a518e759d9 WIP for a different syntax for multiple trailing closures
that allows arbitrary `label: {}` suffixes after an initial
unlabeled closure.

Type-checking is not yet correct, as well as code-completion
and other kinds of tooling.
2020-05-06 01:56:40 -04:00
Pavel Yaskevich
191fcc49d3 Revert "[CS] Account for type variables when matching metatypes"
This reverts commit 84a3db45db.
2020-05-05 13:13:29 -07:00
Pavel Yaskevich
326b371e10 [ConstraintSystem] Switch auxiliary functions to use ASTNode instead of TypedNode 2020-04-29 17:03:45 -07:00
Robert Widmann
f9463922fd Merge pull request #31390 from CodaFi/tone-loc
Strip Out More TypeLocs
2020-04-29 16:46:00 -07:00
Pavel Yaskevich
6bdd534a9c [ConstraintSystem] Don't attempt property wrapper fixes for key path dynamic member lookup
If this is an attempt to fetch members through key path dynamic member lookup
let's not try to apply any property wrapper related fixes because modifying
base type would not change the result.

Resolves: [SR-12520](https://bugs.swift.org/browse/SR-12520)
Resolves: rdar://problem/61911108
2020-04-29 12:09:18 -07:00
Robert Widmann
5b3060318e [NFC] Strip ClosureExpr of its TypeLoc 2020-04-28 20:10:10 -07:00
Slava Pestov
742bd98402 Sema: Remove ConformanceCheckOptions::SkipConditionalRequirements
All callers can trivially be refactored to use ModuleDecl::lookupConformance()
instead. Since this was the last flag in ConformanceCheckOptions, we can remove
that, too.
2020-04-25 00:14:24 -04:00
Joe Groff
b4c7a7e85d Merge pull request #31224 from AnthonyLatsis/rename-getfullname-2
AST: Rename getFullName -> getName on ValueDecl & MissingMemberDecl
2020-04-24 12:51:28 -07:00
Pavel Yaskevich
4405768326 [ConstraintSystem] Refactor recordFix to no assume that non-augmenting fixes anchored on expressions 2020-04-23 12:01:05 -07:00
Pavel Yaskevich
4b1aa29149 [ConstraintSystem] NFC: Adjust all uses of locator anchors to work with TypedNode 2020-04-23 01:13:13 -07:00
Pavel Yaskevich
288e286efd Merge pull request #31192 from LucianoPAlmeida/SR-12425-diagnostics
[SR-12425] Improving diagnostics for key path application on non-convertible root type
2020-04-23 00:17:49 -07:00
Anthony Latsis
74252028ca AST: Rename getFullName -> getName on ValueDecl & MissingMemberDecl 2020-04-23 05:16:55 +03:00
Robert Widmann
78e07c1d41 Merge pull request #31159 from CodaFi/track-star
Remove Fallback Infrastructure For Evaluator-Based Dependencies
2020-04-22 15:37:48 -07:00
Luciano Almeida
f8cc9b52fe [tests] Adjusting SR-12425 diagnostics tests 2020-04-21 21:08:37 -03:00
Luciano Almeida
e17a934464 [CSSimplify] Recording fix for keypath application root type mismatch 2020-04-21 20:13:32 -03:00
Hamish Knight
c39c4e8aad [CS] Unify failed constraint recording
Rename `addNewFailingConstraint` to
`recordFailedConstraint`, and call into it
whenever a constraint fails, instead of setting
`failedConstraint`. This ensures that
`-debug-constraints` will always log the constraint
that failed a given scope.

In addition, introduce `retireFailedConstraint`
to cover the common case of retiring a constraint
that just failed.
2020-04-20 19:08:24 -07:00
Hamish Knight
f9c0d25c39 [CS] Deindent a few debug messages
The additional indentation implies that they're
taking place in a new solver scope, but this isn't
the case.
2020-04-20 19:08:24 -07:00
Hamish Knight
49ca2d0778 [CS] A couple of cleanups (#31155)
[CS] A couple of cleanups
2020-04-20 19:06:55 -07:00
Robert Widmann
48a5432cb7 [NFC] Remove ConformanceCheckFlags::InExpression
The last read of this bit was removed when the legacy referenced name tracker was deleted in the last commit.
2020-04-20 10:22:58 -07:00
Luciano Almeida
ab81236c8c [tests] Adding SR-12626 and SR-12425 test cases 2020-04-20 13:46:38 -03:00