Commit Graph

4518 Commits

Author SHA1 Message Date
Doug Gregor
382caab930 Treat the inherited conformances of a protocol conformance as ‘used’.
Swift SVN r27944
2015-04-29 23:20:52 +00:00
John McCall
8d4ad3f87d Fix an off-by-one error in r27902.
Swift SVN r27908
2015-04-29 04:35:54 +00:00
John McCall
8d3f9c8f78 Fix build on case-sensitive filesystems.
Swift SVN r27904
2015-04-29 03:52:43 +00:00
John McCall
bd57e4337c Make TypeCheckError more paranoid in the face of invalid types.
I debated making isBodyThrowing() do this, but decided that
(1) the better recovery mode is to assume that the function
can throw but (2) making isBodyThrowing() return true on an
invalid function would be really weird.

Tested by the crash testsuite.

Swift SVN r27902
2015-04-29 02:52:37 +00:00
Chris Willmore
92acb40f6c Don't synthesize function bodies after type checking is over; they won't
get type checked and verification will fail.

<rdar://problem/20645582> Clan Importer assertion failure on swiftz.

Swift SVN r27901
2015-04-29 02:48:33 +00:00
John McCall
fdcecfcfb7 Move error-handling diagnostics to Sema and check try coverage.
Needs better test-case coverage.

Swift SVN r27898
2015-04-29 00:49:40 +00:00
Doug Gregor
158e23f427 Make sure that we complete any conformances that are used in the AST.
When semantic analysis forms a reference to a conformance that will
persist in the AST (it is "used" in the C++ odr-used sense), complete
that conformance before type checking terminates. This ensures that
the SIL optimizers have complete conformances to work with for, e.g.,
generic specialization. Fixes rdar://problem/20735544.

Swift SVN r27896
2015-04-29 00:08:27 +00:00
Doug Gregor
a30ca2a60d Replace bool parameter to TypeChecker::conformsToProtocol() with an option set.
NFC; we can extend this option set more readily later.

Swift SVN r27894
2015-04-29 00:08:22 +00:00
Chris Lattner
976620b513 random tidying up, rename the raw_ostream form of
ConstraintSystem::dump to ConstraintSystem::print for
consistency with other parts of the compiler.  Enhance
CS::print to print the ID # of a Type Variable, so you
don't have to count them to realize that you're looking
at typevar #13


Swift SVN r27874
2015-04-28 17:50:24 +00:00
Chris Lattner
88e50659f7 fix <rdar://problem/17564699> QoI: Structs should get convenience initializers
The diagnostic we were producing was confusing the user into thinking that
you couldn't have a delegating init on a struct.  Improve the diagnostic and
add a fixit hint.



Swift SVN r27872
2015-04-28 17:01:48 +00:00
Doug Gregor
f53cb8a5e3 Avoid null conformances when comparing a potential requirement and witness.
We might be looking at a protocol requirement, which conforms to a
protocol but has a null conformance. Also, don't bother looking at
completeness: it doesn't matter. Fixes rdar://problem/20608438.

Swift SVN r27860
2015-04-28 04:57:51 +00:00
Chris Lattner
9e6faca3bb Enhance constraints::resolveLocatorToDecl to look through IdentityExpr's like parens,
fixing:
<rdar://problem/18400194> Parenthesized function expression crashes the compiler

it still grosses me out that we're using diagnostics machinery for correctness of
type checking default arguments :-(



Swift SVN r27855
2015-04-28 04:03:46 +00:00
Chris Lattner
5e8b90d23b add \n to another debugging dump() method.
Swift SVN r27854
2015-04-28 03:41:53 +00:00
Doug Gregor
8322b06ce6 Revert "Suggest '==' when trying to constraint a generic type by a concrete type."
This reverts r27834, which toggled some compiler crashers.

Swift SVN r27847
2015-04-28 00:03:16 +00:00
Doug Gregor
95fe505b89 Suggest '==' when trying to constraint a generic type by a concrete type.
Fixes rdar://problem/20636279.

Swift SVN r27834
2015-04-27 23:15:33 +00:00
Chris Lattner
8494651d22 Substantially rework CSApply's building of argument lists for calls.
This fixes <rdar://problem/20494437> SILGen crash handling default arguments
again, and includes a fix for MiscDiagnostics to look through the generated
TupleShuffleExprs in @noescape processing (which tripped up XCTest).

This fixes <rdar://problem/16860940> QoI: Strict keyword arguments loses type sugar in calls
where we'd lose some type sugar.

This fixes sanity in the ASTs: ScalarToTupleExpr now always has consistent
types between its argument and result, so we can turn on AST Verification of it.




Swift SVN r27827
2015-04-27 23:02:09 +00:00
Doug Gregor
3daae5b561 Serialize cross-references to constrained extensions with a generic signature.
Extensions cannot be uniquely cross-referenced, so cross-references to
extensions are serialized with the extended nominal type name and the
module in which the extension resides. This is not sufficient when
cross-referencing the generic type parameters of a constrained
protocol extension, because we don't know whether to get the
archetypes of the nominal type or some extension thereof. Serialize
the canonical generic signature so that we can pick an extension with
the same generic signature; it doesn't matter which we pick, so long
as we're consistent.

Fixes rdar://problem/20680169. Triggering this involves some
interesting interactions between the optimizer and standard library;
the standard library updates in the radar will test this.

Swift SVN r27825
2015-04-27 22:55:47 +00:00
Slava Pestov
fafd0b83ee Attempt to properly handle static global variables
This is based on Jordan Rose's patch from rdar://problem/17597453.

Swift SVN r27821
2015-04-27 22:16:37 +00:00
Ted Kremenek
b9c10c048f Revert "fix <rdar://problem/20494437> SILGen crash handling default arguments"
This was breaking building the XCTest overlay.

Swift SVN r27818
2015-04-27 21:30:48 +00:00
Chris Lattner
d314ed1a0b fix <rdar://problem/20494437> SILGen crash handling default arguments
This was an ugly situation where we'd create an invalid ScalarToTuple in
a situation with default arguments, because CSApply didn't realize that the
default argument causes formation of a specific tuple kind with a single element.

There is more damage in this area, other work coming.


Swift SVN r27811
2015-04-27 19:33:22 +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
227e676b4b clean up diagnoseFailureForAssignExpr, no significant win though.
Swift SVN r27793
2015-04-27 00:45:10 +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
Dmitri Hrybenko
c625cca285 Revert "fix <rdar://problem/17686979> "var" arguments are rejected for @objc conformance"
This reverts commit r27769/27770.  It broke the overlay build.

Swift SVN r27778
2015-04-26 23:40:22 +00:00
Chris Lattner
43c7334abc fix two QoI issues:
- <rdar://problem/16306600> QoI: passing a 'let' value as an inout results in an unfriendly diagnostic
 - <rdar://problem/16927246> provide a fixit to change "let" to "var" if needing to mutate a variable

We now refer to an inout argument as such, e.g.:

t.swift:7:9: error: cannot pass 'let' value 'a' as inout argument
  swap(&a, &b)
        ^

we also produce a note with a fixit to rewrite let->var in trivial cases where mutation is
being assed for, e.g.:

t.swift:3:3: note: change 'let' to 'var' to make it mutable
  let a = 42
  ^~~
  var

The note is produced by both Sema and DI.



Swift SVN r27774
2015-04-26 21:51:50 +00:00
Chris Lattner
bebbdfe001 fix <rdar://problem/17691565> attempt to modify a 'let' variable with ++ results in typecheck error not being able to apply ++ to Float
We now produce diagnostics like:
 - cannot pass 'let' value 'a' to mutating unary operator '++'
 - cannot pass get-only property 'b' to mutating unary operator '++'
 - cannot pass immutable value of type 'Int64' to mutating unary operator '++'



Swift SVN r27772
2015-04-26 20:42:19 +00:00
Chris Lattner
5e9328a312 Fix: <rdar://problem/17686979> "var" arguments are rejected for @objc conformance
Swift SVN r27770
2015-04-26 19:55:28 +00:00
Chris Lattner
e58020b9ab defer using ClosureExpr's is an implementation detail, don't require self. qualification inside of them.
Swift SVN r27768
2015-04-26 18:10:36 +00:00
Chris Lattner
82ef514f99 Reimplement the AST, Sema, and SILGen of defer to be closure based.
Now we bind the defer body into a ClosureExpr and emit it at the point of
the defer.  At any exit points out of the controlled region, we emit a call 
to the closure.

This should cover any problems where expressions cannot be emitted multiple times.
However, this is dramatically more complex than the obvious implementation, so I 
hope this patch can be reverted.



Swift SVN r27767
2015-04-26 17:58:06 +00:00
Chris Lattner
6fb676bfc7 remove some dead state that I added but didn't end up using.
Swift SVN r27763
2015-04-26 16:33:09 +00:00
Chris Lattner
b43a8b5fd5 Diagnose jumps out of defer statements in Sema. This doesn't handle throw
(somewhat ironically, given that we added it for throw) because we model
throw as an Expr currently which makes it more difficult in Sema.  SILGen
catches this situation and any others that I didn't remember to handle here.



Swift SVN r27762
2015-04-26 16:23:18 +00:00
Chris Lattner
fa4f1d86ee Recommit r27756 with an update to diagnostic_constant_propagation_int.swift, which is iOS only.
Swift SVN r27761
2015-04-26 15:56:41 +00:00
Chris Lattner
ee96164996 implement parsing, AST, and basic Sema support for 'defer'.
SILGen support and diagnosing jumps out of a defer aren't done
yet.



Swift SVN r27759
2015-04-26 15:16:37 +00:00
Ted Kremenek
4a227f2661 Speculatively revert "fix <rdar://problem/18213320> enum with raw values that are too big are not diagnosed"
This looks like it caused test 'SILPasses/diagnostic_constant_propagation_int.swift' to fail.

Swift SVN r27757
2015-04-26 15:12:58 +00:00
Chris Lattner
d5ae69b276 fix <rdar://problem/18213320> enum with raw values that are too big are not diagnosed
On that testcase, we now generate:

t.swift:8:22: error: integer literal '123456' overflows when stored into 'UInt8'
  case tooFarByFar = 123456
                     ^
t.swift:7:8: error: integer literal '256' overflows when stored into 'UInt8'
  case twoHundredFiftySix
       ^

instead of spitting out some warnings with no source loc (which Xcode eats).


This patch:
 - Propagates source locations for literals when synthesizing code in various places,
   so we get the right diagnostic at the right spot.
 - Improves the constant folding SIL Pass to print the value overflowing, which is
   necessary for cases with an implicit value (like 256 above), and is general goodness
   for the QoI of the diagnostic anyway.



Swift SVN r27756
2015-04-26 06:21:23 +00:00
Chris Lattner
a475a3326f implement <rdar://problem/19786845> Warn on "let" and "var" when no data is bound in a pattern
We warn like this:
t.swift:3:12: warning: 'let' pattern has no effect; sub-pattern didn't bind any variables
      case let .Bar: println("bar")
           ^~~ ~~~~



Swift SVN r27747
2015-04-26 04:38:13 +00:00
Chris Lattner
6c8e9ac276 change some calls to dyn_cast in boolean contexts to isa.
Swift SVN r27724
2015-04-25 23:34:38 +00:00
Chris Lattner
d18740d603 Fix <rdar://problem/19773562> Closures executed immediately { like this }() are not automatically @noescape
In addition to being better for performance in these cases, this disables the "self." 
requirement in these blocks.  {}() constructs are often used to work around statements
that are not exprs in Swift, so they are reasonably important.

Fixing this takes a couple of pieces working together:
 - Add a new 'extraFunctionAttrs' map to the ConstraintSystem for solution
   invariant function attributes that are inferred (like @noescape).
 - Teach constraint simplification of function applications to propagate 
   @noescape between unified function types.
 - Teach CSGen of ApplyExprs to mark the callee functiontype as noescape
   when it is obviously a ClosureExpr.

This is a very limited fix in some ways: you could argue that ApplyExpr should
*always* mark its callee as noescape.  However, doing so would just introduce a
ton of function conversions to remove it again, so we don't do that.




Swift SVN r27723
2015-04-25 23:34:18 +00:00
Chris Lattner
0e8f0d6bfc fix <rdar://problem/20679379> DI crashes on initializers on protocol extensions
DI makes the assumption that the type of self in an initializer is always
derived from a nominal type.  Now that you can put an initializer body on a
protocol, this isn't true anymore, so teach it about this.



Swift SVN r27714
2015-04-24 23:51:40 +00:00
Devin Coughlin
3de8ec3bca Sema: Consider availability of conforming type when diagnosing protocol witness availability
To be safe, protocol witnesses need to be as available as their requirements.
Otherwise, the programmer could access an unavailable declaration by upcasting
to the protocol type and accessing the declaration via its requirement.

Prior to this commit, we enforced safety by requiring that the annotated
available range of a requirement must be completely contained within the
annotated available range of the witness.

However, there are cases where this requirement is too restrictive. Suppose
there is some super class Super with an availability-restricted method f():

class Super {
  @availability(iOS, introduced=6.0)
  void func f() { ... }
}

Further, suppose there is a protocol HasF with unrestricted availability:

protocol HasF {
  void func f()
}

and then a limited-availability class Sub extends Super and declares a
conformance to HasF:

@availability(iOS, introduced=8.0)
class Sub: Super, HasF {

}

Sub does conform to HasF: the witness for HasF's f() requirement is Super's f().
But Super's f() is less available (iOS 6 and up) than HasF's f() requires
(all versions) and so--prior to this commit--the compiler would emit
an error.

This error is too conservative. The conforming type, Sub,
is only available on iOS 8.0 and later. And, given an environment of iOS 8.0
and later, the availability of the requirement and the witness is the same, so
the conformance is safe.

This false alarm arises in UIKit, where Super is UIView, HasF
is UIGestureRecognizerDelegate, and f() is gestureRecognizerShouldBegin().

The fix is to change the safety requirement for protocol witnesses:
we now require that the intersection of the availabilities of the conforming
type and the protocol requirement is fully contained in the intersection of the
availabilities of the conforming type and the witness. It does not matter if
the containment does not hold for versions on which the conforming type is not
available.

rdar://problem/20693144

Swift SVN r27712
2015-04-24 23:12:19 +00:00
John McCall
af4666bd86 Sema-based coverage testing for error handling, including try.
WIP, mostly because it's not hooked up to anything.

Swift SVN r27711
2015-04-24 23:00:39 +00:00
Chris Lattner
22f2923509 fix <rdar://problem/20075582> Swift does not support short form of dictionaries with tuples (not forming TypeExpr)
TypeExpr formation wasn't handling tuple labels.



Swift SVN r27701
2015-04-24 18:37:08 +00:00
Joe Pamer
3f572cab62 Remove hack to bind throwing initializer overloads based on the presence of a throwing initializer in the overload group.
Swift SVN r27694
2015-04-24 17:48:29 +00:00
Doug Gregor
cf4c23b9cb After we've forced external declaration members, always perform name lookup again.
This was causing the SourceKit regression, because we were ending up
with two synthesized declarations. Revert r27673, which we no longer need.

Swift SVN r27678
2015-04-24 04:44:13 +00:00
Ben Langmuir
267744c8cd Disable an assertion to unbreak code-completion
Temporarily disabling until the underlying issue is addressed so that we
can make progress on code completion.

Swift SVN r27673
2015-04-24 04:16:01 +00:00
Doug Gregor
b95851ecaf Tighten up our validation of potential witnesses during type witness inference.
With prior changes to make conformance checking more lazy, this gets r27617 working.

More auditing and testing of this visitor to follow.

Swift SVN r27658
2015-04-23 23:36:21 +00:00
Doug Gregor
0f55c5a9b9 Eliminate recursion when substituting the model into each witness.
Swift SVN r27657
2015-04-23 23:36:20 +00:00
Doug Gregor
02d25888c9 Clean up the interface to Type::subst(), NFC.
Replace the 'ignoreMissing' boolean flag with a new option set type,
SubstOptions, which is easier to extend. It is not an OptionSet<>
because a follow-on commit will introduce a non-trivial option that
will require more storage.

Also eliminate the LazyResolver parameter, which is no longer
needed. Eliminate the silly TypeChecker::substType(), whose only
purpose was to provide the resolver.

Swift SVN r27656
2015-04-23 23:36:18 +00:00
Chris Willmore
c7c7388cf2 Change do-while to repeat-while.
Change all uses of "do { ... } while <cond>" to use "repeat" instead.
Rename DoWhileStmt to RepeatWhileStmt. Add diagnostic suggesting change
of 'do' to 'repeat' if a condition is found afterwards.

<rdar://problem/20336424> rename do/while loops to repeat/while & introduce "repeat <count> {}" loops

Swift SVN r27650
2015-04-23 22:48:31 +00:00
Doug Gregor
4ae7b13820 Stop trying to fully check a conformance when we query its existence.
This eliminates nonsensical recursion when working with protocol
conformances, and makes their checking more lazy. Start to improve
name lookup to deal with protocol witnesses more lazily, generalizing
the solution we had to all protocol conformances and making it more
directed. We're not done here, as the FIXMEs in the code completion
test imply: this replace-the-requirement-with-the-witness behavior
needs to be sunk down into the AST level so it also applies to
unqualified lookup, visible-decl lookup, etc.

Swift SVN r27639
2015-04-23 18:20:57 +00:00