Commit Graph

4109 Commits

Author SHA1 Message Date
Devin Coughlin
503e824e12 Warn on uses of deprecated APIs
Emit a warning when the developer uses an API that has been marked deprecated with an
availability attribute. Following the Clang behavior, we will only warn if the API is
deprecated on all deployment targets. For example, if an API is deprecated as of
OS X 10.11 but the minimum deployment target is 10.10 then no warning will be emitted.

rdar://problem/17406050

Swift SVN r25288
2015-02-13 23:44:28 +00:00
Jordan Rose
12c80f4a3a Check the raw values of an @objc enum eagerly during decl validation.
For @objc enums, raw values determine the representation values, so we have
to compute them eagerly in order for switch statements to work. Similarly,
if the enum is broken, we have to /fail/ eagerly so that we don't fall down
later on in IRGen.

rdar://problem/19775284

Swift SVN r25282
2015-02-13 20:31:43 +00:00
Jordan Rose
e635d6a993 In the spirit of r25276, break circularity with generic functions, too.
Also beef up the main test case a little.

I don't have a Radar, but this fixes 177 compiler_crashers!

Swift SVN r25281
2015-02-13 19:59:48 +00:00
Joe Pamer
d6b362ee81 Don't re-typecheck closures that have been transformed to match a void-returning contextual type. Due to their transformation, these single-expression closures will now appear as multi-expression, so a re-typecheck could potentially result in bogus type errors. (Fixes rdar://problem/19806558, which is a regression from Xcode 6.4 seed 1.)
Swift SVN r25278
2015-02-13 19:23:30 +00:00
Jordan Rose
f879f470bd Fix circularity issue checking the signature of a function.
This seems to already be working for variables in trunk, so it's just
functions that need the fix. (I'm not sure why the variables are emitting
the error twice, but I'm not going to spend time on that right now.)

rdar://problem/19715729

Swift SVN r25276
2015-02-13 18:50:08 +00:00
Denis Vnukov
108adff4f8 Minor: nullptr checks added to avoid crashes in erroneous cases
Swift SVN r25271
2015-02-13 15:47:51 +00:00
Chris Lattner
635d46d909 Fix <rdar://problem/19821633> only allow autoclosure on parameters, not on properties and globals
Disallow autoclosure on anything but paramdecls, and provide better QoI when you use them in enums.



Swift SVN r25262
2015-02-13 01:55:56 +00:00
Dmitri Hrybenko
61286f0260 Fix warnings produced by a newer version of Clang
Swift SVN r25257
2015-02-12 23:50:47 +00:00
Doug Gregor
38a4f0c9fe Revert "Match Objective-C names in overrides as part of validation, not override checking."
This reverts r25243, per rdar://problem/19816977.

Swift SVN r25253
2015-02-12 22:01:19 +00:00
Doug Gregor
954b4e4d83 Implement @autoclosure(escaping).
Addresses rdar://problem/19499207.

Swift SVN r25249
2015-02-12 21:09:47 +00:00
Doug Gregor
b25eda36fa Match Objective-C names in overrides as part of validation, not override checking.
Previously, we were using the Objective-C names to help determine
whether a declaration is an override or not. This is broken, because
we should determine overrides based on the Swift rules for
overriding, then (later) check that the Objective-C runtime will see
the same override behavior that the Swift runtime does. Address this
problem, both by taking the Objective-C selector out of the equation
when matching overrides (except for diagnostic purposes) and by
performing better validation of the Objective-C names for the
overriding vs. overridden methods/properties.

The motivating case here (from rdar://problem/18998564) is an
Objective-C initializer:

  -(instancetype)initString:(NSString *)string;

When trying to override this in a Swift subclass, one naturally
writes:

  override init(string: String)

which implicitly has the selector initWithString:. We ended up in an
unfortunate place where we rejected the override (because the
selectors didn't match) with a crummy diagnostic, but omitting the
"override" would result in a different conflict with the superclass.

Now, we'll treat this as an override and complain that one needs to
rename the method by adding "@objc(initString:)" (with a Fix-It, of
course). This fixes rdar://problem/18998564, but it is not ideal: the
complete solution (covered by rdar://problem/19812955) involves
reworking the dance between override and @objc so that we compute
'override' first (ignoring @objc-ness entirely), and let the
@objc'ness of the overridden declaration both imply @objc for the
overriding declaration and implicitly fix the selector. However, such
a change is too risky right now, hence the radar clone.

Swift SVN r25243
2015-02-12 17:46:56 +00:00
Chris Lattner
e1722f2747 fix <rdar://problem/19783405> @autoclosure parameters 'escape' from compiler-generated default initilizers
This is a "noescape leak" caused by implicit constructor synthesis, and not rejecting the
invalid code that is synthesized.  There isn't a good way to synthesize an implicit memberwise
constructor for a structure with an @autoclosure property, we just surpress it.

It would be great to just disallow autoclosure on properties entirely.  The only really popular
usecase I know of is for breaking cycles in enums, maybe we should just limit the autoclosure attribute
to enums specifically.



Swift SVN r25231
2015-02-12 07:07:04 +00:00
Doug Gregor
0e74268ea5 Strongly prefer available declarations to unavailable ones in type checking.
Fixes rdar://problem/18847642, rdar://problem/16554496, and the
current 1_stdlib/Array.swift.

Swift SVN r25212
2015-02-12 01:01:11 +00:00
Doug Gregor
235d3aeee4 Validate a getter or setter's storage declaration before checking it's @objc-ness.
While I'm here, zap some blatantly redundant code. Fixes
rdar://problem/19726164.

Swift SVN r25184
2015-02-11 18:34:54 +00:00
Doug Gregor
bc1422e9e0 Diagnose attempts to replace Objective-C methods via an extension.
Remove the logic that allowed an extension to provide an Objective-C
method that was already declared in the class itself, relying on the
existing Objective-C method redeclaration logic to detect such
conflicts. Fixes rdar://problem/17687082.

Swift SVN r25175
2015-02-11 08:01:22 +00:00
Jordan Rose
6f87cff84e Be more consistent about requiring "self." in closures.
"self." is required whenever it causes a potentially escaping closure to
capture 'self'. This happens not just in plain ClosureExprs, but in local
functions as well. In addition, even no-escape ClosureExprs can require
self to be captured in a /parent/ closure, which may be potentially-escaping.

Swift SVN r25173
2015-02-11 07:20:29 +00:00
Chris Willmore
ee342c15c4 <rdar://problem/19770981> Swift doesn't recognize that NSString has been as! converted to String and continually suggests conversion
If appending 'as T' to an expression in a fixit, also suggest
parentheses around the resulting expression if it would otherwise be
parsed incorrectly.

Swift SVN r25168
2015-02-11 04:49:34 +00:00
David Farler
1e81ef4d32 Narrow trivial accessor creation to @objc VarDecls
Only create trivial accessors if the actual VarDecl is @objc,
explicitly or implicitly, not the class.

Also, replicate the PrintAsObjC test into classes_objc_generics since
"classes" isn't run on compilers that support Objective-C generics, and
fix the expectations.

Swift SVN r25162
2015-02-11 04:08:49 +00:00
Joe Pamer
ec6810827a Replace a dyn_cast to "DictionaryType" with an invocation of ConstraintSystem::isDictionaryType. (I'm pretty sure that just relying on the cast can cause problems when generating constraints.)
Swift SVN r25157
2015-02-11 01:25:33 +00:00
David Farler
a079cbc49a Generate trivial accessors for static stored properties in objc classes
Expose static stored properties in @objc classes as trivial class
methods.

static let i: T => +(T)i
static var i: T => +(T)i and +(void)setI:
static var k T { get set } => No change.

Fixes rdar://problem/19784053

Swift SVN r25152
2015-02-11 00:44:59 +00:00
Joe Pamer
c5c521392e Don't over-eagerly specialize the return type of an enum initializer application. Doing so doesn't really improve compiler throughput, but can cause problems if the enum has overloaded initializers. (rdar://problem/19697319)
Swift SVN r25147
2015-02-11 00:13:16 +00:00
Doug Gregor
20bc247494 Use unified logic for determining whether a subscript index is bridged to an object type.
Fixes rdar://problem/19772357.

Swift SVN r25145
2015-02-10 23:56:07 +00:00
Joe Pamer
989aa3d58a When converting a non-void-returning closure to a contextual function type that returns void, increase the function conversion score count. This ensures that, in the case of overload resolution, we don't accidentally favor a void-returning function over a better (or exact) fit. (rdar://problem/19776288)
Swift SVN r25140
2015-02-10 22:02:20 +00:00
Denis Vnukov
f585966027 Fix for rdar://19634354, SourceKit crashes while defining a function inside a while loop
Avoid re-typechecking of boolean literals in code completion



Swift SVN r25136
2015-02-10 21:47:47 +00:00
Joe Pamer
9923e3ff89 When optimizing constraints for an unresolved dot expression, don't walk into the base expression - it will most likely result in an incorrect favored type, which can lead to "expression too complex" errors. (rdar://problem/19773442, rdar://problem/19770646)
Swift SVN r25129
2015-02-10 19:14:29 +00:00
Jordan Rose
6fe976d3b0 Diagnose function conversions that change the function's ABI.
This post-hoc diagnostic replaces r24915, r25045, and r25054 by doing a
very basic check for representation incompatibility between two types.
More cases can be added as necessary.

rdar://problem/19600325, again.

Swift SVN r25117
2015-02-10 03:46:47 +00:00
Jordan Rose
07041fc7d3 Revert all the function type ABI restriction changes.
John pointed out that messing with the type checker's notion of "subtype"
is a bad idea. Instead, we should just have a separate check for ABI
compatibility...and eventually (rdar://problem/19517003) just insert the
appropriate thunks rather than forcing the user to perform the conversion.

I'm leaving all the tests as they are because I'm adding a post-type-checking
diagnostic in the next commit, and that should pass all the same tests.

Part of rdar://problem/19600325

Swift SVN r25116
2015-02-10 03:46:46 +00:00
Chris Willmore
af12966eb8 When fixing implicit conversion of bridged types, only insert 'as T'
instead of 'as! T' if explicit conversion is sufficient.

Refinement of fix for <rdar://problem/19551164>.

Swift SVN r25104
2015-02-10 00:29:13 +00:00
Chris Willmore
aee4c26eb0 Fix indentation of fix cases in ConstraintSystem::applySolution().
Swift SVN r25062
2015-02-07 00:37:10 +00:00
Chris Willmore
e2ac9f65ac Add FixKind for 'as' -> 'as!' conversion
Penalize solutions that involve 'as' -> 'as!' changes by recording a Fix
when simplifying the corresponding checked-cast constraint.

<rdar://problem/19724719> Type checker thinks "(optionalNSString ?? nonoptionalNSString) as String" is a forced cast

Swift SVN r25061
2015-02-07 00:33:37 +00:00
Jordan Rose
3ae117188e Handle capturing super in autoclosures.
We already emit the right code to invoke the superclass method. Just make
sure we actually capture 'self' to do it.

Swift SVN r25059
2015-02-07 00:27:03 +00:00
Jordan Rose
19af8a124c Re-apply "If a function conversion fails, suggest wrapping in a closure."
This re-applies r24987, reverted in r24990, with a fix for a spuriously-
introduced error: don't use a favored constraint in a disjunction to avoid
applying a fix. (Why not? Because favoring bubbles up, i.e. the
/disjunction/ becomes favored even if the particular branch is eventually
rejected.) This doesn't seem to affect the outcome, though: the other
branch of the disjunction doesn't seem to be tried anyway.

Finishes rdar://problem/19600325

Swift SVN r25054
2015-02-06 23:12:54 +00:00
Jordan Rose
003821a956 Value-to-optional conversions are only subtypes for class references.
let x: Int? = 4 as Int // okay
  let f: (Int) -> Void = { (x: Int?) -> Void in println(x) } // error!

As part of this, remove an invalid "protection" of value-to-optional
conversions that involve T? -> T??. Unfortunately, this results in an
ambiguity in the following code:

  var z: Int?
  z = z ?? 42

Both of our overloads for ?? here require one value-to-optional conversion,
and the overload preference isn't conclusive. (Turns out (T?, T) and
(U?, U?) can be unified as T=U or as T=U?.) The best thing to do would be
to take our solved T=Int binding into account, but the type checker isn't
set up to do that at the moment.

After talking to JoeP, I ended up just hardcoding a preference against
the (T?, T?) -> T? overload of ??. This is only acceptable because both
overloads have the same result, and I'll be filing another Radar to
remove this hack in the future.

Part of rdar://problem/19600325

Swift SVN r25045
2015-02-06 20:41:51 +00:00
Doug Gregor
fd13a5e282 Clear out type information in UnresolvedSpecializeExpr.
I wasn't able to tickle this bug with an actual test case, perhaps due
to lack of imagination, but I'd rather fix it in bugsentia than debug
it later.

Swift SVN r24999
2015-02-05 17:22:21 +00:00
David Farler
4ff6e69bf7 Add tests for noescape diagnostics with multiple overload matches
Don't emit multiple diagnostics for the same destination type -
this makes diagnostics less noisy where there are multiple overloads
with the same type.

Also, move the check for multiple overloads into
diagnoseFailureForCallExpr.

Swift SVN r24993
2015-02-05 05:35:30 +00:00
Jordan Rose
18355ca44a Revert "If a function conversion fails, suggest wrapping in a closure."
This reverts commit r24987. The constraint system is choosing the fix
case over the normal case in Dollar.swift.

Swift SVN r24990
2015-02-05 03:56:20 +00:00
Jordan Rose
ad7440989b If a function conversion fails, suggest wrapping in a closure.
And even if we don't suggest wrapping in a closure (say, because there's
already a closure involved), emit a more relevant diagnostic anyway.
(Wordsmithing welcome.)

Wrapping a function value in a closure essentially explicitly inserts a
conversion thunk that we should eventually be able to implicitly insert;
that's rdar://problem/19517003.

Part of rdar://problem/19600325

Swift SVN r24987
2015-02-05 01:56:47 +00:00
David Farler
8c4d1b2064 Emit diagnostics when multiple overload matches have the wrong function attribute
When threading a @noescape, @noreturn, or @autoclosure parameter through
to a function that doesn't expect one of those attributes, multiple
overload matches may cause the diagnostic to be dropped on the floor,
causing a crash in AST verification. If there is more than one failure
recorded for these attribute mismatches, don't fall back to the
contextual type diagnostics.

Fixes crash: rdar://problem/19704523

Swift SVN r24974
2015-02-04 21:27:13 +00:00
Doug Gregor
fc3a5a726a Make sure we don't add bogus same-type requirements to a generic signature.
Fixes rdar://problem/19137463.

Swift SVN r24972
2015-02-04 21:07:43 +00:00
Doug Gregor
53f321d8f1 Teach the type nullifier to wipe out explicit cast types, too.
Fixes rdar://problem/19695671. There is a more principled way to
address this via the ASTWalker, but this is the safe fix.

Swift SVN r24961
2015-02-04 17:42:13 +00:00
Doug Gregor
9637137d45 Provide forced-downcasting Fix-Its where we used to have implicit bridging conversions.
For example, we used to have an implicit conversion from NSString to
String, but it was removed. Provide a Fix-It that suggests "as!
String". Fixes <rdar://problem/19551164>.

Swift SVN r24948
2015-02-04 07:08:27 +00:00
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