Commit Graph

171 Commits

Author SHA1 Message Date
Doug Gregor
6c9394a2b5 [GSB] Always build "via protocol requirements" sources through floating sources.
The use of floating sources allows us to carry through the protocol
information (i.e., "in which protocol do we look for this
information?") without immediately forming a new
RequirementSource. Yet more NFC refactoring for protocol-requirement
sources to carry more pertinent information.
2017-03-06 10:11:18 -08:00
Doug Gregor
2aa2d3ea4d [GSB] Teach the addRequirement(RequirementRepr*) to use a floating source.
NFC cleanup for now, which is staging for a change to provide more
information for "abstract protocol requirement" path elements.
2017-03-06 10:11:18 -08:00
Hugh Bellamy
33f5f89912 Update unreachable control path annotations 2017-03-03 20:21:49 +07:00
Slava Pestov
822b7f650f Re-apply "AST: Fix excessive deserialization in GenericSignatureBuilder"
This got reverted because it made our non-deterministic deserialization
crasher come up more often. Re-applying this patch to test the theory
that @jrose-apple's fix addressed the issue.
2017-03-01 18:14:12 -08:00
Doug Gregor
d1627dcc83 [GSB] Check superclass constraints against concrete constraints.
Centralize the checking of a superclass constraint against a
same-type-to-concrete constraint. Additionally, produce a warning if
the superclass constraint is satisfied but is made redundant by an
existing same-type constraint.
2017-02-28 16:39:58 -08:00
Doug Gregor
cdb38c1e97 [GSB] Check all superclass constraints during finalization.
Use the same infrastructure we have for same-type-to-concrete
constraints to check superclass constraints. Specifically,

* Track all superclass constraints; never "update" a requirement source
* Remove self-derived superclass constraints
* Pick the best superclass constraint within each connected component
  of an equivalence class and use that for requirement generation.
* Diagnose conflicting superclass requirements during finalization
* Diagnose redundant superclass requirements (during finalization)
2017-02-28 16:14:30 -08:00
Doug Gregor
a97fa06744 [GSB] Factor out the checking of of the concrete-type constraints.
This checking will also be used for other kinds of constraints (e.g.,
superclass constraints), so factor it out in advance.
2017-02-28 14:52:51 -08:00
Doug Gregor
5ec385797f [GSB] Remove self-derived same-type-to-concrete constraints.
Introduce an operation on RequirementSource to determine whether a
constraint with such a source, when it lands on a given potential
archetype, is "self-derived": e.g., the final constraint is derived
from the original constraint. Remove such constraints from the system
during finalization, because otherwise they would make the original
constraint redundant.

Fixes rdar://problem/30478915, although we still need to apply this
same logic to other kinds of constraints in the system.
2017-02-28 09:47:30 -08:00
Doug Gregor
c2da97172b [GSB] Store the root potential archetype in RequirementSource.
Use TrailingObjects to help us efficiently store the root potential
archetype within requirement sources, so we can reconstruct the
complete path from the point where a requirement was created to the
potential archetype it affects.

The test changes are because we are now dumping the root potential
archetype as part of -debug-generic-signatures.
2017-02-28 09:47:11 -08:00
Doug Gregor
2d430d8324 [GSB] Always pass a root potential archetype to a requirement source.
Whenever we create a (root) requirement source, associate it with the
potential archetype on which the requirement is written. This lets us
follow a requirement source from the (stated or implied) requirement on
the root potential archetype to the effective requirement on the
resulting potential archetype.

Introduce FloatingRequirementSource for the cases where we need to
state what the root source is, but don't yet have a potential
archetype to attach it to. These get internally resolved to
RequirementSources as soon as possible.
2017-02-28 09:47:02 -08:00
Doug Gregor
dbf5782d56 [GSB] Provide a root potential archetype for requirement-signature sources. 2017-02-28 09:42:06 -08:00
Doug Gregor
f7bc907d23 [GSB] Provide a root potential archetype for nested-type-name-match sources. 2017-02-28 09:41:52 -08:00
Doug Gregor
40a813bc8d [GenericSigBuilder] Sink RequirementSource into GenericSignatureBuilder. 2017-02-28 09:41:23 -08:00
Doug Gregor
6adeb2db5d [GenericSigBuilder] Track associated type declarations in RequirementSource. 2017-02-28 09:37:06 -08:00
Doug Gregor
5c2fe3496f Merge pull request #7740 from huonw/parse-assoc-type-where
(Mostly) Type-check where clauses on associated types
2017-02-27 22:06:51 -08:00
Doug Gregor
9d9cfe280b [AST/Sema] Eliminate a few unused 'depth' local variables. 2017-02-27 14:40:32 -08:00
Doug Gregor
00efc8b93a [GenericSigBuilder] Remove unused min/max depth for inference.
We know the depth from the generic signature.
2017-02-27 11:21:08 -08:00
Doug Gregor
0c0de0adf4 [AST] Move storage of same-type-to-concrete constraints to EquivalenceClass.
Most clients that will be considering same-type-to-concrete
constraints will need to look at all of the constraints within the
equivalence class together. Store the same-type-to-concrete
constraints on the EquivalenceClass itself, which fits this use case
better, and should reduce the storage requirements by making potential
archetypes two pointers smaller. NFC
2017-02-27 10:26:47 -08:00
practicalswift
99ceb78c7d Merge pull request #7723 from practicalswift/gardening-20170223
[gardening] Shell fixes. Consistent headers. a-vs-an typos. Python fixes. Unused variables and methods.
2017-02-27 14:05:05 +01:00
Huon Wilson
d9441a04ed [GenericSignatureBuilder] Consume where clauses on associated types. 2017-02-24 19:24:14 -08:00
swift-ci
41c6247b26 Merge pull request #7755 from DougGregor/all-same-type-to-concrete 2017-02-24 16:39:12 -08:00
Doug Gregor
29256e526c [GenericSigBuilder] Track all same-type-to-concrete constraints.
When we see a second same-type-to-concrete constraint on a particular
potential archetype, record it. Previously, we were checking it and
then updating the requirement source eagerly. That won't work with
proper recursion detection, and meant that we missed out on some
obvious redundant-same-type-constraint diagnostics.

The scheme here is to build up the equivalence classes without losing
any information, and then determine which information is redundant at
the end.
2017-02-24 15:43:17 -08:00
Doug Gregor
6492cc301c [GenericSigBuilder] Eliminate some redundancy in same-type-to-concrete checking. 2017-02-24 14:54:02 -08:00
Doug Gregor
ba81b66f26 [GenericSigBuilder] Migrate the concrete type into to EquivalenceClass. 2017-02-24 14:47:59 -08:00
Doug Gregor
04ba576e3f [GenericSig Builder] Introduce an equivalence-class abstraction.
Introduce an equivalence-class abstraction that captures all of the
members of the equivalence class in a separate type that will maintain
the "truth" about the meaning of the equivalence class, rather than
having that information distributed amongst the potential archetypes
within the class.

For now, use it to capture the members of the equivalence classes, so
we have one SmallVector per equivalence class rather than N
SmallVectors.
2017-02-24 14:25:03 -08:00
swift-ci
fc0b3dd570 Merge pull request #7747 from DougGregor/same-type-to-concrete-redundancy 2017-02-24 11:51:08 -08:00
Doug Gregor
d697c2fdcb [GenericSig Builder] Diagnose redundant same-typeo-t-concrete constraints.
Diagnose when a same-type constraint (to a concrete type) is made
redundant by another same-type constraint. Slightly improve the
diagnostic that handles collisions between two same-type constraints.
2017-02-24 10:44:30 -08:00
practicalswift
21ebc5bff3 [gardening] Remove unused method isOuterArchetype(...) 2017-02-24 09:38:00 +01:00
practicalswift
d352652a72 Merge pull request #7727 from practicalswift/typos-20170223
[gardening] Fix typos
2017-02-24 09:15:12 +01:00
Doug Gregor
5245ecacf0 Teach RequirementSource::dump() to print a newline.
Helpful when debugging so the output doesn't get buffered.
2017-02-23 21:54:32 -08:00
practicalswift
33a5601ad1 [gardening] Fix typos 2017-02-23 22:46:40 +01:00
Doug Gregor
cbbf415435 [GenericSigBuilder] Archetypes no longer make it to this path. NFC 2017-02-23 13:43:18 -08:00
Doug Gregor
e71788d7a6 [GenericSigBuilder] Conformances due to concrete types can be abstract.
When a type parameter is made concrete via an existential type,
conformance requirements on that type parameter will be
abstract. Fixes rdar://problem/30610428.
2017-02-23 13:41:08 -08:00
swift-ci
f1231a4c49 Merge pull request #7518 from DougGregor/concrete-archetype-anchors 2017-02-22 17:55:26 -08:00
Doug Gregor
121e1aa13c [Generic signature builder] Eliminate hack that performs an extra walk of potential archetypes. 2017-02-22 16:47:03 -08:00
Doug Gregor
10fc3fa546 [GenericSig Builder] Make resolve() less representative-dependent.
`GenericSignatureBuilder::resolve()` was always jumping to the
representative, to treat typealias representatives as
special. However, doing this means that we put the same-type
constraint on the wrong potential archetype (with the wrong source).

Eliminate the use of `getRepresentative()`. This unfortunately
causes us to need recursive resolution, because we can't always depend
on jumping to the representative to avoid it.
2017-02-21 22:19:19 -08:00
Doug Gregor
23f3ba53f8 [GenericSig Builder] Track and canonicalize same-type-to-concrete constraints.
Track each same-type-to-concrete constraint on the potential archetype
against which it was written, and ensure that the requirement sources
for such same-type constraints stay with the potential archetypes on
which they were described. This is similar to the way we track
same-type constraints among potential archetypes.

Use this information to canonicalize same-type-to-concrete constraints
appropriately. For each connected component within an equivalence
class of potential archetypes, select the best requirement source to
the concrete type, or substitute in an abstract requirement source if
none exists. This approach ensures that components that would be
equivalent to that concrete type anyway get a derived source, while
components that get the concrete-type equivalence by being tied to
another

To get here, we also needed to change the notion of the archetype
anchor so that potential archetypes with no same-type constraints
directly in their path are preferred over potential archetypes that do
have a same-type constraint in their path. Otherwise, the anchor might
be something that is always concrete and is, therefore, not terribly
interesting.

Fixes the new case that popped up in rdar://problem/30478915.
2017-02-21 22:19:18 -08:00
Doug Gregor
e7a4fbc98b Revert "[Generic signature builder] Align the representative with the archetype anchor."
This reverts commit 0df3adb7a3.
2017-02-21 13:41:26 -08:00
Doug Gregor
ad459542a1 Revert "[Generic signature builder] Eliminate "concrete type in path" checks."
This reverts commit 58f181a470.
2017-02-21 13:41:26 -08:00
Huon Wilson
d671a6527b [Generic signature builder] paper over problems with generic typealiases in protocols.
Generic typealiases are entirely broken as archetypes, but some things
mostly worked with them before introducing ResolvedType, so let's
restore that behaviour.
2017-02-20 11:48:07 -08:00
Huon Wilson
d514e01c06 [Generic signature builder] diagnose typealiases with the same name and different types.
At the moment, these are only done on demand, when the typealias is
actually used somewhere, because there's currently a recursive
validation loop that stops doing it more eagerly from working in many
cases.
2017-02-20 11:48:07 -08:00
Huon Wilson
f64ef03235 [Generic signature builder] resolve types deeper in same type requirements.
This adds the concept of an "unresolved type" and a "resolved type",
where the latter involves stripping away any typealias archetype layers
from the former, to get to the "true" potential archetype or concrete
type that something refers to.
2017-02-20 11:48:06 -08:00
Doug Gregor
2a4c8dc581 Merge pull request #7581 from DougGregor/generic-sig-builder-inheritance-cleanup
[GenericSigBuilder] Clean up handling of "inheritance" clauses.
2017-02-17 21:28:40 -08:00
Doug Gregor
d017fe3ab4 [GenericSigBuilder] Clean up handling of "inheritance" clauses.
Unify the handling of the "inheritance" clauses of a generic type
parameter, associated type, or protocol, walking them in a
TypeRepr-preserving manner and adding requirements as they are
discovered. This sets the stage for providing better source-location
information [*].

This eliminates a redundant-but-different code path for protocol
"inheritance" clauses, which was using
ProtocolDecl::getInheritedProtocols() rather than looking at the
actual TypeReprs, and unifies the logic with that of associated types
and type parameters. This eliminates a near-DRY violation, sets us up
for simplifying the "inherited protocols" part of ProtocolDecl, and
sets us up better for the soon-to-be-proposed

  class C { }
  protocol P: C { }

[*] We still drop it, but now we have a FIXME!
2017-02-17 17:39:10 -08:00
Doug Gregor
fa21e00570 Merge pull request #7578 from DougGregor/generic-sig-builder-cleanups
Generic signature builder cleanups
2017-02-17 16:28:03 -08:00
Doug Gregor
ef4c8840e9 [GenericSigBuilder] Use addRequirement() rather than hardcoding it. DRY 2017-02-17 15:49:00 -08:00
Slava Pestov
36b2927b2c Merge pull request #7563 from slavapestov/protocol-typealias-wrong-self
AST: Fix GenericSignatureBuilder bug with protocol typealiases
2017-02-17 15:49:00 -08:00
Doug Gregor
28987ca21e [GenericSigBuilder] Remove some dead code; we don't deal with ArchetypeTypes. 2017-02-17 15:41:39 -08:00
Slava Pestov
cd893ea84a AST: Fix GenericSignatureBuilder bug with protocol typealiases
If a nested type of a generic parameter was a typealias, and the
generic parameter was not at depth 0, index 0, we would resolve
the type down to the wrong PotentialArchetype, causing bogus
diagnostics and crashes.

Make sure we apply a substitution to the typealias's underlying
type before resolving it, to map it to the correct PotentialArchetype.

Note that the original test case in the radar works now, but the more
comprehensive test I added exposes an existing problem where generic
signature canonicalization is not idempotent. When this is fixed,
the RUN: line in the test can be changed from -typecheck to -emit-ir.

Fixes <rdar://problem/30248571>.
2017-02-17 14:53:18 -08:00
Doug Gregor
da39d9b17b [GenericSig Builder] Rework RequirementSource to describe requirement path.
Reimplement the RequirementSource class, which captures how
a particular requirement is satisfied by a generic signature. The
primary goal of this rework is to keep the complete path one follows
in a generic signature to get from some explicit requirement in the
generic signature to some derived requirement or type, e.g.,

1) Start at an explicit requirement "C: Collection"
2) Go to the inherited protocol Sequence,
3) Get the "Iterator" associated type
4) Get its conformance to "IteratorProtocol"
5) Get the "Element" associated type

We don't currently capture all of the information we want in the path,
but the basic structure is there, and should also allow us to capture
more source-location information, find the "optimal" path, etc. There are
are a number of potential uses:

* IRGen could eventually use this to dig out the witness tables and
  type metadata it needs, instead of using its own fulfillment
  strategy
* SubstitutionMap could use this to lookup conformances, rather than
  it's egregious hacks
* The canonical generic signature builder could use this to lookup
  conformances as needed, e.g., for the recursive-conformances case.

... and probably more simplifications, once we get this right.
2017-02-17 13:50:51 -08:00