Commit Graph

236 Commits

Author SHA1 Message Date
Dmitri Hrybenko
c109ec9125 stdlib: protocol extensions: de-underscore count()
Swift SVN r28246
2015-05-07 00:30:38 +00:00
Dmitri Hrybenko
e253881b02 stdlib: protocol extensions: de-underscore indices
Swift SVN r28245
2015-05-07 00:30:35 +00:00
Chris Willmore
f3670d3a6f When adding '!' in fix-it, make sure that it doesn't fall into the
optional evaluation context that produced the optional.

<rdar://problem/20377684> Oscillating fixit for optional chain calling method that returns non-optional

Swift SVN r28212
2015-05-06 19:05:45 +00:00
Roman Levenstein
984fcef576 Produce an error for generic parameters of functions if those parameters are not used in function signature.
If a generic parameter is not referred to from a function signature, it can never be inferred and thus such a function can never be invoked.

We now produce the following error:

generic parameter 'T' is not used in function signature
func f8<T> (x: Int) {}

This commit takes Jordan't comments on r28181 into account:
- it produces a shorter error message
- it does not change the compiler_crashers_fixed test and add a new expected error instead

Swift SVN r28194
2015-05-06 02:20:39 +00:00
Roman Levenstein
a3a25000ff Revert "Produce an error for generic parameters of functions if those parameters are not used in function signature."
This reverts commit r28181. I'll change it according to Jordan's comments and re-commit.

Swift SVN r28193
2015-05-06 02:20:36 +00:00
Roman Levenstein
ebe3fddbe6 Produce an error for generic parameters of functions if those parameters are not used in function signature.
If a generic parameter is not referred to from a function signature, it can never be inferred and thus such a function can never be invoked.

We now produce the following error:

There is no way to infer the generic parameter 'T' if it is not used in function signature
func f8<T> (x: Int) {}
             ^

Swift SVN r28181
2015-05-05 21:02:11 +00:00
Chris Willmore
331b570329 Remove reverse subtype constraint between Objective-C classes when type
checking checked cast via bridging. It prevented bridging upcasts using
'as!' from typechecking; we should emit an 'as!'->'as' warning instead.

Also, use ExplicitConversion constraint instead of Conversion when
determining whether a checked cast can be carried out unconditionally.
This matches the constraint used after applying the 'as!'->'as' fixit.

(Also, fix the error that was responsible for breaking
the expr/cast/bridged.swift test.)

<rdar://problem/19813772>

Swift SVN r28034
2015-05-01 08:27:19 +00:00
Ted Kremenek
acf0c496e2 Revert "Remove reverse subtype constraint between Objective-C classes when type"
This is breaking TEST 'Swift :: expr/cast/bridged.swift'.

Swift SVN r28030
2015-05-01 06:37:59 +00:00
Chris Willmore
7d413057aa Remove reverse subtype constraint between Objective-C classes when type
checking checked cast via bridging. It prevented bridging upcasts using
'as!' from typechecking; we should emit an 'as!'->'as' warning instead.

Also, use ExplicitConversion constraint instead of Conversion when
determining whether a checked cast can be carried out unconditionally.
This matches the constraint used after applying the 'as!'->'as' fixit.

<rdar://problem/19813772>

Swift SVN r28028
2015-05-01 06:21:50 +00:00
Dmitri Hrybenko
0fce5c7b4e tests: remove uses of println() that are not relevant to the tests
Swift SVN r28016
2015-05-01 03:35:50 +00:00
Chris Lattner
5248ededee Rework the AST representation of CollectionExprs to maintain
a list of their elements, instead of abusing TupleExpr/ParenExpr
to hold them.

This is a more correct representation of what is going on in the
code and produces slightly better diagnostics in obscure cases.

However, the real reason to fix this is that the ParenExpr's that
were being formed were not being installed into the "semantic"
view of the collection expr, not getting type checked correctly,
and led to nonsensical ParenExprs.  These non-sensical ParenExprs
blocked turning on AST verification of other ones.

With this fixed, we can finally add AST verification that 
IdentityExpr's have sensible types.



Swift SVN r27850
2015-04-28 01:09:10 +00:00
Chris Lattner
0b5c1125e4 improve and consistify diagnostics for non-lvalue inout arguments.
Swift SVN r27795
2015-04-27 01:05:29 +00:00
Chris Lattner
9f36074698 fix <rdar://problem/19711233> QoI: poor diagnostic for operator-assignment involving immutable operand
We now produce tailored diagnostics for assignment operators that are passed a non-mutable LHS,
e.g.:

t.swift:14:3: error: cannot pass 'let' value 'x' to mutating binary operator '/='
x /= 19
~ ^
t.swift:13:1: note: change 'let' to 'var' to make it mutable
let x = 42
^~~
var





Swift SVN r27780
2015-04-27 00:20:57 +00:00
Doug Gregor
b2cc34c241 Remove '#' for making parameter names into argument labels.
If you want to make the parameter and argument label the same in
places where you don't get the argument label for free (i.e., the
first parameter of a function or a parameter of a subscript),
double-up the identifier:

  func translate(dx dx: Int, dy: Int) { }

Make this a warning with Fix-Its to ease migration. Part of
rdar://problem/17218256.

Swift SVN r27715
2015-04-24 23:58:57 +00:00
Doug Gregor
793b3326af Implement the new rules for argument label defaults.
The rule changes are as follows:
  * All functions (introduced with the 'func' keyword) have argument
  labels for arguments beyond the first, by default. Methods are no
  longer special in this regard.
  * The presence of a default argument no longer implies an argument
  label.

The actual changes to the parser and printer are fairly simple; the
rest of the noise is updating the standard library, overlays, tests,
etc.

With the standard library, this change is intended to be API neutral:
I've added/removed #'s and _'s as appropriate to keep the user
interface the same. If we want to separately consider using argument
labels for more free functions now that the defaults in the language
have shifted, we can tackle that separately.

Fixes rdar://problem/17218256.

Swift SVN r27704
2015-04-24 19:03:30 +00:00
Dmitri Hrybenko
2ce7dee53d stdlib: remove _SequenceType, thanks to the new type witness solver
Swift SVN r27620
2015-04-23 01:37:31 +00:00
Dmitri Hrybenko
736f17cda3 Annotate tests that require ObjC runtime
Swift SVN r27420
2015-04-17 06:10:56 +00:00
Joe Groff
852a701051 Type checker: Allow implicit conversions from existential metatypes to more general ones.
An existential composition protocol<P,Q>.Type is convertible to P.Type is convertible to Any.Type.

Swift SVN r27410
2015-04-17 05:30:24 +00:00
Dmitri Hrybenko
d267b86cb6 stdlib: move the bulk of SequenceType algorithms to protocol extensions
rdar://19895265

Swift SVN r27269
2015-04-14 01:53:19 +00:00
Joe Groff
c0a2994564 AST: Start printing function types with @convention instead of old attributes.
And update tests to match.

Swift SVN r27262
2015-04-13 22:51:34 +00:00
Joe Groff
570f08baca Sema: Recognize NSError-to-ErrorType-conformance casts as possible.
Swift SVN r27254
2015-04-13 17:14:49 +00:00
Joe Groff
66ae68bcc3 Sema: Allow ErrorType-conforming types to be explicitly coerced 'as NSError'.
Swift SVN r26993
2015-04-04 22:38:04 +00:00
Chris Lattner
82956ede54 fix a QoI regression I introduced in r26224. If an initializer expr in a var/let decl
is invalid and produces a ParseError, recovery by producing an AST with an ErrorExpr in it
instead of dropping the initializer on the floor.  This silences downstream errors about
"must have an initializer" sorts of stuff.



Swift SVN r26405
2015-03-22 05:08:26 +00:00
Jordan Rose
b6c5872889 Account for Optional<Void> in comparing function types for ABI compatibility.
Fixes a crash when the user uses such a type. (Which is probably a
mistake--they probably meant to make the whole closure optional--but
that's another issue.)

rdar://problem/20163908

Swift SVN r26274
2015-03-18 18:55:54 +00:00
Chris Lattner
59c22383fb Rework PatternBindingDecl to maintain a list of pattern/initexpr pairs inside of it.
Previously, a multi-pattern var/let decl like:
  var x = 4, y = 17

would produce two pattern binding decls (one for x=4 one for y=17).  This is convenient
in some ways, but is bad for source reproducibility from the ASTs (see, e.g. the improvements
in test/IDE/structure.swift and test/decl/inherit/initializer.swift).

The hardest part of this change was to get parseDeclVar to set up the AST in a way
compatible with our existing assumptions. I ended up with an approach that forms PBDs in 
more erroneous cases than before.  One downside of this is that we now produce a spurious
  "type annotation missing in pattern"
diagnostic in some cases.  I'll take care of that in a follow-on patch.





Swift SVN r26224
2015-03-17 16:14:18 +00:00
Chris Willmore
bad04371f0 Insert parentheses around expression before appending 'as T', if
necessary. Wrap forced optional fixit in parens if necessary.

<rdar://problem/20029786> Swift compiler sometimes suggests changing "as!" to "as?!"

Swift SVN r26189
2015-03-16 20:52:18 +00:00
Chris Willmore
cda3dcc7d1 Fix up comment from r26185; the test code is actually in error.
Swift SVN r26186
2015-03-16 18:52:29 +00:00
Chris Willmore
433de9f2f1 Deal with constraint system failure without associated locator in FailureDiagnosis::diagnoseFailureForCallExpr().
<rdar://problem/20142523>

Swift SVN r26185
2015-03-16 18:41:59 +00:00
Chris Lattner
a0d02cdcdd Several minor changes:
- Strength reduce isAtStartOfBindingName() to just check for 
   identifier or _ and inline into its two callers.
 - Rename Token::isIdentifierOrNone to isIdentifierOrUnderscore.
 - Teach InVarOrLetPattern about matching patterns, so that the
   parser knows when it is parsing an expression as a matching
   pattern but is not yet inside a let/var pattern.
 - Use newfound knowledge of matching patterns to refine handling
   of unexpected let/var when parsing an expression, but not in a
   pattern context, slightly improving QoI in invalid cases.



Swift SVN r26172
2015-03-15 23:36:05 +00:00
Chris Lattner
bf73cc23f1 fix <rdar://problem/20167543> "for var x = ..." not parsed as a foreach loop
This was because the ambiguity between c-style and foreach loops wasn't being
properly handled.  Use the canParsePattern() logic to handle this in full 
generality.

Since that logic was unused, dust it off and clean it up a bit.  Similarly,
remove some old vestigates of default argument parsing in tuples and 
old-syntax array handling.



Swift SVN r26164
2015-03-15 21:43:04 +00:00
Chris Lattner
27ef444db5 Remove the "isLet" parameter from the pattern parsing logic. It was (almost)
duplicated by the InVarOrLetPattern state in the Parser object.  Beef 
InVarOrLetPattern up so that we can remove it.

NFC except that we now reject pointless let patterns in foreach loops,
similar to how we reject var patterns inside of let patterns.



Swift SVN r26163
2015-03-15 21:06:37 +00:00
Chris Lattner
83541dd362 add tests for the ?? operator and x?.foo() monadic binds in value matching cases,
per Jordan's request.


Swift SVN r26003
2015-03-11 23:40:19 +00:00
Chris Lattner
6b31c2fa67 enhance sema's remapping of pattern expressions into patterns to handle multiple
???'s stacked on top of each other in patterns.  This wraps up:
<rdar://problem/19382878> Introduce new x? pattern

please kick the tires and let me know if you see any problems.


Swift SVN r26002
2015-03-11 23:23:32 +00:00
Chris Lattner
718d82f5c9 rework our treatment of identifiers in refutable patterns that are inside of
a let/var pattern.  Now any identifier in one of these is a variable binding,
not sometimes a value references (depending on contextual syntax).

This isn't expected to have a widespread effect on existing real world code:
 - No impact on the stdlib.
 - It does fix two validation crash tests, but possibly because the original issue is hidden by a different diagnostic path in the compiler.
 - This needed two tests to be tweaked to undistribute "let".

On the positive side, this means that "case let x?:" now works properly, woo.



Swift SVN r26000
2015-03-11 23:08:55 +00:00
Joe Groff
8af07b1c36 Sema: Allow Enum.Case case patterns in existential contexts.
In an existential context, allow 'case Enum.Case:' by implicitly introducing a cast pattern, treating it as 'case Enum.Case as Enum:'. This will be important for the error handling design, where we want ErrorType-conforming enums to be pattern-matchable out of an ErrorType existential using 'catch' patterns.

Swift SVN r25968
2015-03-11 03:21:25 +00:00
Chris Willmore
9e8d4b0dbf Use isVoid() instead of isEqual(TheEmptyTupleType). Add tests for underspecification issue fixed by r25939.
<rdar://problem/19835413> Reference to value from array changed

Swift SVN r25962
2015-03-10 22:35:08 +00:00
Chris Willmore
7cbadb1d2c When UnsafeMutablePointer<$T1> has a Conversion constraint to
UnsafeMutablePointer<Void>, don't bind $T1 to Void. This fixes an
unintentional dependency on the order in which constraints are visited
by the solver.

Fix some resulting underconstrained expressions in the stdlib.

<rdar://problem/19835413> Reference to value from array changed

Swift SVN r25921
2015-03-10 10:08:38 +00:00
Chris Willmore
4b939eef89 Allow implicit conversion constraint to bridge String to NSString even
when it is the favored constraint of a disjunction.

This allows 'ns ?? "str" as String as String' to typecheck where ns is
an NSString. This does not regress the relevant test for 17962491.

<rdar://problem/20029786> Swift compiler sometimes suggests changing "as!" to "as?!"

Swift SVN r25910
2015-03-10 03:45:53 +00:00
Chris Willmore
b3e0264e08 "@lvalue" shouldn't appear in general conversion failure diagnostic.
rdar://problem/19836341

Swift SVN r25826
2015-03-07 01:07:42 +00:00
Chris Willmore
42dba24464 Don't allow '{' at start of if-condition
If '{' is encountered immediately after 'if', assume that the condition
is missing. Apply the same treatment to while, do-while, for-in, and
switch. This way we're not trying to re-parse, backtrack, repurpose
misparsed closure bodies, etc. in those cases. Users who want to write a
condition that starts with '{' can wrap it in parens.

Addressing feedback re <rdar://problem/18940198>.

Swift SVN r25747
2015-03-04 05:39:49 +00:00
Chris Willmore
9910c75c67 Don't offer incorrect fixit for NSString? -> String? conversion.
Update the locator when matching optional types in parallel fashion.
This causes the simplifyLocator() call to fail to simplify the locator
completely, and avoids the bogus diagnostic.

<rdar://problem/19836341> Incorrect fixit for NSString? to String? conversions

Swift SVN r25596
2015-02-27 05:30:11 +00:00
Chris Willmore
fc561cd7ea Fix errant fixit "as!" -> "as?!"
"let x: Int? = 5 as Any as! Int" now suggests changing "as!" to "as?"
instead of "as?!".

rdar://problem/19883819

Swift SVN r25490
2015-02-23 22:59:46 +00:00
Chris Willmore
404ad4392b Add tests for <rdar://problem/19831698> Incorrect 'as' fixits offered for invalid literal expressions
This is the same issue as <rdar://problem/19831919>, which was fixed in
r25346.

Swift SVN r25347
2015-02-17 03:49:42 +00:00
Chris Willmore
fdf4c035e9 Only suggest appending 'as! T' if there's a chance that the conversion would succeed.
<rdar://problem/19831919> Fixit offers as! conversions that are known to always fail

Swift SVN r25346
2015-02-17 03:42:52 +00:00
Joe Pamer
a3122ecf92 Provide a better, tailored diagnostic for result-type mismatches. (rdar://problem/19800727)
These changes include ChrisW's code review feedback.

Swift SVN r25340
2015-02-17 01:57:20 +00:00
Joe Pamer
81df1eeee0 Revert "Provide a better, tailored diagnostic for result-type mismatches. (rdar://problem/19800727)"
This reverts commit r25319.

Swift SVN r25333
2015-02-16 23:46:59 +00:00
Joe Pamer
6e9ddbafd0 Provide a better, tailored diagnostic for result-type mismatches. (rdar://problem/19800727)
Swift SVN r25319
2015-02-16 20:00:04 +00:00
Joe Pamer
4d86ddc692 When checking if a decl with trivial accessors is settable, make sure it actually has a setter. Not doing so can lead to improper projections from rvalue to lvalue, and cause crashes during SIL generation. (rdar://problem/19781739)
Swift SVN r25215
2015-02-12 01:17:09 +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
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