Commit Graph

425 Commits

Author SHA1 Message Date
Chris Lattner
8c3e62d7c5 Provide contextually sensitive conversion failure messages for situations in
which we have a contextual type that was the failure reason.  These are a bit
longer but also more explicit than the previous diagnostics.



Swift SVN r30669
2015-07-26 23:06:40 +00:00
Chris Lattner
66683f94f9 Eliminate the "IsReturnExpr" bit from the AST - it was a poorly maintained
version of the new CTP_ReturnStmt conversion, used to generate return-specific 
diagnostics.  Now that we have a general solution, we can just use that.

This improves diagnostics in returns for accessors, since they were apparently
not getting the bit set.


Swift SVN r30665
2015-07-26 22:05:40 +00:00
Chris Lattner
aa68b5adf7 add a 'purpose' for convertType in typeCheckExpression which will allow us
to produce more specific and helpful diagnostics.  NFC since it isn't 
used yet.


Swift SVN r30664
2015-07-26 21:48:50 +00:00
Chris Lattner
ad501d6da4 move ExistentialEraser (awesome name btw, I do not read it as an eraser of
existentials :-) into CSDiags, its only client.  Make the class private as
well.  NFC.


Swift SVN r30660
2015-07-26 20:53:50 +00:00
Chris Lattner
4cba61fbb0 Refactor things a bit, NFC:
typeCheckExpression takes a convertType and a contextualType, but the only
client of contextualType is pattern binding initialization that wants to
provide a hint to the initializer, but the type may not be fully formed
(e.g. just Array instead of Array<Int>) so it can't provide a full 
convertType to that type.

After trying various ways of eliminating the concept and failing, repaint it
instead:  instead of typeCheckExpression taking *both* a convertType and a
contextualType (even though they are mutually exclusive), have it only take
a single convertType and add a bit to TypeCheckExprOptions to indicate whether
it is a hint or a strong conversion.  This simplifies all the callers of
typeCheckExpression and makes further evolution simpler.



Swift SVN r30658
2015-07-26 20:38:57 +00:00
Chris Lattner
467cd07968 Two changes:
- Improve handling of if_expr in a couple of ways: teach constraint simplification
   about IfThen/IfElse and teach CSDiags about the case when the cond expr doesn't match
   BooleanType.  This is rarely necessary, but CSDiags is all about cornercases, and this
   does fix a problem in a testcase.
 - Be a bit more specific about the constraint failure kind (e.g. say subtype) and when
   we have a protocol conformance failure, emit a specific diagnostic about it, instead of
   just saying that the types aren't convertible.




Swift SVN r30650
2015-07-26 05:31:12 +00:00
Chris Lattner
d91f5861d2 Change diagnoseFailure() for unavoidable failures to stop doing anything with
conversion failures, making a bunch of diagnostics more specific and useful.

UnavoidableFailures can be very helpful, but they can also be the first constraint
failure that the system happened to come across... which is not always the most
meaningful one.  CSDiag's expr processing machinery has a generally better way of
narrowing down which ones make the most sense.


Swift SVN r30647
2015-07-26 04:09:34 +00:00
Chris Lattner
0a3197390f Various changes:
- Don't "aka" a Builtin.Int2123 type, it just makes a bad diagnostic worse.
 - Split out the predicate that CSDiag uses to determine what a conversion
   constraint is to a helper fn, and add subtype constraints to the mix.
 - Move eraseTypeData into CSDiag (its own client) as a static function.
 - Make eraseTypeData be a bit more careful about literals, in an attempt to
   improve diagnostics when literals get re-type-checked.  It turns out that
   this still isn't enough as shown by the regression on the 
   decl/func/default-values.swift testcase, and the 
   Constraints/dictionary_literal.swift testcase where one bad diagnostic turns
   into another different one, but I'll keep working on it.
 - Beef up diagnoseContextualConversionError and the caller to it to be more
   self contained and principled about the conversion constraints it digs out
   of the system.  This improves the diagnostics on a couple of cases.



Swift SVN r30642
2015-07-26 00:29:40 +00:00
Chris Lattner
31e91a09d9 consolidate a duplicate diagnostic id into an existing one, and convert some
code to use a standardized approach to emitting "no arguments" call issues.


Swift SVN r30640
2015-07-25 21:38:48 +00:00
Chris Lattner
2b90306f87 remove ConversionTypes from ConstraintSystem and simplify code now that noone uses it.
Swift SVN r30637
2015-07-25 20:27:38 +00:00
Chris Lattner
b0449d5c65 Change typeCheckCondition and solveForExpression to stop using
setConversionType along with the constraints they install.  The constraints
should be enough by themselves, and CSDiags shouldn't need them to
bias the solution.

Of course, the constraints weren't enough, so improve CSDiags so that it can
do the right thing without them.



Swift SVN r30636
2015-07-25 20:25:09 +00:00
Chris Lattner
72e3c30c48 Change getBoundTypesFromConstraint to use simplifyLocatorToAnchor which is
more correct and general than "getDiagnosticTypeFromExpr".  Eliminate the
old function.


Swift SVN r30629
2015-07-25 16:45:51 +00:00
Chris Lattner
94bf2beb4c Add the ability for clients of typeCheckChildIndependently to specify a contextual type.
Swift SVN r30614
2015-07-25 01:25:42 +00:00
Chris Lattner
5fae58c67f remove getUserFriendlyTypeName.
Swift SVN r30613
2015-07-25 01:18:37 +00:00
Chris Lattner
622ea5e2f6 wind down most of CSDiag's uses of getUserFriendlyTypeName to pass the Type
directly into the diagnostics subsystem.  This ensures a more consistent 
treatment of type printing (e.g. catches a case where a diagnostic didn't 
single quote the type) and gives these diagnostics access to "aka".


Swift SVN r30609
2015-07-25 00:54:05 +00:00
Chris Lattner
1a61bab17c with recent changes, we can significantly simplify getUserFriendlyTypeName...
before eliminating it completely.


Swift SVN r30606
2015-07-25 00:24:50 +00:00
Chris Lattner
4e69aebbbd Introduce a new TCC_AllowLValue bit to inform
typeCheckArgumentChildIndependently when we want an lvalue back, 
instead of it always producing an lvalue.  Provide it in a couple of
places, the most interesting of which is when forming a call to an 
operator where an InOutExpr is implicitly provided by the fact that
the operator is an 'assignment' operator (something we don't actually
model right in the language at the moment for unary operators).

Producing this uses the candidate list we get from analyzing the
function, which makes this the first example of using the callee to
provide type information when analyzing an argument subexpression.

All this work for NFC. :-)


Swift SVN r30600
2015-07-24 23:17:57 +00:00
Chris Lattner
e78bc00f43 split the collection and filtering of the CalleeCandidateInfo list into
two parts, allowing the collection of the candidate list to be done before
the argument expression is type checked.  NFC.


Swift SVN r30599
2015-07-24 23:02:29 +00:00
Chris Lattner
87442c6f5d remove dead code, nfc
Swift SVN r30595
2015-07-24 22:36:44 +00:00
Chris Lattner
cecf90469b generalize a bool into an option set, NFC.
Swift SVN r30590
2015-07-24 20:44:37 +00:00
Chris Lattner
629a35215f reapply r30570, now that Sema preserves type sugar more correctly:
type check the subexpressions of a callexpr more consistently, 
always checking the arguments independently (not just if one argument 
is inout). This routes around issues handling tuples, and brings more
consistency to the experience. Factor this logic out and use it for
operators and subscripts as well.



Swift SVN r30583
2015-07-24 18:21:48 +00:00
Ted Kremenek
f880276750 Revert "type check the subexpressions of a callexpr more consistently, always checking the arguments independently (not just if one argument is inout). This routes around issues handling tuples, and brings more consistency to the experience. Factor this logic out and use it for operators and subscripts as well."
This reverts commit r30570.

This was causing 'Swift :: stdlib/FixedPointDiagnostics.swift.gyb' to fail.

Swift SVN r30571
2015-07-24 07:48:39 +00:00
Chris Lattner
e28c907e86 type check the subexpressions of a callexpr more consistently, always checking the arguments
independently (not just if one argument is inout).  This routes around issues handling tuples,
and brings more consistency to the experience.  Factor this logic out and use it for operators 
and subscripts as well.

This improves a small collection of diagnostics, including the infamous:

   // Infer incompatible type.
-  func6(fn: {a,b->Float in 4.0 })    // expected-error {{cannot convert return expression of type 'Double' to expected return type 'Float'}}
+  func6(fn: {a,b->Float in 4.0 })    // expected-error {{cannot invoke 'func6' with an argument list of type '(fn: (_, _) -> Float)'}}
+  // expected-note @-1 {{expected an argument list of type '(fn: (Int, Int) -> Int)'}}




Swift SVN r30570
2015-07-24 06:14:27 +00:00
Chris Lattner
b947f60659 merge 4 diagnostics into 2 by changing the diagnostic to take a bool.
In a CallExpr, evaluate the function subexpr before the argument subexpr,
in prep for being able to use this type info to propagate them onto the
arguments when available.  NFC.



Swift SVN r30567
2015-07-24 05:28:23 +00:00
Chris Lattner
39adf6dbd3 fix unused variable warning introduced by my last patch
Swift SVN r30565
2015-07-24 05:02:17 +00:00
Chris Lattner
ef553f47cf fix a FIXME by having diagnoseGeneralOverloadFailure() re-typecheck the
argument of a failed call with typeCheckArbitrarySubExprIndependently,
which exposed some cases where ErrorType from outer solutions would be
left around on ParamDecls in ClosureExprs.  Fix this all, which has NFC
on the testsuite.


Swift SVN r30563
2015-07-24 05:00:18 +00:00
Chris Lattner
04cca603c8 Start peering through the fog of ClosureExprs, using ambiguously typed subexprs to
diagnose problems inside of them instead of punting on them completely.

This leads to substantially better error messages in many cases, fixing:
 <rdar://problem/19870975> Incorrect diagnostic for failed member lookups within closures passed as arguments ("(_) -> _")
 <rdar://problem/21883806> Bogus "'_' can only appear in a pattern or on the left side of an assignment" is back
 <rdar://problem/20712541> QoI: Int/UInt mismatch produces useless error inside a block

and possibly others.  We are not yet capitalizing on available type information we do
have about closure exprs, so there are some cases where we produce
  "error: type of expression is ambiguous without more context"
when this isn't strictly true, but this is still a huge step forward.



Swift SVN r30547
2015-07-23 20:31:43 +00:00
Chris Lattner
dff93b512b Now that we have the notion of an uncurry level, we can do a lot more
detailed analysis of callees, which give us overload sets in more cases,
producing notes more consistently, and producing much better diagnostics
for the curried cases in test/Constraints/diagnostics.swift.

This also allows us to eliminate getCalleeName, which simplifies things
in CSDiags.


Swift SVN r30491
2015-07-22 05:37:39 +00:00
John McCall
50a667b295 Instead of assuming that the return type of a closure
with no returns *must* be (), add a defaulting constraint
so that it will be inferred as () in the absence of
other possibilities.

The chief benefit here is that it allows better QoI when
the user simply hasn't yet written the return statement.

Doing this does regress a corner case where an attempt
to recover from an uncalled function leads to the
type-checker inferring a result for a closure that
doesn't make any sense at all.

Swift SVN r30476
2015-07-22 00:13:02 +00:00
Chris Lattner
a32947cbb2 Introduce the notion of an uncurry level to CalleeCandidateInfo to start
rationalizing how it handles members and curried functions, also paving
the way for future improvements.  This implements the infrastructure but
keeps the functionality the same (the only functionality change is that
it works a bit better with vardecls of function type).



Swift SVN r30464
2015-07-21 21:59:47 +00:00
Chris Lattner
a5e2a158cd refactor closeness computation to share code between SubscriptExprs and everything else. NFC
Swift SVN r30452
2015-07-21 18:00:36 +00:00
Chris Lattner
c16d2f7f94 refactor the code for collecting callee candidate lists and reporting available
overload sets out to a new CalleeCandidateInfo class in prep for other changes.  
NFC.


Swift SVN r30445
2015-07-21 06:03:17 +00:00
Chris Lattner
86439e9c4e Improve some diagnostics around invalid calls to ClosureExprs and random values of function type,
fixing:
<rdar://problem/20789423> Unclear diagnostic for multi-statement closure with no return type
<rdar://problem/21829141> BOGUS: unexpected trailing closure
<rdar://problem/21784170> Incongruous `unexpected trailing closure` error in `init` function which is cast and called without trailing closure.



Swift SVN r30443
2015-07-21 05:34:36 +00:00
Chris Lattner
79838f6dbe fix a case in CSGen where it gets an ErrorType back and splats it onto the AST,
instead of treating it as an erroneous subexpr.  This was causing <<error type>> to pop
out in diagnostics, and had a hackaround that dissolves now from CSDiags.



Swift SVN r30442
2015-07-21 05:03:38 +00:00
John McCall
d51a922d3e Returning false from an expression-specific diagnoser is
apparently not what you're supposed to do.

Swift SVN r30436
2015-07-21 04:32:48 +00:00
John McCall
1ee392e8cd Do defensive coding properly this time.
Swift SVN r30432
2015-07-21 01:23:31 +00:00
Chris Lattner
5d3dc0d77b Now that sufficient complexity is pushed into the right corners of the compiler,
we can start taking advantage of ambiguously typed subexpressions in CSDiags.  We
start by validating the callee function of ApplyExprs, which substantially improves
our abilities to generate precise diagnostics about malformed calls.

This is the minimal introduction of this concept to CSDiags, a lot of refactoring
is yet to come, however, this is enough to resolve:

<rdar://problem/21080030> Bad diagnostic for invalid method call in boolean expression
<rdar://problem/21784170> Incongruous `unexpected trailing closure` error in `init` function which is cast and called without trailing closure.

one of the testcases from:
<rdar://problem/20789423> Unclear diagnostic for multi-statement closure with no return type

and a bunch of other places where we got weird "unexpected trailing closure" 
diagnostics that made no sense.  As usual, it is two steps forward and one step back,
as this exposed some other weird latent issues like:
<rdar://problem/21900971> QoI: Bogus conversion error in generics case




Swift SVN r30429
2015-07-21 01:06:55 +00:00
John McCall
0ea7b2fba9 Fix some validation-test regressions, mostly by tweaking tests
but also by being a little more defensive during recovery.

Swift SVN r30424
2015-07-21 00:32:26 +00:00
John McCall
bc3b47b98a Infer the return type of a closure to be () if it contains no
return statements, or a return statement with no operand.

Also, fix a special-case diagnostic about converting a return
expression to (1) only apply to converting the actual return
expression, not an arbitrary sub-expression, and (2) use the
actual operand and return types, not the drilled-down types
that caused the failure.

Swift SVN r30420
2015-07-20 21:52:18 +00:00
Chris Lattner
ab487a17b5 Introduce a new TypeCheckExprFlags::AllowUnresolvedTypeVariables option,
which allows solving of a constraint system to succeed without emitting
errors in the face of ambiguous solutions.  This is important for CSDiag
because it is in the business of trying to solve subexpressions of a global
expression - and it wants to know the difference between a subexpression
that is inherently impossible to solve, vs one that is simply ambiguous
because its context has been removed.

Use this in CSDiag's typeCheckChildIndependently() to provide it an
extra flag that enables this behavior.  This is currently unused, so NFC 
with this patch.


Swift SVN r30402
2015-07-20 16:16:54 +00:00
Chris Lattner
29aa6dd3cc teach FailureDiagnosis::typeCheckChildIndependently not to recurse into
DiscardAssignmentExpr's, because they require context to typecheck anyway
and doing so triggers bogus errors about _ needing to be on the LHS of an
assignment.  There is a correct way to fix this, but layers of issues need
to be peeled off before that can happen.

This fixes <rdar://problem/21883806> Bogus "'_' can only appear in a pattern or on the left side of an assignment" is back

but the new diagnostic that is revealed now that this bogus one is removed is
also really bad.



Swift SVN r30369
2015-07-18 06:09:29 +00:00
Chris Lattner
9a20f5551d change SubscriptExpr::getLoc() to return the location of the [ instead of the start of the subscript base expression.
Swift SVN r30365
2015-07-18 05:30:37 +00:00
Ted Kremenek
cfb1893ffd Revert "change SubscriptExpr::getLoc() to return the location of the [ instead of the start of the subscript base expression. NFC on the testsuite."
This reverts commit r30320.

This was breaking TEST 'SourceKit :: Indexing/index.swift'.

Swift SVN r30330
2015-07-17 20:46:12 +00:00
Chris Lattner
f1c6d9884a change SubscriptExpr::getLoc() to return the location of the [ instead of
the start of the subscript base expression.  NFC on the testsuite.


Swift SVN r30320
2015-07-17 17:46:10 +00:00
Chris Lattner
f3dc974675 introduce a "diagnose" forwarding helper function on the FailureDiagnosis class
to avoid having to use CS->TC.diagnose everywhere.

Also, change SubscriptExpr diagnostics to put the caret on the [ of the subscript
instead of at the start of the base expression.  For example, instead of:

error: cannot subscript a value of type '[Int]?'
    return foo.array[0]
           ^~~~~~~~~
emit:

error: cannot subscript a value of type '[Int]?'
    return foo.array[0]
           ~~~~~~~~~^



Swift SVN r30318
2015-07-17 16:32:48 +00:00
Chris Lattner
09cc2c831c Teach subscript candidate matching about the fact that self can mismatch with its available
value, and use that to rank a problem as very specific.  This required indicating a difference
between singular argument mismatch vs self mismatch and single-argument mismatch (which is very
specific) as being different from the argument list in general mismatching (which matters to
differentiate argument lists that contain a single argument).  

These extra mechanics combine to fix <rdar://problem/21362748> [WWDC Lab] QoI: cannot subscript a value of type '[Int]?' with an index of type 'Int'



Swift SVN r30305
2015-07-17 06:28:48 +00:00
John McCall
a0ee7b2772 Don't look through 'try!' in getSemanticsProvidingExpr().
To support this, make 'try' and 'try!' no longer IdentityExprs
and give them a common base class to simplify the sorts of
analyses and transformations that do want to treat them
as identity-like.

Note that getSPE() still looks through normal 'try', since
the overwhelming proportion of clients will consider it
semantically equivalent to the undecorated expression.

Change getValueProvidingExpr() to look through try!, since
it's allowed to return something with slightly different
semantics, and use it in the unused-result diagnostic.

Fixes a large number of bugs, mostly uncaught, with SILGen
peepholes that use getSPE() and therefore were accidentally
looking through try!.  <rdar://21515402>

Swift SVN r30224
2015-07-15 19:34:18 +00:00
Doug Gregor
d7ccd18faa Split ConstraintSystem::solve() into a top-level and a recursive entrypoint.
NFC, but improves sanity because the two uses had different meanings
for the "bool" result :)

Swift SVN r30177
2015-07-13 23:50:04 +00:00
Chris Lattner
cf14158405 When type checking an arbitrary subexpression of the current node, we can run
into trouble when we dive into a subexpr of a ClosureExpr, because that subexpr
may refer to type variables on the closureexpr's parameters.

Check for this case, and refuse to dive into the subexpr in this case.  It would
be great to rewrite the closure parameter types to Type() or ErrorType or something
so that we can proceed even in this case, but this causes us to fail to catch
nested constraint checking failures.

This was figured out while working on other things, but fixes a validation test.



Swift SVN r30135
2015-07-13 05:34:31 +00:00
Chris Lattner
7ac676541c rename two methods to indicate that they must only be used on immediate children, NFC.
Swift SVN r30134
2015-07-13 05:00:20 +00:00