Commit Graph

4518 Commits

Author SHA1 Message Date
Doug Gregor
92ff07a556 If member lookup into an optional fails, suggest a '!'.
This Fix-It handles simple cases such as "foo.bar" where "foo" is of
optional type. Addresses rdar://problem/19707036.

Swift SVN r24944
2015-02-04 06:15:36 +00:00
Chris Lattner
8d6d0c1e58 fix <rdar://problem/19470858> QoI: @autoclosure implies @noescape, so you shouldn't be allowed to specify both
Swift SVN r24942
2015-02-04 06:02:40 +00:00
Doug Gregor
88e4d43600 Make optionality checking more lenient in requirement/witness matching.
When comparing a requirement to a witness for @objc protocols, strip
optionality out of the types and keep track of the optionality
differences separately. When we have actually matched a witness,
diagnose any unsafe (via an error) or ill-advised (via a warning)
differences, providing Fix-Its to update the optionality.

This change addresses a usable problem introduced by the fix to
rdar://problem/18383574: witnesses for optional requirements of @objc
protocols could previously have completely wrong optionality, and we
would "allow" it by not actually matching the witness to the
requirement. Then it would happen to work at runtime because it's
@objc. Now, we match those witnesses and diagnose issues, with Fix-Its
to clean up the user's code.

Addresses rdar://problem/19656106.

Swift SVN r24939
2015-02-04 04:46:32 +00:00
Joe Pamer
e452c87edb If an expression fails to type check because one of its sub-expressions is a failed call expression, make sure that the inner call expression's diagnostic is surfaced. Doing so address rdar://problem/19419422, rdar://problem/19437880 and rdar://problem/19559649.
Swift SVN r24935
2015-02-04 02:03:41 +00:00
Joe Groff
b0fabcef7b Sema: Force dynamic materializeForSet accessors to be statically dispatched.
The materializeForSet accessor for a `dynamic` property needs to dynamically invoke the getter and setter of the property in order to allow for runtime modification, so it doesn't need to be dynamically dispatched itself. If the property came from an imported ObjC class, then we can't dynamically dispatch it without polluting the selector namespace. Introduce a new 'ForcedStaticDispatch' bit and set it in order to force `dynamic` materializeForSet accessors to be statically dispatched. (They can't be `final` because it's legal to override a dynamic property.) If the property came from ObjC, register materializeForSet as an external declaration so it gets generated by SIL. Fixes rdar://problem/18706056.

Swift SVN r24930
2015-02-04 00:46:24 +00:00
Joe Pamer
45e7fd53dd Remove a misguided peephole optimization from the constraint generator. This fix partially unblocks the build of the Cartography external project.
Swift SVN r24927
2015-02-03 21:15:00 +00:00
Jordan Rose
3e1e2c4852 Lock down on function conversions that change the ABI of the function.
These haven't ever been safe in Swift's development because they require
generating thunks, and we currently don't do that. However, we were letting
existential conversions slip through the cracks because we consider them
subtypes, so that /metatype/ conversions work correctly. To be concrete:

  "let _: Any.Type = Int.self" is okay.
  "let _: (Int) -> Void = { (_: Any) -> Void in return }" is not.

We should implement this some day; that's rdar://problem/19517003.

This produces some lousy error messages, which I intend to fix soon.

Part of rdar://problem/19600325

Swift SVN r24915
2015-02-03 03:44:05 +00:00
Doug Gregor
6a1b7348e0 Make trailing closure syntax match the last parameter, always.
Previously, trailing closures would try to match the first parameter
of (possibly optional) function type that didn't seem to have an
argument already, but in practice this broke when there were
parameters with default arguments before the function parameter.

The new rule is far simpler: a trailing closure matches the last
parameter. Fixes rdar://problem/17965209.

Swift SVN r24898
2015-02-02 19:47:31 +00:00
Joe Groff
c1db47ed13 Sema: Synthesize materializeForSet with dynamically-dispatched accessors for dynamic properties.
Semantically, a dynamic property must always be dispatched in case it gets replaced at runtime, and an @NSManaged property may not have static accessors at all. Use ordinary access to the computed property accessors in materializeForSet when a property is dynamic or ObjC-originated. More rdar://problem/18706056.

There's still a problem--we try to vtable-dispatch materializeForSet, which is redundant for native classes, but impossible for imported ObjC classes. We should suppress this, but trying to make materializeForSet "final" breaks subclassing if the property is overridden.

This time, update test/SILGen/objc_properties.swift to avoid a false negative test failure.

Swift SVN r24888
2015-02-01 20:24:57 +00:00
Dmitri Hrybenko
2037fe0059 Revert "Sema: Synthesize materializeForSet with dynamically-dispatched accessors for dynamic properties."
This reverts commit r24882.  It broke SILGen/objc_properties.swift.

Swift SVN r24883
2015-02-01 03:17:49 +00:00
Joe Groff
456288fb6f Sema: Synthesize materializeForSet with dynamically-dispatched accessors for dynamic properties.
Semantically, a dynamic property must always be dispatched in case it gets replaced at runtime, and an @NSManaged property may not have static accessors at all. Use ordinary access to the computed property accessors in materializeForSet when a property is dynamic or ObjC-originated. More rdar://problem/18706056.

There's still a problem--we try to vtable-dispatch materializeForSet, which is redundant for native classes, but impossible for imported ObjC classes. We should suppress this, but trying to make materializeForSet "final" breaks subclassing if the property is overridden.

Swift SVN r24882
2015-02-01 02:09:27 +00:00
Chris Willmore
ab86515fb2 <rdar://problem/19671476> Offer as -> as! changes in all nested contexts
When generating constraints for an 'as' expression, consider the
possibility that the code is supposed to be 'as!' instead of 'as'. Emit
the appropriate fixit if that branch of the disjunction is chosen by the
constraint solver.

This is a more comprehensive fix for <rdar://problem/19499340> than the
one in r24815.

Swift SVN r24872
2015-01-31 00:55:53 +00:00
Devin Coughlin
a960c00456 Sema: Check getter and setter availability.
This commit adds checking for accesses of potentially unavailable getters and setters.
When walking an expression to check availability, AvailabilityWalker now keeps track of
the context for when it encounters a MemberRefExpr. This context be either
(1) the next encountered member reference could cause  the member's getter to be called
(e.g., the member ref is for a read of the property); (2) the member's setter could be
called (e.g., the member ref is the left-hand-side of an assignment);  or (3) the member
ref generates the lvalue for for an InOutExpr (&) -- in which case we have to assume both
the getter and the setter could be called. These diagnostics are protected by the
-enable-experimental-availability-checking flag.

This commit does not import separate getter and setter availability from Objective-C; that
is coming in a future commit.

Swift SVN r24870
2015-01-31 00:47:12 +00:00
Joe Groff
0225fa568a Sema: Don't synth "materializeForSet" for @objc protocol requirements.
Another fix for rdar://problem/18706056. This should make @NSManaged properties work fine with @objc protocols, but I expect us to still be broken with native protocols.

Swift SVN r24862
2015-01-30 23:41:10 +00:00
Joe Groff
06fb3bdf8d Sema: Don't synth materializeForSet accessors on behalf of get-only property requirements.
One of several inefficiencies in the area exposed by rdar://problem/18706056.

Swift SVN r24858
2015-01-30 23:13:18 +00:00
Joe Pamer
666646fee9 Fix "the world's shortest Swift crasher" (case 1083), as described this afternoon on Twitter by @PracticalSwift. Doing so has the nice side effect of addressing several other crashers.
Swift SVN r24857
2015-01-30 21:50:22 +00:00
Joe Pamer
0562411bb2 Improve support for diagnosing errors that result from contextual or conversion type mismatches. Doing so allows us to improve our diagnostics for a few important cases:
- Situations where the type of a return statement's result expression doesn't line up with the function's type annotation.
- Situations where the type of an initializer expression doesn't line up with its declaration's type pattern.
- Situations where we assume a conversion to a built-in protocol must take place, such as in if-statement conditionals.

(Addresses rdar://problem/19224776, rdar://problem/19422107, rdar://problem/19422156, rdar://problem/19547806 and lots of other dupes.)

Swift SVN r24853
2015-01-30 19:32:20 +00:00
Jordan Rose
fc847e5686 Allow @IBDesignable on class extensions as well.
Per discussion with the IB team, a class can retroactively be marked as
designable via an extension (or if not retroactively, at least from elsewhere
in the module). This matches the documentation for Objective-C.

(The attribute still has no semantics in Swift itself. The only restriction
is that it must appear on a class or an extension of a class.)

rdar://problem/19654163

Swift SVN r24837
2015-01-30 03:44:02 +00:00
Devin Coughlin
00ccdbc6c1 Sema: Move potential unavailability diagnostics into MiscDiagnostics.
This commit moves potential unavailability diagnostics (when not treating unavailable
symbols as optional) out of CSApply.cpp and into MiscDiagnostics.cpp, alongside the
deprecation-based and explicitly unavailable checks. This move is a precursor to adding
support for separate availability information on getters and setters. No intended
functional change.

Swift SVN r24836
2015-01-30 00:25:27 +00:00
Chris Willmore
aa3de78f2b <rdar://problem/19563805> Fuzzing Swift: performTypeChecking(...) crashes in ConformanceChecker::recordTypeWitness(...): Assertion failed: "Conformance should already have been verified"
Don't attempt to re-typecheck coerce expr when we're already pretty sure
it has failed.

Swift SVN r24834
2015-01-29 23:28:12 +00:00
Doug Gregor
2bf69a0ea0 Require witnesses for @objc requirements to be @objc.
Previously, we attempted to infer @objc-ness based on conformance, but
doing so is fraught with ordering dependencies, and just doesn't work
in the general case. Among other crimes, this allowed us to
retroactively mark a non-@objc method from an imported module as
@objc... even though nobody would ever then emit the @objc entry
points for it.

Fixes the rest of rdar://problem/18383574.

Swift SVN r24831
2015-01-29 22:53:53 +00:00
Doug Gregor
9abe8f717c Diagnose Objective-C conflicts due to unsatisfied, optional @objc requirements.
An optional @objc requirement within a protocol can be left
unsatisfied in a well-formed program. However, there may still be a
conflict within the Objective-C runtime if the conforming class
defines a method with the corresponding Objective-C selector(s) for
that requirement, which means that the Swift and Objective-C semantics
will differ. Diagnose such issues.

More steps along the road to fixing rdar://problem/18383574.

Diagnose conflicts between unsatisfied, optional @objc requirements and

Swift SVN r24830
2015-01-29 22:53:46 +00:00
Doug Gregor
642da65ab1 Consider @objc selectors when matching witnesses to protocol requirements.
When we match a witness to a requirement in a protocol, we do so based
on the Swift name (which is correct). When the requirement is @objc
(because it is in an @objc protocol), also check that the Objective-C
selectors of the witness match those of the requirement.

Fixes the majority of rdar://problem/18383574.

Swift SVN r24829
2015-01-29 22:53:43 +00:00
Doug Gregor
083c797b0f Zap some pointless @objc-specific logic in witness matching.
All it did was produce less useful diagnostics. Part of the cleanup
for rdar://problem/18383574.

Swift SVN r24828
2015-01-29 22:53:37 +00:00
Denis Vnukov
68b756bf90 Fix for rdar://19548610, Fuzzing Swift: performSema(...) crashes: Assertion failed: (Done && "Parser returned early?")
Parser may stop at some erroneous constructions like stray #else or #endif, in some cases closing brace ‘}’, etc…
continue parsing until we are done.



Swift SVN r24822
2015-01-29 21:51:06 +00:00
Joe Pamer
6a70bd085e These changes implement some oft-requested tweaks and fixes to our closure implementation:
- Closures that are comprised of only a single return statement are now considered to be "single expression" closures. (rdar://problem/17550847)
- Unannotated single expression closures with non-void return types can now be used in void contexts. (rdar://problem/17228969)
- Situations where a multi-statement closure's type could not be inferred because of the lack of a return-type annotation are now properly diagnosed. (rdar://problem/17212107)

I also encountered a number of crashers along the way, which should now be fixed.

Swift SVN r24817
2015-01-29 18:48:39 +00:00
Chris Willmore
fd272aefb9 <rdar://problem/19499340> QoI: Nimble as -> as! changes not covered by Fix-Its
If the typechecking failure involves a conversion constraint anchored at
as 'as' or 'as!' expression, try diagnosing it directly.

Swift SVN r24815
2015-01-29 08:21:32 +00:00
Doug Gregor
f19a320ffe Ban the definition of Objective-C '+load' methods.
They don't work properly, and if we want eager static initialization,
we'll add a Swift feature for it. Fixes rdar://problem/18423731.

Swift SVN r24814
2015-01-29 05:47:36 +00:00
Dmitri Hrybenko
b15c0bd01c PlaygroundTransform: don't overflow an Int on 32-bit platforms
Swift SVN r24787
2015-01-28 05:22:41 +00:00
Joe Groff
bf3c92c743 Sema: Move 'getBridgedToObjC' out of the type checker.
It is useful for other code to be able to query whether a type is bridged sharing the same logic as the type checker. NFC yet.

Swift SVN r24758
2015-01-27 21:20:39 +00:00
Joe Pamer
d2c2add5de Introduce a hack for ensuring that, in the face of unresolved member exprs, call argument types line up nicely with the associated argument tuple type. (rdar://problem/18841652, rdar://problem/18913150, etc.)
This was one of our most visible user-facing crashers, manifesting itself any time a user performed an equality comparison on an unresolved enum case.

Swift SVN r24753
2015-01-27 20:56:03 +00:00
Jordan Rose
0a9d60485f Don't look into a type context to resolve types in the inheritance clause.
Instead, just check the generic parameters, then do a lookup as usual in the
enclosing context.

Fixes crash suite #58 and quite a few others (~200). This looks way more
impressive than it is; in most of these test cases it's the exact same
pattern causing the crash, and that pattern was just the last outstanding
crash trigger in a sea of garbage. (The few deleted tests were identical
to #58.)

Swift SVN r24748
2015-01-27 02:45:29 +00:00
Jordan Rose
c4503ac953 Discard default arguments when inferring a type for a variable.
func a(b: Int = 0) {}
  let c = a // should be (b: Int) -> Void, not (b: Int = 0) -> Void

Fixes crash suite #23.

rdar://problem/18232797

Swift SVN r24747
2015-01-27 02:45:26 +00:00
David Farler
51f8070abe Serialize local types
Local type declarations are saved in the source file during parsing,
now serialized as decls. Some of these may be defined in DeclContexts
which aren't Decls and previously weren't serialized. Create four new
record kinds:

* PatternBindingInitializer
* DefaultArgumentInitializer
* AbstractClosureExpr
* TopLevelCodeDecl

These new records are used to only preserve enough information for
remangling in the debugger, and parental context relationships.

Finally, provide a lookup API in the module to search by mangled name.
With the new remangling API, the debugging lifecycle for local types
should be complete.

The extra LOCAL_CONTEXT record will compressed back down in a
subsequent patch.

Swift SVN r24739
2015-01-27 01:49:54 +00:00
Joe Pamer
1985f1454c Partially unblock SourceKit fuzz-testing by fixing rdar://problem/19534837. To be honest, there are likely many ways to raise the assertion mentioned in the radar, so I don't see this as the end of the unblocking work.
Swift SVN r24723
2015-01-25 22:01:03 +00:00
John McCall
9e26ecf2af Make ArchetypeType::NestedType its own proper type
with more explicit/semantic conversions in and out.

Using a PointerUnion with overlapping pointer types
is both error-prone and pretty close to illegible.

Swift SVN r24707
2015-01-24 13:05:38 +00:00
Chris Willmore
32438add4a <rdar://problem/19495253> Incorrect diagnostic for explicitly casting to the same type
Change "downcast" to "cast" in warnings where downcast isn't actually
downcast.

Swift SVN r24704
2015-01-24 01:28:55 +00:00
Joe Pamer
a18bedf079 Factor the constraint-favoring machinery out of the constraint generation process, and re-work it into a series of passes over an expression sub-tree.
Aside from tidying things up, doing this results in some significant benefits:
- Allows for global constraint ordering optimizations over a given expression, not just on a peephole basis.
- Eliminates a set of order-dependent bugs in the solver that have been dogging us for a while. (rdar://problem/19459079)
- Brings another set of tyvar-to-tyvar solving problems out of the realm of the exponential. (rdar://problem/19005271)
- Opens up the possibility of optimizing constraints during later solving phases - not just while generating them.

Swift SVN r24693
2015-01-23 23:10:50 +00:00
Jordan Rose
214751e036 Allow variables with observers to still have inferred types.
Previously, adding observing accessors to a variable caused it to require
an explicit type /and/ an initializer. Now you just need one or the other;
the type of the accessors is drawn from the type of the VarDecl, whether
inferred or explicitly written.

rdar://problem/18148072

Swift SVN r24664
2015-01-23 00:32:47 +00:00
Chris Willmore
6c21a6414a <rdar://problem/19421148> Calling init with a missing label doesn't provide a descriptive error when overloaded inits differ only by label
Swift SVN r24624
2015-01-22 01:12:45 +00:00
Joe Pamer
ea7bd2de53 Per Doug's comment, check for failable initializers on enum types when optimizing the return type of an initializer application. With this change, Adventure builds cleanly once again.
Swift SVN r24595
2015-01-21 06:10:41 +00:00
Jordan Rose
4e9d968b1d Slightly improve diagnostic about using a module as a type.
Before:
  error: use of module 'Foo' as a type
After:
  error: use of undeclared type 'Foo'
  note: cannot use module 'Foo' as a type

Improves on rdar://problem/17763309 a little.

Swift SVN r24564
2015-01-20 20:42:04 +00:00
Chris Willmore
3dea623b71 <rdar://problem/19495142> Various incorrect diagnostics for explicit type conversions
Fix diagnostics for 'as' and 'as!' expressions by ensuring that the
conversion constraint used to generate them actually corresponds to the
expression in question. Add tests from 19495142.

Swift SVN r24547
2015-01-20 04:16:37 +00:00
Doug Gregor
18b1782f22 For-each loop: convert the result of "generator.next()" to the appropriate type.
Fixes rdar://problem/19316670.

Swift SVN r24542
2015-01-20 00:43:51 +00:00
Jordan Rose
66d0eccad2 Refactor the handling of *ApplicationMain classes.
Rather than keeping just a "main class" in every module, track the "main file"
that's responsible for producing the module's entry point. This covers both
main source files and files containing classes marked @UIApplicationMain or
@NSApplicationMain.

This should have no functionality change, but is preparation for the next
commit, where we will preserve some of this information in serialization.

Swift SVN r24529
2015-01-19 23:08:54 +00:00
Doug Gregor
b642c555be Allow one to change the argument labels of curried function parameters.
Curried function parameters (i.e., those past the first written
parameter list) default to having argument labels (which they always
have), but any attempt to change or remove the argument labels would
fail. Use the fact that we keep both the argument labels and the
parameter names in patterns to generalize our handling of argument
labels to address this problem.

The IDE changes are due to some positive fallout from this change: we
were using the body parameters as labels in code completions for
subscript operations, which was annoying and wrong.

Fixes rdar://problem/17237268.

Swift SVN r24525
2015-01-19 22:15:14 +00:00
Joe Pamer
d9325547e5 Favor dictionary subscript return types (in addition to array subscript return types).
Swift SVN r24523
2015-01-19 20:59:15 +00:00
Joe Pamer
f453bceeb1 Fix utilization of expected types for subscript and apply expressions when favoring constraints. (rdar://problem/19334553)
Swift SVN r24522
2015-01-19 20:59:15 +00:00
Joe Pamer
35184ff7b5 Utilize argument type information to favor overload binding constraints on initializers. Doing so addresses a number of cases where the type checker was going exponential on seemingly simple user code.
Also, these changes fix the performance regressions that were introduced as a result of September's convertible/init requirement modifications, and allow us to roll back the associated workarounds that were added to the Adventure sample (rdar://problem/18942100).

Swift SVN r24520
2015-01-19 20:59:14 +00:00
Joe Pamer
f56949846f Propagate constraint favoring information across nodes of chained operations. This allows us to properly favor constraints for expressions the form "(float0 + float1) * float2".
Swift SVN r24519
2015-01-19 20:59:14 +00:00