Commit Graph

58361 Commits

Author SHA1 Message Date
Joe Groff
59ab8b05f3 Make sure substituted SILFunctionTypes are canonical in their substitutions 2020-02-24 12:14:21 -08:00
Joe Groff
96a5d2cae0 SILCombiner: Recognize convert_function patterns that only change substitutions
We can eliminate `convert_function`s that are immediately used as the callee of
an `apply` or `partial_apply`, as well as stacked `convert_function`s that may
arise from this transformation.
2020-02-24 12:14:21 -08:00
Joe Groff
1ffafbe77b SIL: Compute result ownership by substituting correct function type 2020-02-24 12:14:21 -08:00
Joe Groff
9c9bf567f7 SIL: Preserve upper bound constraints for substitutions into nominal types.
When extracting substitutions during type lowering, we can't discard protocol constraints
in positions where the substitution is for a nominal type's generic arguments, since associated
types on that protocol may affect the nominal type's ABI.
2020-02-24 12:14:21 -08:00
Joe Groff
5a15d1249c Parse SILFunctionType brackets using consumeStartingLess/Greater.
With the substituted function type syntax, it's easy to end up with multiple angle brackets,
so we should handle token splitting to parse things like `Optional<<A> in (A) -> () for <Int>>`
the expected way.
2020-02-24 12:14:21 -08:00
Doug Gregor
f6f80befe8 [Constraint system] Handle implicit tupling during pattern matching.
SE-0110 strikes again!
2020-02-24 11:45:23 -08:00
Arnold Schwaighofer
e35ae37366 Merge pull request #29999 from aschwaighofer/irgen_use_value_witness_instead_of_outlined_value_op
IRGen: Optionally use value witness instead of outlined value functions
2020-02-24 11:03:10 -08:00
Arnold Schwaighofer
9486514650 IRGen: Fix type layout cache leak
rdar://59687311
2020-02-24 08:39:21 -08:00
Doug Gregor
d607d3a068 [Constraint system] Custom diagnostics for failed pattern matches.
Extend the constraint system’s diagnostics with specific handling for
matching an enum element pattern that has a subpattern (i.e., to capture
associated values) against an enum case that does not have any associated
value. This brings diagnostics for the new code path on par with the existing
diagnostics of coercePatternToType.
2020-02-24 00:48:15 -08:00
Doug Gregor
dcf7ddeb3a [Constraint system] Generate constraints for EnumElement patterns.
Generate a complete set of constraints for EnumElement patterns, e.g.,

    case let .something(x, y)

Most of the complication here comes from the implicit injection of optionals,
e.g., this case can be matched to an optional of the enum type of which
`something` is a member. To effect this change, introduce a locator for
pattern matching and use it to permit implicit unwrapping during member
lookup without triggering an error.

Note also labels are dropped completely when performing the match,
because labels can be added or removed when pattern matching. Label
conflict are currently diagnosed as part of coercePatternToType, which
suffices so long as overloading cases based on argument labels is not
permitted.

The primary observable change from this commit is in diagnostics: rather
than diagnostics being triggered by `TypeChecker::coercePatternToType`,
diagnostics for matching failures here go through the diagnostics machinery
of the constraint solver. This is currently a regression, because
there are no custom diagnostics for pattern match failures within the
constraint system. This regression will be addressed in a subsequent
commit; for now, leave those tests failing.
2020-02-24 00:48:15 -08:00
Doug Gregor
08bfba79df [Constraint system] Add conversion constraint for typed patterns.
For typed patterns, the sub pattern type must be convertible to the type
provided to the pattern.
2020-02-24 00:48:15 -08:00
Doug Gregor
bea9d06a8b [Constraint system] Set the type on all patterns, not just top-level ones. 2020-02-24 00:48:15 -08:00
Doug Gregor
244a8232dd [Constraint system] Maintain paren type sugar for patterns. 2020-02-24 00:48:15 -08:00
Doug Gregor
7bef5405ec [Constraint system] “is” pattern match should open the type 2020-02-24 00:48:15 -08:00
Doug Gregor
270be17bc0 [Type checker] Drop unused parameter from coercePatternToType(). 2020-02-24 00:48:15 -08:00
Doug Gregor
8fb05af641 [Constraint solver] Give Bool patterns Bool type. 2020-02-24 00:48:14 -08:00
Doug Gregor
232f20f58d [Constraint solver] Generate constraints for “is” patterns.
Generate a checked-cast constraint for an “is” pattern, which otherwise
doesn’t change the type. This is hard to validate because checked-cast
constraints never actually fail.
2020-02-24 00:48:14 -08:00
Doug Gregor
ee90374a8f [Constraint system] Finish an unfinished comment. 2020-02-24 00:48:14 -08:00
Doug Gregor
be8b9e5ef4 [Constraint solver] Always produce optional types for '?' patterns. 2020-02-24 00:48:14 -08:00
Doug Gregor
d2b2a50772 [Constraint system] Record application targets for statement conditions.
We’ll need this to generate constraints for statement conditions within the
constraint system. This is unused boilerplate at the moment.
2020-02-24 00:48:14 -08:00
Doug Gregor
d81161aa47 Merge pull request #29851 from DougGregor/remove-performance-hacks
[Constraint solver] Remove performance hacks for pattern type computation
2020-02-23 22:46:50 -10:00
swift-ci
dddcfb8348 Merge pull request #29984 from dan-zheng/TF-1168 2020-02-23 11:27:34 -08:00
Andrew Trick
8d5c73acc0 Merge pull request #30009 from atrick/fix-escape-miscompile
Fix EscapeAnalysis connection graph for existential values.
2020-02-22 15:08:12 -08:00
Saleem Abdulrasool
0626dc77bb Merge pull request #29993 from compnerd/conform-to-your-conformance
IRGen: correct the typecast (NFC)
2020-02-22 08:07:56 -08:00
Anthony Latsis
f45c338e38 [ASTPrinter] Fix duplicate «mutating» modifiers when printing file interface 2020-02-22 18:09:43 +03:00
Andrew Trick
601a51a605 Fix EscapeAnalysis connection graph for existential values.
Change the connection graph builder to map an existential address and
its opened address onto the same node.

Fixes <rdar://59559805> miscompile; use-after-free

Immediate bug: EscapeAnalysis::mayReleaseContent incorrectly returns
'false' when comparing a store into an existential's value with a
release of the existential.

How this was exposed: mayReleaseContent was made more aggressive so
that only the connection graph node representing the released object
is considered to be "released". This fails for existentials because a
separate connection graph node is created for the value within the
existential.

This is just one manifestation of a broader bug. Representing an
existential as two logically distinct objects could also result in
incorrect escaping information and incorrect alias analysis. Note that
copying directly into an existential address and storing into the
opened value in fact modify the same memory. Furthermore, when opening
an existential, no local reference count is used to keep the opened
value "alive" independent from the existential (this is another
assumption made by mayReleaseContent). This is always how existentials
were represented in the connection graph, but issues had never been
exposed.
2020-02-22 02:07:32 -08:00
Pavel Yaskevich
96297b7e39 [CSStep] Always attempt literal bindings in diagnostic mode
In case of contextual failures such bindings could produce
better solutions with fewer fixes.
2020-02-21 17:47:39 -08:00
Pavel Yaskevich
3e01160a2f [ConstraintSystem] Make it possible to infer subtype bindings through argument conversions
Enable solver to transitively infer bindings through argument conversion
constraints. That helps to infer bindings for (generic) parameters
from their arguments e.g.

```swift
func foo<T: ExpressibleByStringLiteral>(_: String, _: T) -> T {
  fatalError()
}

func bar(_: Any?) {}

func test() {
  bar(foo("", ""))
}
```

In this case `T` can currently only be inferred as `Any?`
(based on parameter type of `bar`) although a complete
set of bindings for that type variable includes `String`
as well, which comes from use of `T` in argument position.

Resolves: rdar://problem/56212087
2020-02-21 17:47:24 -08:00
Pavel Yaskevich
ed255596a6 [ConstraintSystem] Increase fix impact when get-only dynamic key path is used as a mutable one 2020-02-21 17:28:10 -08:00
Anthony Latsis
a11cc4fcfc Handle more built-in operators and error intersections with the unwrap collision diagnostic 2020-02-22 03:55:43 +03:00
Pavel Yaskevich
0a6b444b49 [ConstraintSystem] Diagnose argument conflicts only for "representative" generic parameters
Consider following example:

```swift
struct MyType<TyA, TyB> {
  var a : TyA, b : TyB
}

typealias B<T1> = MyType<T1, T1>

_ = B(a: "foo", b: 42)
```

Here `T1` is equal to `TyA` and `TyB` so diagnostic about
conflicting arguments ('String' vs. 'Int') should only be
produced for "representative" `T1`.
2020-02-21 16:49:37 -08:00
Jonathan Keller
e603183fb2 [SILOptimizer] fix overrelease in KeyPathProjector
Because parentValue is the result of a setter projection, it is uninitalized and should not be destroyed again (see 1feead8)
2020-02-21 15:34:18 -08:00
Jonathan Keller
620fba6a1f [SILOptimizer] fix KeyPathProjector memory management
I was inconsistently providing initialized or uninitialized memory
to the callback when projecting a settable address, depending on
component type. We should always provide an uninitialized address.
2020-02-21 15:34:17 -08:00
Jonathan Keller
4e77005204 [SILGen] fix key path setter access for @testable
emitKeyPathComponentForDecl was only checking if the setter was
accessible from the current module, not the current function.
This failed when accessing an internal setter from a module
imported for testing.
2020-02-21 15:34:17 -08:00
Jonathan Keller
d9976bd7fa [SILOptimizer] fix crash in key path projector
When a computed property returns a generic, the accessor's function
type may involve a type parameter that needs to be resolved using
the key path instruction's substitution map.
2020-02-21 15:34:17 -08:00
Jonathan Keller
b2ab82bb76 [SILOptimizer] address key path projection review feedback 2020-02-21 15:34:17 -08:00
Jonathan Keller
44d211fa17 [SILOptimizer] Generalize optimization of static keypaths
We have an optimization in SILCombiner that "inlines" the use of compile-time constant key paths by performing the property access directly instead of calling a runtime function (leading to huge performance gains e.g. for heavy use of @dynamicMemberLookup). However, this optimization previously only supported key paths which solely access stored properties, so computed properties, optional chaining, etc. still had to call a runtime function. This commit generalizes the optimization to support all types of key paths.
2020-02-21 15:34:17 -08:00
Holly Borla
9f09add09b Merge pull request #29966 from hborla/type-check-type-eraser-attribute
[Sema] Implement type checking for the `_typeEraser` attribute
2020-02-21 14:12:59 -08:00
Alexis Laferrière
7802d1755c Merge pull request #29639 from xymus/recover-in-getAllWitnessTables
[Serialization] Recover from a missing conforming type in a protocol conformance
2020-02-21 13:53:26 -08:00
Joe Groff
83668f9e4e Merge pull request #29946 from apple/revert-28799-master
Revert "[SILOptimizer] Generalize optimization of static keypaths"
2020-02-21 12:47:08 -08:00
Holly Borla
e93a6b9b51 [TypeCheckAttr] Allow a typealias to be a type eraser and add additional
typeEraser tests.
2020-02-21 12:12:27 -08:00
Arnold Schwaighofer
72d13a3483 Don't emit an outlined call to a noop function 2020-02-21 12:10:58 -08:00
Arnold Schwaighofer
0dd8974dc1 Add a flag to disable type layout based lowering 2020-02-21 12:10:58 -08:00
Arnold Schwaighofer
b7a58c0f96 IRGen: Optionally use value witness instead of outlined value functions
... if type layout based value witness emission is enabled.

rdar://51988441
2020-02-21 12:10:58 -08:00
Pavel Yaskevich
dec2ad0f93 Merge pull request #29979 from xedin/rdar-56400265
[ConstraintSystem] Avoid exploring too much search space when call ar…
2020-02-21 11:16:33 -08:00
Andrew Trick
8a892f21ef Merge pull request #29989 from atrick/fix-existential-generic
Disable ExistentialSpecializer on generic functions.
2020-02-21 10:39:52 -08:00
Alexis Laferrière
880b8663b9 [Serialization] Fix crash in reporting missing implementationOnly modules
The diagnostic function crashed as it did not take into account the
DebuggerSupport options as the site reporting the missing dependency did.
In this context, missing implementation-only imported dependencies are
ignored only if DebuggerSupport is set.
2020-02-21 10:25:18 -08:00
Alexis Laferrière
07ade1ddf0 [Serialization] Recover from a missing conforming type in a protocol conformance
We saw this failure with a Clang module imported @_implementationOnly
with synthesized conformances by the ClangImporter. It caused
issues only in sil-opt as it reads all the witness tables.

rdar://problem/58924131
2020-02-21 10:25:18 -08:00
Dan Zheng
697c722a5f [AutoDiff] Type-checking support for inout parameter differentiation. (#29959)
Semantically, an `inout` parameter is both a parameter and a result.

`@differentiable` and `@derivative` attributes now support original functions
with one "semantic result": either a formal result or an `inout` parameter.

Derivative typing rules for functions with `inout` parameters are now defined.

The differential/pullback type of a function with `inout` differentiability
parameters also has `inout` parameters. This is ideal for performance.

Differential typing rules:
- Case 1: original function has no `inout` parameters.
  - Original:     `(T0, T1, ...) -> R`
  - Differential: `(T0.Tan, T1.Tan, ...) -> R.Tan`
- Case 2: original function has a non-wrt `inout` parameter.
  - Original:     `(T0, inout T1, ...) -> Void`
  - Differential: `(T0.Tan, ...) -> T1.Tan`
- Case 3: original function has a wrt `inout` parameter.
  - Original:     `(T0, inout T1, ...) -> Void`
  - Differential: `(T0.Tan, inout T1.Tan, ...) -> Void`

Pullback typing rules:
- Case 1: original function has no `inout` parameters.
  - Original: `(T0, T1, ...) -> R`
  - Pullback: `R.Tan -> (T0.Tan, T1.Tan, ...)`
- Case 2: original function has a non-wrt `inout` parameter.
  - Original: `(T0, inout T1, ...) -> Void`
  - Pullback: `(T1.Tan) -> (T0.Tan, ...)`
- Case 3: original function has a wrt `inout` parameter.
  - Original: `(T0, inout T1, ...) -> Void`
  - Pullback: `(inout T1.Tan) -> (T0.Tan, ...)`

Resolves TF-1164.
2020-02-21 09:47:53 -08:00
Dan Zheng
1cefebe227 [AutoDiff] Fix @differentiable-related override matching crash. (#29985)
Remove meaningless `assert(false)` assertion from
`hasOverridingDifferentiableAttribute` in `TypeCheckDeclOverride.cpp`.

The assertion served no purpose and can safely be removed.

Resolves TF-1167. Add test.
2020-02-21 09:29:29 -08:00