Commit Graph

987 Commits

Author SHA1 Message Date
Slava Pestov
fd40597d90 Sema: Extend prohibition of @_inlineable designated initializers to classes
This check only applied to struct and enum initializers previously,
but that was an oversight.
2017-02-14 15:48:26 -08:00
Slava Pestov
f0ecd1c1a3 Sema: Lift unnecessary restriction on initializers defined in extensions of resilient protocols
The restriction only applies to initializers in extensions of
concrete types; protocol extension initializers are OK.

Fixes <rdar://problem/30351393>.
2017-02-13 00:24:13 -08:00
Jordan Rose
df63c36b72 When setting a willSet/didSet param's type, also set the TypeLoc (#7377)
We don't actually need the TypeLoc for anything, but it was still
getting type-checked, which means it doesn't get the benefit of
inference from the initial value. In some cases the actual type of the
ParamDecl seems to get reset to the TypeLoc's type as well. Just do
the simple thing and set it directly ahead of time.

Fixes a source compatibility issue with Swift 3.0.

https://bugs.swift.org/browse/SR-3893
2017-02-09 19:15:21 -08:00
Huon Wilson
b5f6577fb6 [AST] Delete unnecessary generic environment use in ArchetypeBuilder.
The requirement signature covers this functionality, when it matters.
2017-02-09 13:22:36 -08:00
Joe Groff
7b9015dcd3 Merge pull request #7345 from jckarter/raw-rep-synthesized-conformance
Sema: Treat the implicit RawRepresentable conformance for enums as `Synthesized` again.
2017-02-09 07:10:13 -08:00
Slava Pestov
707083d22f Sema: Fix crash when defining an extension of a nested type with constraints
If the nested type itself has generic constraints, we would
hit an assertion in requirement inference. Refactor some code
so that we can make the assertion more accurate.

Fixes <rdar://problem/30353095>.
2017-02-08 21:51:19 -08:00
Joe Groff
6d9a40f455 Sema: Treat the implicit RawRepresentable conformance for enums as Synthesized again.
This reverts part of #4038 which made the compiler consider it to be an `Explicit` conformance, breaking source code that was accepted in Swift 3.0 which declared a raw type as well as explicit conformance to `RawRepresentable` (reported as rdar://problem/30386658). While I'm here, a couple of spot fixes:

- Ensure an enum's raw value exprs are type-checked before checking conformances of any of its extensions, since the RawRepresentable conformance derivation will blow up if the raw value exprs haven't been checked. Fixes an order dependency issue if `extension Foo: RawRepresentable {}` gets checked before `enum Foo: Int { ... }`.
- Don't display the custom `enum_declares_rawrep_with_raw_type` diagnostic if the source location for the enum's inheritance clause is invalid, so that we don't emit a dislocated diagnostic.
2017-02-08 15:31:17 -08:00
Jacob Bandes-Storch
c98e515734 [QoI] Improvements to function call & closure diagnostics (#7224) 2017-02-07 17:36:11 -08:00
Rintaro Ishizaki
3d6da635d3 [TypeChecker] Early diagnose and remove 'final' in non-class context (#7179)
This prevents error dignostics at '<unknown>:0' caused by sythesized
accessors.
2017-02-07 12:30:06 +09:00
swift-ci
5d2a18560c Merge pull request #7197 from rintaro/diagverify-unknown 2017-02-06 17:47:04 -08:00
Doug Gregor
fee89fe7c8 Merge pull request #7266 from DougGregor/generic-signature-create-env
Introduce `GenericSignature::createGenericEnvironment()`
2017-02-06 16:24:47 -08:00
Jordan Rose
1c8caeb689 Handle implicit member references inside extensions of nested types. (#7241)
Within an extension, references to other members of the extended type
are permitted without qualification. This is intended to work even
when the extended type was a nested type, although members of the
enclosing type are /not/ visible in this case. In order to implement
this, the type checker pre-checks to see if there are /any/ members
with this name and then rewrites the unqualified reference to a
qualified one, based on an unresolved TypeExpr with the name of the
enclosing type. Unfortunately, if the enclosing type is a nested type,
that isn't going to work very well---we find the correct declaration,
but fail to map it into context by virtue of not realizing where it
came from. Fix this by explicitly checking for this case.

https://bugs.swift.org/browse/SR-3847
2017-02-06 14:49:49 -08:00
Doug Gregor
faf659d16b [Archetype builder] Make sure the archetype builder is always "finalized".
ArchetypeBuilder::finalize() is needed to tie up any loose ends before
requesting a generic signature or generic environment. Make sure it
gets called consistently.
2017-02-05 21:23:44 -08:00
Doug Gregor
ded7e83aab [Archetype builder] Make canonicalization of dependent types deterministic.
The canonicalization of dependent member types had some
nondeterminism. The root of the problem was that we couldn't
round-trip dependent member types through the archetype
builder---resolving them to a potential archetype lost the specific
associated type that was recorded in the dependent member type, which
affected canonicalization. Maintain that information, make sure that
we always get the right archetype anchor, and tighten up the
canonicalization logic within a generic signature.

Fixes rdar://problem/30274260 and should unblock some other work
that depends on sanity from the archetype builder and generic
signature canonicalization.
2017-02-02 21:25:29 -08:00
Jacob Bandes-Storch
3e7e923e6d [Parse] Reject trailing closures on literals (#7202)
`1 { }` was parsed as a call expression with a trailing closure. This made the diagnostics for `var x = 1 { get { ... } }` extremely bad. Resolves SR-3671.
2017-02-02 10:32:47 -08:00
Rintaro Ishizaki
384ab780e9 [Diagnostic verifier] Make '<unknown>' check optional
Added frontend option '-verify-ignore-unknown'
2017-02-02 10:49:32 +09:00
Rintaro Ishizaki
827c6e7c3d [Diagnostic verifier] Diagnostics at '<unknown>:0' are unexpected 2017-02-02 10:48:54 +09:00
Doug Gregor
f7f703ad04 [Archetype builder] Canonicalize and minimize same-type constraints.
Introduce an algorithm to canonicalize and minimize same-type
constraints. The algorithm itself computes the equivalence classes
that would exist if all explicitly-provided same-type constraints are
ignored, and then forms a minimal, canonical set of explicit same-type
constraints to reform the actual equivalence class known to the type
checker. This should eliminate a number of problems we've seen with
inconsistently-chosen same-type constraints affecting
canonicalization.
2017-02-01 10:51:02 -08:00
Slava Pestov
71cf245701 Merge pull request #7023 from KingOfBrian/bugfix/SR-2115
Generate unused variable warnings in top level statements
2017-01-29 20:25:46 -08:00
Brian King
0c57aebfea Fix unit tests 2017-01-26 10:04:41 -05:00
Brian King
edc193efa0 Fix warnings in top level statements 2017-01-24 22:53:21 -05:00
Slava Pestov
4148079a9e Sema: Change diagnostics to not talk about 'materializable' types
This is not a term we want users to have to care about.
2017-01-23 23:54:50 -08:00
Slava Pestov
0c294314d0 Sema: Diagnose invalid initializers on resilient types
Value type initializers must initialize stored properties directly
if they do not delegate to another initializer via self.init().

Since direct stored property access is not permitted for resilient
value types from outside their resilience domain, this means that
such initializers are prohibited in two cases:

- If the initializer is defined in an extension from outside the
  value type's resilience domain

- If the initializer is public and @_inlineable, since it might get
  inlined outside the value type's resilience domain

Right now, such initializers cannot *assign* to self either;
I filed <https://bugs.swift.org/browse/SR-3686> to track the issue.
2017-01-20 01:22:51 -08:00
Jordan Rose
d79fc62394 Don't try to infer @objc for non-getter/setter accessors (#6926)
These are never part of an @objc protocol, so we shouldn't bother
looking for them and certainly shouldn't expect them to be there.
Fixes a crash introduced in 1f2121377.

rdar://problem/30101703
2017-01-19 19:28:04 -08:00
Slava Pestov
0926773c69 Sema: Teach getReferencedAssociatedTypes() to look through typealiases
Now that NameAliasTypes desugar to interface types, it is possible
to have a protocol requirement type contain a NameAliasType which
contains an associated type:

protocol P {
  associatedtype Element
  typealias Elements = [Element]

  func process(elements: Elements)
}

In Swift 3, the typealias would be desugared at name lookup time
in this case, but this is no longer the case, as a result associated
type inference stopped working in this example.

Fixes <https://bugs.swift.org/browse/SR-3641>.
2017-01-19 14:39:03 -08:00
Jordan Rose
29b59342f8 Merge pull request #6346 from KingOfBrian/bugfix/SR-584
Warn if a non dynamic class declaration is overridden in an extension
2017-01-17 13:47:42 -08:00
Brian King
2e1264f245 Add a compatibily test for swift 3 2017-01-15 17:05:01 -05:00
Brian King
f7a7ee941a Warn if a non dynamic class declaration is overridden in an extension 2017-01-15 17:05:01 -05:00
Slava Pestov
48ef1ad00d Merge pull request #5721 from rintaro/parse-functy
[Parse] Minor code improvement in function-type parsing
2017-01-12 19:22:34 -08:00
Doug Gregor
a232b41f87 [Archetype builder] Use archetype anchors exclusively in requirements.
When enumerating requirements, always use the archetype anchors to
express requirements. Unlike "representatives", which are simply there
to maintain the union-find data structure used to track equivalence
classes of potential archetypes, archetype anchors are the
ABI-stable canonical types within a fully-formed generic signature.

The test case churn comes from two places. First, while
representatives are *often* the same as the archetype anchors, they
aren't *always* the same. Where they differ, we'll see a change in
both the printed generic signature and, therefore, it's
mangling.

Additionally, requirement inference now takes much greater
care to make sure that the first types in the requirement follow
archetype anchor ordering, so actual conformance requirements occur in
the requirement list at the archetype anchor---not at the first type
that is equivalent to the anchor---which permits the simplification in
IRGen's emission of polymorphic arguments.
2017-01-12 11:07:05 -08:00
Slava Pestov
be0e2d77cf Merge pull request #6245 from KingOfBrian/bugfix/SR-3401
Remove the `mutating` fixit for getter subscript
2017-01-10 22:55:49 -08:00
Jordan Rose
1f2121377e Infer selectors from protocols for property accessors too. (#6634)
Most property accessors have selectors matching their protocols, but
not all. Don't force the user to write '@objc' explicitly on an
accessor, which isn't even possible for stored properties.

More groundwork for rdar://problem/28543037.
2017-01-10 13:36:45 -08:00
Slava Pestov
e0ed4a1e97 Sema: Diagnose types nested inside closures in generic context
Neither of the following is supported:

func g<T>(_: T) {
  _ = {
    struct S {}
  }
}

struct G<T> {
  let fn = {
    struct S {}
  }
}

Even though nested generic types are supported, the second example
is more like a type inside a function than a type inside a type,
because 'S' has no parent type.

Technically this is source-breaking but since neither SILGen nor
IRGen knew how to generate code for these I doubt anything worked.
2017-01-09 16:46:31 -08:00
Slava Pestov
41dde88778 Sema: Allow unqualified type lookup to find typealiases in protocols
Not really specific to typealiases; but we don't allow nominal types
to be nested inside protocols yet, and all other types of protocol
members have witnesses in the concrete type.

Fixes <https://bugs.swift.org/browse/SR-2792>.
2017-01-04 01:40:20 -08:00
Slava Pestov
43ce2e7e1c AST: Simplify DeclContext::getGeneric{Signature,Environment}OfContext()
There's no need to walk up from a function or type context -- if
no generic signature (or environment) is set, the parent won't have
one, either, and if we're in the middle of validating the child
context, using the parent's signature or environment to resolve
dependent types is just wrong.
2017-01-04 01:08:28 -08:00
Slava Pestov
2eeb8f528e AST: Fix crash when type nested inside generic function conforms to a protocol
If one of the associated types is witnessed by a generic parameter
from the function's scope, make sure it maps down to an ErrorType
instead of leaving it as a type parameter, which triggers an
assertion.

Eventually we'll plumb it through properly.
2017-01-04 00:10:29 -08:00
Slava Pestov
af934f2c9d Sema: Allow local types to conform to protocols with associated types
We would falsely diagnose the occurrence of the protocol
_in the inheritance clause_ as a "bad" usage of an
existential type, because the UnsupportedProtocolVisitor
was too eager in walking into nested Decls and Stmts.

Note that in one case we don't emit a diagnostic where we
did before, but this doesn't matter; the VarDecl in
question becomes invalid later, and only the order in
which the decls are visited changes.
2017-01-04 00:10:29 -08:00
Slava Pestov
469cccdef1 Sema: Avoid infinite recursion in associated type inference 2017-01-03 23:40:46 -08:00
Slava Pestov
f19cbef54d Sema: Try harder not to perform lookups into tuple types 2017-01-03 23:00:07 -08:00
Slava Pestov
7e1bc3c980 AST: Fix calls to protocol extension methods from class methods returning 'Self'
Here, the 'self' value has a dynamic Self type, which we must strip
off when performing the conformance lookup.

Fixes <https://bugs.swift.org/browse/SR-2696>.
2017-01-03 20:13:43 -08:00
Slava Pestov
0a179dbe2e Merge pull request #6492 from xedin/crasher-28505
[Diagnostics] Explicitly disallow solutions with unresolved types when diagnosing single expression closure bodies
2017-01-03 18:17:13 -08:00
Slava Pestov
a598ed68e6 Sema: Fixes for generic typealiases and nested type lookup
This patch contains several intertwined changes:

- Remove some unnecessary complexity and duplication.

- Adds a new TypeChecker::lookupUnqualifiedType() which bypasses most of
  the logic in TypeChecker::lookupUnqualified(), such as the
  LookupResultBuilder. Use this when resolving unqualified references
  to types.

- Fixes for generic typealiases to better preserve the type parameters of
  the parent type, and clean up the logic for applying the inner generic
  arguments. Some uses of generic typealiases that used to crash now work,
  and those tests have been uncommented.

- Avoid an unnecessary desugaring of TypeAliasDecls which map directly
  to GenericTypeParamTypes. Once again this perturbs the source-stability
  test.

- When looking up a nested type of a base class with a derived class base,
  always use the base class as the parent of the nested type. This fixes
  a recent regression where in some cases we were using the wrong parent.

Fixes <rdar://problem/29782186>.
2017-01-03 16:57:42 -08:00
Pavel Yaskevich
951395c5c5 [Diagnostics] Explicitly disallow solutions with unresolved types when diagnosing single expression closure bodies
When running diagnostics for single expression closures,
explicitly disallow to produce solutions with unresolved type variables,
because there is no auxiliary logic which would handle that and it's
better to allow failure diagnosis to run directly on the closure body.
2016-12-26 04:26:37 -08:00
Slava Pestov
dc3af8fc99 Sema: Don't re-typecheck multi-statement closures in lazy var initializer
Normally you have to declare a type if the lazy property
initializer is a multi-statement closure, but if the user
forgets we don't want to crash.
2016-12-21 14:20:28 -05:00
Slava Pestov
978941f1d5 Sema: More consistent logic for non-requirement protocol members 2016-12-21 14:20:27 -05:00
Slava Pestov
3f7a72eb84 Sema: Clean up diagnostic logic when deriving RawRepresentable conformance on enums 2016-12-21 14:20:26 -05:00
Slava Pestov
1f0817268b Sema: Don't look through metatypes and inout types in lookupMemberType()
Metatypes do not have member types and trying to look one up on a
generic parameter would cause a crash.

InOutTypes are not materializable and we should never be performing
name lookup into them.
2016-12-21 14:20:26 -05:00
Slava Pestov
57aec601d8 Sema: Fix crash in member type lookup error path 2016-12-21 14:20:25 -05:00
Slava Pestov
867a956fc2 Sema: Name lookup fix for nominal type members of protocols 2016-12-19 18:49:58 -08:00
Slava Pestov
5640339439 Sema: Map types out of context when resolving inheritance clause in ITC 2016-12-19 18:49:57 -08:00