Commit Graph

24822 Commits

Author SHA1 Message Date
Arnold Schwaighofer
8a4d61fb1d Remove FIXME in TypeExpansionAnalysis: It's cache needed to be keyed by the type expansion context 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
74d14785d5 Address review comment TypeBase::hasOpaqueArchetypePropertiesOrCases 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
8aaa7b4dc1 SILOptimizer: Pipe through TypeExpansionContext 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
9ecda0c574 SIL: Plumb TypeExpansionContext through SIL 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
e67b96139d SIL: Add getTypeExpansionContext to SILFunction 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
6b3e1b3987 SIL: Add TypeExpansion to SIL type lowering 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
8ec3a77e94 Add TypeExpansionContext to AST substitution functions
Also add hasOpaqueArchetypePropertiesOrCases() this function will be
needed by SIL type lowering to determine whether types containing opaque
archetype stored properties or cases should be considered as potentially
address types.
2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
f5fe7c1868 Add an API to map substitution map into a type expansion context. 2019-11-11 14:21:52 -08:00
Arnold Schwaighofer
d9a575ca4d Add TypeExpansionContext 2019-11-11 14:21:52 -08:00
swift-ci
c10a5f7cb1 Merge remote-tracking branch 'origin/master' into master-next 2019-11-11 14:10:53 -08:00
Gogul Balakrishnan
5accda22b2 [AutoDiff upstream] Introduce @differentiable attribute to mark functions as differentiable. (#27506)
This PR introduces `@differentiable` attribute to mark functions as differentiable. This PR only contains changes related to parsing the attribute. Type checking and other changes will be added in subsequent patches.

See https://github.com/apple/swift/pull/27506/files#diff-f3216f4188fd5ed34e1007e5a9c2490f for examples and tests for the new attribute.
2019-11-11 13:58:34 -08:00
Hamish Knight
01d5c00f9b [Sema] Requestify default arg type checking
This commit introduces a request to type-check a
default argument expression and splits
`getDefaultValue` into 2 accessors:

- `getStructuralDefaultExpr` which retrieves the
potentially un-type-checked default argument
expression.

- `getTypeCheckedDefaultExpr` which retrieves a
fully type-checked default argument expression.

In addition, this commit adds `hasDefaultExpr`,
which allows checking for a default expr without
kicking off a request.
2019-11-11 13:49:06 -08:00
Hamish Knight
7ae3d1f8d3 Requestify default initializer context creation
This commit adds a request that computes
the initializer context for a parameter with a
default expr or stored property default.

This avoids having to compute them for synthesized
decls and is a step towards requestifying default
argument parsing.
2019-11-11 13:49:06 -08:00
Hamish Knight
4d216c7052 [AST] Add swift::getParameterList 2019-11-11 13:49:05 -08:00
swift-ci
05aca13575 Merge remote-tracking branch 'origin/master' into master-next 2019-11-11 13:10:47 -08:00
Robert Widmann
cab4e9f011 Eagerly TypeCheck Synthesized Decls 2019-11-11 11:34:52 -08:00
Robert Widmann
2f2b8afad8 Remove the list of synthesized decls"
This used to be a lot more relevant a long time ago when typeCheckFunctionsAndExternalDecls actually did type check external functions defined in C.  Now, it serves no purpose.

The validation order change from just type checking these things eagerly doesn't seem to affect anything.
2019-11-11 11:33:59 -08:00
Holly Borla
212f20245a [ConstraintSystem] Add TypeBase::hasHole to be used by the constraint
system. Eventually, this will replace TypeBase::hasUnresolvedType.
2019-11-11 10:08:25 -08:00
Hamish Knight
eacca4ed0c Requestify circular inheritance checking
Add requests for checking whether a class,
protocol, or enum have circular references in
their inheritance lists.
2019-11-11 09:34:56 -08:00
Hamish Knight
9e77d31d6e NFC: Fix ClassDecl inline bitfield count 2019-11-11 09:34:55 -08:00
swift-ci
23d48be787 Merge remote-tracking branch 'origin/master' into master-next 2019-11-10 23:50:36 -08:00
Robert Widmann
5a1cae119e Merge pull request #28171 from CodaFi/one-one-ten-ded-consequences
Partially Revert #27862
2019-11-10 23:47:05 -08:00
Robert Widmann
dd1b15775d Partially Revert #27862
When SE-110 was being implemented, we accidentally began to accept
closure parameter declarations that had no associated parameter names,
e.g.

foo { ([Int]) in /**/ }

This syntax has never been sanctioned by any version of Swift and should
be banned.  However, the change was made long enough ago and there are
enough clients relying on this, that we cannot accept the source break
at the moment.  For now, add a bit to ParamDecl that marks a parameter
as destructured, and back out setting the invalid bit on the type repr
for these kinds of declarations.

To prevent further spread of this syntax, stub in a warning that offers
to insert an anonymous parameter.

Resolves part of rdar://56673657 and improves QoI for errors like
rdar://56911630
2019-11-10 22:10:53 -08:00
swift-ci
8ad621275f Merge remote-tracking branch 'origin/master' into master-next 2019-11-10 17:10:41 -08:00
Robert Widmann
301e042121 Add PreCheckFunctionBuilderRequest
Drop a cache out of the type checker.
2019-11-10 14:18:54 -08:00
swift-ci
68128384a3 Merge remote-tracking branch 'origin/master' into master-next 2019-11-08 13:30:07 -08:00
Owen Voorhees
caa6316257 Merge pull request #28052 from owenv/educational-notes
[Diagnostics] Introduce "Educational Notes" for diagnostics
2019-11-08 13:19:44 -08:00
swift-ci
0eaef36fa7 Merge remote-tracking branch 'origin/master' into master-next 2019-11-08 12:49:23 -08:00
Suyash Srijan
e33ed77d5d Merge pull request #28135 from theblixguy/fix/SR_5115
[MiscDiagnostics] Diagnose passing a non-@objc dynamic KeyPath property to KVO observe
2019-11-08 20:35:55 +00:00
Suyash Srijan
fab6ce9587 [MiscDiagnostics] Diagnose passing a non-@objc dynamic KeyPath property to KVO observe method 2019-11-08 18:52:43 +00:00
swift-ci
fd19bbe1d1 Merge remote-tracking branch 'origin/master' into master-next 2019-11-07 22:09:47 -08:00
Robert Widmann
110b76e3bd Merge pull request #28123 from AnthonyLatsis/whereclauseowner-cleanup
NFC: Clean up WhereClauseOwner
2019-11-07 21:50:16 -08:00
swift-ci
dd9ce7adfe Merge remote-tracking branch 'origin/master' into master-next 2019-11-07 18:31:15 -08:00
Ravi Kandhadai
957dc8e302 [Constant Evaluator] Make symbolic closures, which are representations
of closure literals in the constant evaluator, store the
substitution map that was in the constant evaluator state when
the closure creation site (partial_apply or thin_to_thick_function)
that created the symbolic closure was evaluated.

A substitution map is a mapping from generic type parameters to types.
This map is updated and maintained by the constant evaluator as it
evaluates function calls. At a partial-application site, the substitution
map captures the mapping from the types of the captured arguments (which
could be generic types) to the types of the symbolic value they represent
(which has to be concrete types). The substitution map would be necessary
to fold the symbolic closure into SIL code that constructs the closure
it represents.
2019-11-07 15:04:48 -08:00
Owen Voorhees
ac05a66938 [Diagnostics] Introduce "Educational Notes" for diagnostics
Educational notes are small pieces of documentation which explain a concept
relevant to some diagnostic message. If -enable-descriptive-diagnostics is
passed, they will be printed after a diagnostic message if available.

Educational notes can be found at /usr/share/doc/diagnostics in a
toolchain, and are associated with specific compiler diagnostics in
EducationalNotes.def.
2019-11-07 13:18:35 -08:00
swift-ci
8f128e0e19 Merge remote-tracking branch 'origin/master' into master-next 2019-11-07 12:49:07 -08:00
Anthony Latsis
bf91cf9a8e Clean up WhereClauseOwner 2019-11-07 21:26:31 +03:00
Hamish Knight
18088b04f0 [AST] Consolidate Obj-C types on ASTContext
This commit moves the getNSObjectType and
getObjCSelectorType methods from TypeChecker
onto ASTContext. In addition, it moves the
FOR_KNOWN_FOUNDATION_TYPES macro into a separate
file to define each of the Obj-C type decls
we want to have access to.
2019-11-07 08:26:08 -08:00
swift-ci
4e26c6ac10 Merge remote-tracking branch 'origin/master' into master-next 2019-11-06 16:49:27 -08:00
Andrew Trick
9931aab33b Merge pull request #28103 from atrick/cleanup-escapes
EscapeAnalysis cleanup and add utilities [nearly NFC]
2019-11-06 16:48:22 -08:00
Andrew Trick
13b7f454f9 EscapeAnalysis: remove unused pointsToEnd utility, for now. 2019-11-06 15:15:39 -08:00
swift-ci
c7902f9d7a Merge remote-tracking branch 'origin/master' into master-next 2019-11-06 15:09:56 -08:00
swift-ci
d25907128a Merge pull request #28114 from ravikandhadai/constexpr-aggregate-types 2019-11-06 14:49:55 -08:00
Ravi Kandhadai
48bc63bb8a [Constant Evaluator] Add support for tracking types with aggregate
symbolic values, which are used to represent constant struct and tuple
instances. Associating those symbolic values with the types of the
aggregate they are representing will allow writing some sanity checks,
and will also make constant folding of the symbolic values easier and
more robust.
2019-11-06 12:47:42 -08:00
swift-ci
547a215b1e Merge remote-tracking branch 'origin/master' into master-next 2019-11-06 12:29:17 -08:00
David Ungar
5ee492834d Merge pull request #28075 from davidungar/rdar-54906120-health-bug
[NameLookup, ASTScope] Eagerly expand function bodies before type-checking them
2019-11-06 12:21:09 -08:00
swift-ci
e64776d49e Merge remote-tracking branch 'origin/master' into master-next 2019-11-06 11:49:25 -08:00
Michael Gottesman
3a4c4d09e2 Merge pull request #28100 from gottesmm/pr-b169c1785bc8360aa9d4661c79b7061aec94e6a5
[semantics] Add support for annotating VarDecls with @_semantics.
2019-11-06 11:32:43 -08:00
Dan Zheng
53e61a9587 [AutoDiff upstream] Add the _Differentiation module. (#27511)
The `_Differentiation` module is the experimental support library for
differentiable programming. It is built when the build-script flag
`--enable-experimental-differentiable-programming` is enabled.

The `Differentiable` protocol generalizes all types that work with
differentiation. It is a core piece of the differentiable programming
project. Other parts depending on the `Differentiable` protocol will
be upstreamed piece by piece.

The `Differentiable` protocol is compiler-known and will be used during
type-checking, SILGen, and the SIL differentiation transform.
2019-11-06 11:31:12 -08:00
Andrew Trick
f009cf3de8 EscapeAnalysis cleanup and add utilities [nearly NFC]
This is the first in a series of patches that reworks
EscapeAnalysis. For this patch, I extracted every change that does not
introduce new features, rewrite logic, or appear to change
functionality.

These cleanups were done in preparation for:

- adding a graph representation for reference counted objects

- rewriting parts to the query logic

- ...which then allows the analysis to safely assume that all
  exclusive arguments are unique

- ...which then allows more aggressive optimization of local variables
  that don't escape

There are two possible functional changes:

1. getUnderlyingAddressRoot in InstructionUtils now sees through OSSA
instructions: begin_borrow and copy_value

2. The getPointerBase helper in EscapeAnalysis now sees through all of
these reference and pointer casts:

+  case ValueKind::UncheckedRefCastInst:
+  case ValueKind::ConvertFunctionInst:
+  case ValueKind::UpcastInst:
+  case ValueKind::InitExistentialRefInst:
+  case ValueKind::OpenExistentialRefInst:
+  case ValueKind::RawPointerToRefInst:
+  case ValueKind::RefToRawPointerInst:
+  case ValueKind::RefToBridgeObjectInst:
+  case ValueKind::BridgeObjectToRefInst:
+  case ValueKind::UncheckedAddrCastInst:
+  case ValueKind::UnconditionalCheckedCastInst:
+  case ValueKind::RefTo##Name##Inst:
+  case ValueKind::Name##ToRefInst:

This coalesces a whole bunch of nodes together that were just there
because of casts. The existing code was already doing this for one
level of casts, but there was a bug that prevented it from happening
transitively. So, in theory, anything that breaks with this fix could
also break without this fix, but may not have been exposed. The fact
that this analysis coalesces address-to-reference casts at all is what
caused me to spent vast amounts of time debugging any time I tried to
force some structure on the graph via assertions. If it is done at
all, it should be done everywhere consistently to expose issues as
early as possible.

Here is a description of the changes in diff order. If something in
the diff is not listed here, then the code probably just moved around
in the file:

Rename isNotAliasedIndirectParameter to
isExclusiveIndirectParameter. The argument may be aliased in the
caller's scope and it's contents may have already escaped.

Add comments to SILType APIs (isTrivial, isReferenceCounted) that give
answers about the AST type which don't really make sense for address
SILTypes.

Add comments about CGNode's 'Value' field. I spent lots of time
attempting to tighten this down with asserts, but it's only possible
for non-content nodes. For content nodes, the node's value is highly
unpredictable and basically nonsense but needed for debugging.

Add comments about not assuming that the content nodes pointsTo edge
represents physical indirection. This matters when reasoning about
aliasing and it's a tempting assumption to make.

Add a CGNode::mergeProperties placeholder for adding node properties.

Factor out a CGNode::canAddDeferred helper for use later.

Rename `setPointsTo` to `setPointsToEdge` because it actually creates
an edge rather than just setting `pointsTo`.

Add CGNode::getValue() and related helpers to help maintain invariants.

Factor out a `markEscaping` helper.

Clean up the `escapesInsideFunction` helper.

Add node visitor helpers: visitSuccessors, visitDefers. This made is
much easier to prototype utilities.

Add comments to clarify the `pointsTo` invariant. In particular, an
entire defer web may have a null pointsTo for a while.

Add an `activeWorklist` to avoid nasty bugs when composing multiple
helpers that each use the worklist.

Remove the `EA` argument from `getNode`. I ended up needing access to
the `EA` context from the ConnectionGraph many times during
prototyping and passing `this` was all the `getNode` calls was very
silly.

Add graph visitor helpers: backwardTraverse, forwardTraverseDefer,
forwardTraversePointsToEdges, and mayReach for ease in developing new
logic and utilities.

Add isExclusiveArgument helper and distinguish exclusive arguments
from local objects. Confusing these properties could lead to scary
bugs. For example, unlike a local object, an exclusive argument's
contents may still escape even when the content's connection graph
node is non-escaping!

Add isUniquelyIdentified helper when we want to treat exclusive
arguments and local objects uniformly.

getUnderlyingAddressRoot now looks through OSSA instructions.

Rename `getAccessedMemory` to `getDirectlyAccessedMemory` with
comments. This is another dangerous API because it assumes the memory
access to a given address won't touch memory represented by different
graph nodes, but graph edges don't necessarily represent physical
indirection. Further clarify this issue in comments in
AliasAnalysis.cpp.

Factor out a 'findRecursiveRefType' helper from the old
'mayContainReference' for checking whether types may or must contain
references. Support both kinds of queries so the analysis can be
certain when a pointer's content is a physical heap object.

Factor out 'getPointerBase' and 'getPointerRoot' helpers that follow
address projections within what EscapeAnalysis will consider a single
node.

Create a CGNodeWorklist abstraction to safely formalize the worklist
mechanism that's used all over the place. In one place, there were
even two separate independent lists used independently (nodes added to
one list could appear to be in the other list).

The CGNodeMap abstraction did not significantly change, it was just moved.

Added 'dumpCG' for dumping .dot files making it possible to remote debug.

Added '-escapes-enable-graphwriter' option to dump .dot files, since
they are so much more useful than the textual dump of the connection
graph, which lacks node identity!
2019-11-06 11:07:52 -08:00