Commit Graph

1092 Commits

Author SHA1 Message Date
Doug Gregor
ff8e91399b Merge pull request #1200 from gregomni/generic-func-args
Replace use of getArchetype() in diagnoseGenericParameterErrors()
2016-02-05 13:58:57 -08:00
Max Moiseev
61c837209b Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-02-04 16:13:39 -08:00
gregomni
5ba28eda3d Replace use of getArchetype() in diagnoseGenericParameterErrors()
This is a quick follow-up to
<https://github.com/apple/swift/pull/1160>, to replace the becoming
deprecated getArchetype() with doing the same thing via calling through
to ArchetypeBuilder with a declContext.

Uses findGenericSubstitutions() to do so. So this site could take
advantage of destructuring of more complex params containing generics.
Right now, though, that never happens. For complex params the
(unfortunately, worse) diagnosis happens in diagnoseFailureForExpr() on
the argument expression before reaching here. I’d like to improve that
in future work.
2016-02-04 11:56:13 -08:00
Slava Pestov
99b0e77d35 Merge pull request #1160 from gregomni/generic-func-args
[Sema] Extend callee diagnosis to complex args including generics, e.g. (Void) -> T
2016-02-03 22:55:15 -08:00
gregomni
6b30695869 Extend callee diagnosis to complex args including generics, e.g. (Void) -> T
Correctly determine callee closeness for func/ops that include generics
as part of more complicated parameters, i.e. tuple or closure args
containing generics as elements or args/results. Still only handling
single archetypes.

Also added code to check generic substitutions already made in the callee
parameters, which further helps diagnosis.
2016-02-03 22:54:19 -08:00
practicalswift
10c31294d4 [gardening] Substitute "substitions" with "substitutions". 2016-02-02 10:19:33 +01:00
Chris Lattner
8cc0ab170a fix a potential problem that Jordan noticed by inspection, NFC on the testsuite. 2016-02-01 21:02:00 -08:00
Chris Lattner
6173170c33 fix SR-650: REGRESSION: Assertion failed
When we have a contextual type of Optional<SomeNominal>, we get overload
lookup results indicating that the found member needs to look through the
optional.  Do so!
2016-02-01 13:22:45 -08:00
Chris Lattner
a63be90828 fix compiler_crashers/28219-swift-lvaluetype-get.swift
Not all types are l-valuable, notably InoutType's.  This seems like a
weird restriction to put in the type checker, but it is the cleanest
solution to this.  The better solution would be to change how
inoutexpr/inouttype are represented completely... maybe someday.
2016-01-29 23:18:33 -08:00
Chris Lattner
ff34db7950 fix a few compiler crashers
These were due to CSDiags not reverting the semantic expr embedded in CollectionExprs
when retypechecking them.
2016-01-29 21:13:57 -08:00
saisi
535d400dc6 Fixed niggling typos 2016-01-29 23:16:25 -05:00
gregomni
fc3a264ea9 Improve diagnoses on args to generic members
In both figuring out candidate closeness and in diagnosing generic
parameter errors, if the parameter is a GenericTypeParamType, get its
decl’s archetype to perform archetype substitutability checking upon.
2016-01-28 10:23:14 -08:00
gregomni
e811a64af3 Further improvement of diagnoses on args to generic functions
If the mismatched argument is on an archetype param, check to see
whether the argument conforms to all of the protocols on the archetype,
using a specific does-not-conform diagnosis if one or more protocols
fail.

Also added another closeness class
`CC_GenericNonsubstitutableMismatch`, which happens when more than one
argument is a mismatch, but all the failing arguments are of the same
type and mismatch only because of substitutability. This closeness is
farther away than normal `CC_ArgumentMismatch` so that if we note
expected matches, we’ll prefer non-generic matches. But if this is the
result, we can still produce the specific conforms-to-protocol
diagnosis (since, in a sense, it’s only one type of argument that is
wrong even though it is multiple arguments).
2016-01-26 20:07:20 -08:00
Chris Lattner
b5694e941e fix 28241-swift-valuedecl-isaccessiblefrom.swift 2016-01-25 22:06:14 -08:00
Doug Gregor
8336419844 Include completion source location information compound DeclNames.
When one spells a compound declaration name in the source (e.g.,
insertSubview(_:aboveSubview:), keep track of the locations of the
base name, parentheses, and argument labels.
2016-01-25 14:13:13 -08:00
Chris Lattner
995506a5e2 Improve the generic "expression...is ambiguous without more context" error in a few ways:
- Improve the specific cases of nil and empty collection literals.
- Improve cases of contextual member lookup where the result type of the looked up member disagrees with context.
- Add some fixme's to the testsuite for cases of this diagnostic that should be diagnosed in other ways.
2016-01-22 22:58:26 -08:00
Chris Lattner
2d9114665c Implement <rdar://22207630> QoI: UncurriedCandidate should handle ClosureExprs
This standardizes processing of callees in invalid applyexprs, eliminating
bogus diagnostics like:
t.swift:6:2: error: cannot invoke closure of type '() -> _' with an argument list of type '()'

we now properly diagnose the example in closure/closures.swift as ambiguous,
but don't do a particularly good job of saying why.  That is to follow.
2016-01-22 20:33:23 -08:00
Chris Lattner
cd731df0cf Eliminate the argsHaveTrailingClosure argument to evaluateCloseness
now that we can get it off of "this". NFC.
2016-01-22 20:02:06 -08:00
Chris Lattner
c72b337af1 Fix SR-599 - Function with unresolved generic diagnosed as property
There are two problems here, first we were diagnosing type member
constraints with the "function 'foo' was used as a property" error,
which doesn't make sense.

Second, we were diagnosing member constraints as lookup failures when
the constraint was actually referring to an archetype in its anchor
expression that wasn't resolved.  Address this by simply ignoring the
constraint and letting ambiguity resolution handle it.

Before:
t.swift:5:9: error: function 'foo' was used as a property; add () to call it

After:
t.swift:5:9: error: generic parameter 'T' could not be inferred
let a = foo()
t.swift:4:6: note: in call to function 'foo'
func foo<T: IntegerType>() -> T.Type { return T.self }

Thanks to Jordan for noticing this!
2016-01-22 16:10:04 -08:00
practicalswift
45049f2763 [gardening] Fix recently introduced typos 2016-01-22 22:37:54 +01:00
Chris Lattner
e15d08e38f Merge pull request #1042 from gregomni/sr-69
[SR-69][Sema] Improved quality of diagnoses messages
2016-01-22 13:18:56 -08:00
Chris Lattner
6723acccf9 Use TypeExpr::getInstanceType to simplify some code, NFC. 2016-01-22 12:05:59 -08:00
gregomni
05ebb021ba Add a slightly less close than CC_OneArgumentMismatch closeness.
Producing single argument mismatches involving generics causes some
gross looking error messages if the generic mismatches get put into the
same closeness bucket as non-generic mismatches.

E.g. `var v71 = true + 1.0` used to produce `error: cannot convert
value of type 'Bool' to expected argument type 'Double’`, but would now
end up with `binary operator '+' cannot be applied to operands of type
'Bool' and 'Double’` `overloads for '+' exist with these partially
matching parameter lists: (Double, Double), (T, T.Stride), (T.Stride,
T)`.

Resolve this by adding CC_OneGenericArgumentNearMismatch and
CC_OneGenericArgumentMismatch, that are similar but ever so slightly
not as close as a mismatch involving non-generic functions. This gets
back the original error message in cases like the above, because there
is only one declaration of `+` which partially matches and is
non-generic, and the generic partial matches are now farther away.

But now single arg mismatches and nearness work for single-archetype
generic functions, as in the additions to the SR-69 test at the end of
deduction.swift.
2016-01-22 10:24:03 -08:00
gregomni
b697a208fc Check for nearness to bound type when generic arg doesn't match
Also made evaluateCloseness into a member.
2016-01-22 08:04:16 -08:00
gregomni
2b301938e0 [SR-69][Sema] Improved quality of diagnoses messages
In the specific case of sr-69, and in a bunch of other code where
errors arise involving generic function application, better type
constraint failure diagnoses are being masked by the overly
conservative implementation in evaluateCloseness(). If the actual arg
types didn’t exactly match the parameter types, we’d always diagnose a
non-specific arguments-don’t-match error instead of allowing discovery
of better errors from the constraint system.

This commit adds more cases where evaluateCloseness will return
CC_ExactMatch, specifically in application of functions with one or
more arguments of a single archetype, like `func min<T: Comparable>(T,
T) -> T`. It verifies that the actual argument type
isSubstitutableFor() the archetype, and that all such arguments are of
the same type. Anything more complicated than that still has the
previous behavior of not matching at all.

I think the final answer here ought to be to make a constraint system
with type variables for any archetypes, add appropriate constraints to
the actual args and then see if the system can solve all the argument
constraints at once. That’s because the next most complicated set of
things to handle in the stdlib are things like `func -<T:
Strideable>(lhs: T, rhs: T.Stride)` where generic argument types depend
on each other. I tried attacking that, but it was too big of a bite for
me to manage all at once. But there are FIXME’s here to try that again
at some point.

New tests for SR-69 are at the end of deduction.swift, and the rest of
the test changes are generally improved deduced diagnoses. I think the
changed diagnoses in materializable_restrictions.swift is the only one
which is worse instead of better, and that’s just because the previous
general message mentioned `inout` basically accidentally. Opportunity
for further improvement (a new diagnosis maybe) there.

Validation tests run and passed.
2016-01-21 23:48:54 -08:00
Chris Lattner
f102876943 Improve diagnostics for unbound archetypes coming from a type, to indicate
information about where the archetype was defined.  Before:

t.swift:6:17: error: generic parameter 'T' could not be inferred
var a : Int = A.foo()
                ^

After:

t.swift:6:17: error: generic parameter 'T' could not be inferred
var a : Int = A.foo()
                ^
t.swift:2:8: note: 'T' declared as parameter to type 'A'
struct A<T> {
       ^
2016-01-21 17:37:39 -08:00
Chris Lattner
2910d54cf6 Fix <rdar://problem/24267414> QoI: error: cannot convert value of type 'Int' to specified type 'Int'
When a contextual conversion has a matching type, don't diagnose it as a
conversion error, the problem is due to something else (in this case, an
unresolved archetype somewhere else in the expression).

Before:
t.swift:6:17: error: cannot convert value of type 'Int' to specified type 'Int'
After:
t.swift:6:17: error: generic parameter 'T' could not be inferred

This should still be a bit better to provide information about where the T
archetype came from, but at least now it isn't completely wrong diagnostic.
2016-01-21 17:37:39 -08:00
Chris Lattner
2dcad44ff1 Fix <rdar://problem/23904262> QoI: ivar default initializer cannot reference other default initialized ivars?
This was previously fixed for method calls, but this part handles property accesses.
2016-01-20 22:50:54 -08:00
Chris Lattner
2ae2e5ffa4 Fix <rdar://problem/22326930> QoI: "argument for generic parameter 'Element' could not be inferred" lacks context
Now that diagnostic emission is detangled from default argument handling.
2016-01-20 22:30:14 -08:00
Chris Lattner
638816e621 Now that resolveLocatorToDecl has a single caller, move it to CSApply.cpp
and make it a static function.  NFC.
2016-01-20 21:56:04 -08:00
Chris Lattner
005809d8a9 Significantly simplify noteTargetOfDiagnostic by cutting it off of
resolveLocatorToDecl entirely.  Rename it to noteTargetOfMissingArchetype.
NFC.
2016-01-20 21:52:28 -08:00
Chris Lattner
e901bd03dc Continue whittling away at complexity in resolveLocatorToDecl.
This time remove the hacky/fixme code to drill into parameter lists
which is dead.
2016-01-20 20:53:52 -08:00
Chris Lattner
a230d402d2 simplify some code to eliminate unnecessary tests, NFC. 2016-01-20 18:08:29 -08:00
Chris Lattner
5957a9274e Reapply Simplify resolveLocatorToDecl to return a ConcreteDeclRef instead of
having it return a ResolvedLocator, allowing us to remove ResolvedLocator

The previous commit accidentally dropped the hunk in CSApply.cpp.  NFC.
2016-01-20 18:08:29 -08:00
Doug Gregor
fd3f03f3be Remove UnresolvedConstructorExpr.
UnresolvedConstructorExpr is not providing any value here; it's
essentially just UnresolvedDotExpr where the name refers to an
initializer, so use that instead. NFC
2016-01-20 17:09:02 -08:00
Doug Gregor
5f07f6b12f Remove all vestiges of UnresolvedSelectorExpr. NFC 2016-01-20 17:09:01 -08:00
Doug Gregor
ecfde0e71c Start parsing names with argument labels.
Basic implementatation of SE-0021, naming functions with argument
labels. Handle parsing of compound function names in various
unqualified-identifier productions, updating the AST representation of
various expressions from Identifiers to DeclNames. The result doesn't
capture all of the source locations we want; more on that later.

As part of this, remove the parsing code for the "selector-style"
method names, since we now have a replacement. The feature was never
publicized and doesn't make sense in Swift, so zap it outright.
2016-01-20 17:09:01 -08:00
Max Moiseev
9a018bd77d Merge remote-tracking branch 'origin/master' into swift-3-api-guidelines 2016-01-20 14:38:22 -08:00
Mark Lacey
061c7776d8 Revert "Simplify resolveLocatorToDecl to return a ConcreteDeclRef instead of"
This reverts commit 5ce503c886 because it
breaks the stdlib build with:
  Assertion failed: (!isPolymorphic() && "no args for polymorphic substitution"), function substGenericArgs
2016-01-20 13:23:04 -08:00
Chris Lattner
5ce503c886 Simplify resolveLocatorToDecl to return a ConcreteDeclRef instead of
having it return a ResolvedLocator, allowing us to remove ResolvedLocator.
2016-01-20 10:57:33 -08:00
Chris Lattner
69ba5bc876 Remove shouldDiscardFailures() from ConstraintLocator,
remove shouldRecordFailures() from ConstraintSystem.  NFC.
2016-01-20 10:38:37 -08:00
Chris Lattner
a1112b3c7d Remove Failure and some of the supporting infrastructure. NFC. 2016-01-20 10:28:21 -08:00
Doug Gregor
7d70b704e4 Merge commit '5e11e3f7287427d386636a169c4065c0373931a8' into swift-3-api-guidelines 2016-01-19 23:18:20 -08:00
Chris Lattner
4341ef35cd Move CalleeCandidateInfo to using NameLookupFlags::IgnoreAccessibility
for initializer lookup, allowing it to produce more specific diagnostics
when referring to a private initializer that the compiler can see.

In addition to improving diagnostics, this allows us to eliminate the
NoPublicInitializers failure kind.
2016-01-19 22:52:26 -08:00
Chris Lattner
5a4464fbca Fix <rdar://19935319> QoI: poor diagnostic initializing a variable with a non-class func
It is a common point of confusion that property initializers cannot access self, so
produce a tailored diagnostic for it.

Also, when building implicit TypeExprs for the self type, properly mark them implicit.
2016-01-18 22:37:22 -08:00
Doug Gregor
c4a6902589 Abstract the set of known Foundation entities into a .def-driven enum. NFC
Specifically, we don't want to hard-code the Swift names of these
Objective-C entities, because the importer renaming will affect them.
2016-01-17 23:40:14 -08:00
Chris Lattner
8a41d14b2d Fix <rdar://problem/21429694> QoI: diagnostic for accessing private methods could be improved
When member lookup completely fails and when CSDiags is the one performing
the lookup, reissue another lookup that ignores access control.  This allows
it to find inaccessible members and diagnose them as such, instead of pretending
we have no idea what the user wants.  We now produce an error message like this:

main.swift:1:6: error: 'foo' is inaccessible due to 'private' protection level
 C().foo()
     ^
test.swift:1:35: note: 'foo' declared here
  internal class C { private func foo() {} }
                                  ^

instead of:

main.swift:1:2: error: value of type 'C' has no member 'foo'
 C().foo()
 ^~~ ~~~
2016-01-17 17:13:07 -08:00
Chris Lattner
849ec50a12 Fix <rdar://problem/21269142> Diagnostic should say why enum has no .rawValue member
If someone is trying to refer to the rawValue of an enum that has no
raw type, give them a hint that they need to go do that.
2016-01-17 15:35:22 -08:00
Chris Lattner
85231a20ed Merge pull request #943 from practicalswift/typo-fixes-20160112
[gardening] Fix recently introduced typos
2016-01-11 23:17:15 -08:00
practicalswift
ec113a35b4 Fix recently introduced typos. 2016-01-12 07:45:50 +01:00