Commit Graph

4105 Commits

Author SHA1 Message Date
Chris Lattner
e41c23801f A bunch of conflated changes:
- Fix TypeCheckExpr.cpp to be more careful when propagating sugar from an 
   argument to the result of the function.  We don't want to propagate parens,
   because they show up in diagnostics later.

 - Restructure FailureDiagnosis::diagnoseFailure() to strictly process the tree
   in depth first order.  Before it would only do this if contextual typing was
   unavailable, leading to unpredictable inconsistencies between diagnostics.

 - Always perform diagnoseContextualConversionError early, as part of the thing
   that calls the visitor, instead of in each visit method.  This may change in
   the future, but is a simplification for now.

 - Make the operator processing code handle the "candidate is an exact match"
   case by emitting a diagnostic indicating that the result type of the operator
   must not match expectations, instead of emitting the silly things like
   "binary operator '&' cannot be applied to two Int operands" which is obviously
   false.

These changes lead to minor improvements across the testsuite, and should make the
diagnostics more predictable for more complex real-world ones, but I haven't gone
through the radars yet.  

Major missing pieces:
 - CallExpr isn't using the same logic that the operators are.
 - When you have a near match (only one argument mismatches) we should specifically
   complain about that argument, instead of spewing an entire argument list.
 - The noescape function attr diagnostic is being emitted twice now.
 



Swift SVN r29733
2015-06-26 07:29:05 +00:00
Chris Lattner
bd915d3625 two changes here:
- When diagnosing an error passing a noescape function to an escapeing function pointer,
   return 'true' to avoid follow-on bogus error messages and notes being produced.
 - Start classifying the closeness of overload matches, to allow future diagnostics to be
   improved.

Note that the second regresses the testcase in test/Constraints/generics.swift because the
decomposeArgumentType function doesn't know to look through the archetype for the protocol
present on the operator, and thus thinks the function only takes one argument.  Advice on
how to best detect this situation is appreciated.



Swift SVN r29731
2015-06-26 05:27:46 +00:00
Chris Lattner
a88acbeece remove unused diagnostic
Swift SVN r29659
2015-06-25 05:04:15 +00:00
Chris Lattner
9891d1172f simplify some code by inverting nesting etc, NFC.
Swift SVN r29657
2015-06-25 04:50:03 +00:00
Devin Coughlin
550b9feb05 [Sema] Improve clarity of fix-it hint to add #available.
As suggested by Jordan, change "add if #available version check" to
"add 'if #available' version check" to make it easier to read.

Swift SVN r29650
2015-06-25 01:03:50 +00:00
Devin Coughlin
5a71aaef6c [Sema] Update availability fix-it to be consistent.
Change the fix-it suggesting adding #available to be consistent with the fix-it
adding @available.

This changes "guard with version check" to "add if #available version check".

rdar://problem/21275857

Swift SVN r29648
2015-06-25 00:23:02 +00:00
Jordan Rose
38c3bce48f Tweak diagnostics for invalid instantiation expressions.
rdar://problem/21334185

Swift SVN r29570
2015-06-23 16:15:42 +00:00
Chris Lattner
741b75018c fix <rdar://problem/21434158> Error message fail in Swift
by tweaking diagnostic text a bit.


Swift SVN r29546
2015-06-22 16:08:11 +00:00
Jordan Rose
8b3d4acccd Allow enum elements with string raw values to default to the name of the element.
Just like enums with integer raw values can get autoincrementing case values,
enums with string raw values get the name of the element. The name is /not/
prefixed with the enum type because the purpose is presumably to interoperate
with a string-based system, which may require either writing or printing the
raw value as a string.

If an enum's raw type is both integer literal convertible and string literal
convertible, the integer side wins. That is, elements without raw values
will get auto-incremented integer values, rather than string values, and will
produce an error if an auto-incremented value cannot be generated.

rdar://problem/15819953

Swift SVN r29542
2015-06-22 00:28:23 +00:00
Jordan Rose
955e130536 Diagnose self-imports of the module being compiled.
The case where this comes up is when people name their app and framework
targets the same thing, or when they've renamed their test target module
in an attempt to avoid issues with  NSClassFromString and differing
runtime names. We currently do various wrong things when this happens,
so just emit an error instead.

I left a hole for our overlays, which use '@exported import <the-current-module>'
to get at their Clang modules. The previous commit means this can be
replaced by -import-underlying-module, but that doesn't help our tests,
which use -enable-source-import for their overlays. Which we should stop doing.

rdar://problem/21254367

Swift SVN r29440
2015-06-17 04:48:01 +00:00
Slava Pestov
7797a459b2 Sema: Minor constrained extensions fixes
- Diagnose instead of crashing when doing this:
  extension Array : MyProto where T : Equatable {}
- Fix crash when Self appeared in where clause
- Finally, improve the diagnostic for this:
  extension Array<Foo> {}

Fixes <rdar://problem/21349794>.

Swift SVN r29379
2015-06-15 02:00:49 +00:00
Joe Groff
d7b9ae72aa Sema: Require '.init' when constructing from a dynamic metatype.
This makes it clearer that expressions like "foo.myType.init()" are creating new objects, instead of invoking a weird-looking method. The last part of rdar://problem/21375845.

Swift SVN r29375
2015-06-14 19:50:06 +00:00
Chris Lattner
9df3cccb06 make the error message and diagnostic location for
throwing operators not marked "try" more specific.


Swift SVN r29368
2015-06-12 18:33:56 +00:00
Joe Groff
bebfa969bd Sema: Allow 'x.init' references on metatype expressions.
If 'x.init' appears as a member reference other than 'self.init' or 'super.init' within an initializer, treat it as a regular static member lookup for 'init' members. This allows a more explicit syntax for dynamic initializations; 'self.someMetatype()' looks too much like it's invoking a method. It also allows for partial applications of initializers using 'someMetatype.init' (though this needs some SILGen fixes, coming up next). While we're in the neighborhood, do some other correctness and QoI fixes:

- Only lookup initializers as members of metatypes, not instances, and add a fixit (instead of crashing) to insert '.dynamicType' if the initializer is found on an instance.
- Make it so that constructing a class-constrained archetype type correctly requires a 'required' or protocol initializer.
- Warn on unused initializer results. This seems to me like just the right thing to do, but is also a small guard against the fact that 'self.init' is now valid in a static method, but produces a newly-constructed value instead of delegating initialization (and evaluating to void).

Swift SVN r29344
2015-06-08 04:11:28 +00:00
Joe Groff
1479a56ab3 Sema: Move semantic constraints on super/self.init out of the parser.
Instead of forcing full application of '{super,self}.init' in the parser, and installing the RebindSelf semantic expr node early, make these constraints to Sema-time checks, and parse '<expr>.init' as a regular postfix production. This is a better separation of concerns, and also opens the door to supporting 'metatype.init()' in more general expression contexts (though that part still needs some follow-up sema work).

Swift SVN r29343
2015-06-08 04:11:16 +00:00
Slava Pestov
086b9961ba Sema: Don't allow static member access on protocol metatypes
If P is a protocol, calling static methods or constructors
via values of type P.Protocol makes no sense, so let's prohibit
this.

Fixes <rdar://problem/21176676>.

Swift SVN r29338
2015-06-07 10:16:23 +00:00
Slava Pestov
322f58d8b1 Sema: Tighten up existential vs generic type parameter distinction
Rename existentialConformsToSelf() to existentialTypeSupported(). This
predicate is the "protocol has no Self or associated type requirements"
check, which is a looser condition than self-conformance. This was being
tested to see if the user could refer to the protocol via an existential
type.

The new existentialConformsToSelf() now checks for protocol being @objc,
and for the absence of static methods. This is used as part of the
argument type matching logic in matchType() to determine if the
existential can be bound to a generic type parameter.

The latter condition is stricter, for two reasons:

1) We allow binding existentials to multiple type parameters all sharing
   the same generic type parameter T, so we don't want the user to be
   able to see any static methods on T.
2) There is an IRGen limitation whereby only existentials without witness
   tables can be passed in this manner.

Using the above, the representsNonTrivialGenericParameter() function
has been renamed to canBindGenericParamToExistential(). It now allows
an existential type to be bound to a generic type parameter only under
the following circumstances:

A) If the generic type parameter has no conformances, the match is allowed.

B) If the generic type parameter has at least one conformance, then all
   of the conformances on the generic type parameter must be
   existentialConformsToSelf() (condition 1 above), and all conformances
   on the existential must be @objc (condition 2 above).

Fixes <rdar://problem/18378390> and <rdar://problem/18683843>, and lays
the groundwork for fixing a few other related issues.

Swift SVN r29337
2015-06-07 10:16:21 +00:00
Slava Pestov
7319a97ab4 Sema: Rewrite witness method calls as ApplyExpr + DeclRefExpr
Special-casing these as MemberRefExprs created an asymmetry
where unbound archetype instance methods (<T : P> T.f) could
not be represented. Treating class and protocol methods
uniformly also eliminates a handful of special cases around
MemberRefExpr.

SILGen's RValue and call emission peepholes now have to know
about DeclRefExprs that point to protocol methods.

Finally, generalize the diagnostic for partially applied
mutating methods to any partially applied function with an
inout parameter, since this is not supported.

Fixes <rdar://problem/20564672>.

Swift SVN r29298
2015-06-04 15:57:58 +00:00
Slava Pestov
02b6753e93 Sema: Diagnose overrides of an @objc declaration that cannot be @objc
Now that generic subclasses of @objc classes are supported, dust off
Doug Gregor's fix for <rdar://problem/20385288>. It is now an error
to override an @objc declaration with something that cannot be
represented as @objc.

For example, the override of foo() here will not compile unless
it is explicitly marked @nonobjc:

func foo(i: Int) {}
...
override func foo(i: Int?) {}

Note that I updated IRGen to delete some logic for figuring out when
to emit @objc metadata. We can now rely on Sema to correctly set
isObjC(), instead of checking overrides ourselves. This was wrong
anyway, now that we can have @nonobjc overrides of @objc methods,
and vice versa.

Swift SVN r29263
2015-06-03 00:01:33 +00:00
Slava Pestov
6bcaeae089 Sema: Allow @objc on some generic things
Add some new tests now that everything is in place.

Swift SVN r29262
2015-06-03 00:01:31 +00:00
Ted Kremenek
6f694722b7 Revert "Sema: Allow @objc on some generic things"
Speculatively reverting because the iOS bots are broken.

Swift SVN r29143
2015-05-29 14:11:20 +00:00
Slava Pestov
05ae0dbdb2 Sema: Allow @objc on some generic things
Add some new tests now that everything is in place.

Swift SVN r29140
2015-05-29 06:19:09 +00:00
Doug Gregor
e2bec4377b Don't allow existentials to be used where we need a witness table.
If we end up trying to form a substitution where the replacement type
is an existential and there is a conformance to a non-@objc protocol
(i.e., a conformance where a witness table is required), complain in
Sema rather than crashing in IRGen. Fixes rdar://problem/21087341, but
the existential/generic interaction is still quite broken.

Swift SVN r29133
2015-05-29 05:02:18 +00:00
Slava Pestov
546dd63ceb Sema: Reject @objc functions with generic parameters
We currently complain about this type of thing:

class C<T> {
  @objc func foo() -> [T]
}

However this is also not supported, but crashes in IRGen:

class C {
  @objc func foo<T>() -> [T]
}

Also re-word a @nonobjc diagnostic and clean up some code for @objc and
@nonobjc.

Fixes <rdar://problem/19600602> and <rdar://problem/20886887>.

Swift SVN r29117
2015-05-28 22:44:57 +00:00
Doug Gregor
2dc383d4ec Allow constrained extensions to any generic type.
This permits, e.g., extending Array for all Hashable T's. However, it
does not permit extending Array for T == String. Part of
rdar://problem/21142043.

Swift SVN r29107
2015-05-28 18:39:23 +00:00
Doug Gregor
c15b2e246f Revert "Diagnose property ownership mismatches for protocol witnesses/requirements."
This reverts r29097; we might want something more
incomprehensible^Wnuanced here for Objective-C.

Swift SVN r29105
2015-05-28 16:21:26 +00:00
Slava Pestov
023b6d58df Sema: Fix @nonobjc diagnostic
Swift SVN r29104
2015-05-28 07:20:08 +00:00
Slava Pestov
7b5c7cc814 Sema: Remove unused diagnostic
NFC

Swift SVN r29102
2015-05-28 07:20:05 +00:00
Doug Gregor
1b26e1a581 Diagnose property ownership mismatches for protocol witnesses/requirements.
Swift SVN r29097
2015-05-28 05:31:03 +00:00
Dave Abrahams
d65f696344 Kill off [_]RawOptionSetType
Now that we are using OptionSetType for option sets, all the support for
doing things the old way can die.

Note: the fix-it that used to apply to RawOptionSetType, it seemed to me,
should still apply to OptionSetType, so I switched it over instead of
removing it.

Swift SVN r29066
2015-05-27 15:55:54 +00:00
Doug Gregor
dc70099dad Stop requiring 'final' on members of protocol extensions.
We're not sure when or if we want 'final' on protocol extension
members, so accept it but don't complain one way or another. We zap
this early on so that we don't end up printing it in generated
interfaces. Fixes rdar://problem/21112901.

Swift SVN r29040
2015-05-26 23:27:27 +00:00
Devin Coughlin
7e6a40de7d QoI: Improve diagnostic when protocol witness is less available than protocol requires.
Instead of the rather inscrutable "'foo()' is less available than protocol requires" be
more helpful: "protocol 'HasFoo' requires 'foo()' to be available on OS X 10.9 and newer".

Also add a note indicating where the conformance was introduced, as this may be in a
separate location from both the witness and requirement.

rdar://problem/20610411

Swift SVN r29028
2015-05-26 07:48:45 +00:00
Joe Groff
5e0361647d Sema: Admit partial applications of non-'mutating' methods.
Our implementation of partial_apply and currying is robust enough to handle these cases now. Mutating methods are still problematic since capturing would violate 'inout' semantics. (Maybe we could support 'mutating' partial applications as @noescape closures, some day.)

Swift SVN r28992
2015-05-24 19:39:07 +00:00
Joe Groff
a14b83ba2c SILGen: Allow partial applications of enum cases.
This isn't as straightforward as it should be, since EnumElementDecls aren't AbstractFunctionDecls, but luckily there's only one trivial curry level with a thin metatype parameter.

Swift SVN r28991
2015-05-24 19:39:02 +00:00
Doug Gregor
fab5e741bd Unrevert "Sema: Make derived conformances work from extensions"
Update IRGen test for 32/64-bit differences.

Swift SVN r28988
2015-05-24 17:55:42 +00:00
Chris Lattner
d1b092ee9c change "cannot assign to variable" diagnostic to "cannot assign to value", since
in some cases the problem is that you're trying to assign to a constant, not a 
variable.


Swift SVN r28966
2015-05-23 16:12:37 +00:00
Chris Lattner
cf1cb14205 recommit 28958/28959, there was a testcase that didn't get updated correctly
but it was between the two revisions.


Swift SVN r28964
2015-05-23 15:50:16 +00:00
Ted Kremenek
a575727a2b Revert "Sema: Make derived conformances work from extensions"
Speculatively revert; this looks like it is breaking the iOS bots.

Swift SVN r28963
2015-05-23 15:26:55 +00:00
Ted Kremenek
b4b81ff657 Revert "merge assignments to UnresolvedDotExpr onto the common path,"
Backing out to fix the build.

Swift SVN r28959
2015-05-23 07:55:07 +00:00
Ted Kremenek
381eb52207 Revert "Further consolidate mutation code, this time for DeclRefExprs. With that"
Backing out to fix th build.

Swift SVN r28958
2015-05-23 07:55:04 +00:00
Chris Lattner
291d7eaad7 Further consolidate mutation code, this time for DeclRefExprs. With that
done, the rest of the infrastructure is all common and can be simplified.  This
leaves us with a quite small and maintainable subsystem for diagnosing these
kinds of problems.

 include/swift/AST/DiagnosticsSema.def |   28 ++-----
 lib/Sema/CSDiag.cpp                   |  132 ++++++++++------------------------
 2 files changed, 48 insertions(+), 112 deletions(-)




Swift SVN r28957
2015-05-23 05:49:19 +00:00
Chris Lattner
3b64718b89 merge assignments to UnresolvedDotExpr onto the common path,
this is neutral w.r.t. diagnostics quality, but deletes a ton
of code:

 include/swift/AST/DiagnosticsSema.def |   21 ++---------
 lib/Sema/CSDiag.cpp                   |   64 ++--------------------------------
 2 files changed, 9 insertions(+), 76 deletions(-)



Swift SVN r28956
2015-05-23 05:18:59 +00:00
Chris Lattner
d5f68b478f Teach the recursive part of the diagnostics to handle the various things
that make vardecls and subscripts immutable.  This makes the indirect cases
a lot more specific ("this is a get-only property" instead of "this is 
immutable") and allows us to consolidate a bunch of code:

 2 files changed, 45 insertions(+), 119 deletions(-)




Swift SVN r28954
2015-05-23 04:53:08 +00:00
Chris Lattner
d29d030ea3 this is the code that went with r28942
Swift SVN r28943
2015-05-23 01:27:06 +00:00
Slava Pestov
9388a955dc Sema: Make derived conformances work from extensions
This is more complex than it could be if ExtensionDecl and NominalTypeDecl
had a common ancestor in the Decl hierarchy, however this is not possible
right now because TypeDecl inherits from ValueDecl.

Fixes <rdar://problem/20981254>.

Swift SVN r28941
2015-05-23 01:21:10 +00:00
Chris Lattner
7d881f8440 - Switch "&x", "++x" and "x+=1" onto the new style mutability diagnostics,
which tell you what the problem is, not just that you have one.
- Enhance diagnostics to be more specific about function calls producing 
  rvalues.



Swift SVN r28939
2015-05-23 00:17:12 +00:00
Chris Lattner
ef9d112ffc consolidate some diagnostics in a helper in prep for making them more
rich, consistent, and pervasive.


Swift SVN r28938
2015-05-22 23:03:26 +00:00
Chris Lattner
3f0ca3e2c8 - Change the general assignment failure diagnostic to include the type of the
result and make it more specific.
- Move the 'assignment failure' diagnostic logic to CSDiags.cpp where it belongs.



Swift SVN r28937
2015-05-22 22:07:26 +00:00
Chris Lattner
012cfa8657 Improve mutability diagnostics when the top level is a ForceValueExpr.
As far as I know, the compiler now only produces the useless "cannot 
assign to the result of this expression" diagnostic in cases that don't
make sense to be an lvalue, like "4 = x".



Swift SVN r28935
2015-05-22 21:19:27 +00:00
Doug Gregor
84e14efd8f Warn about non-@objc potential witnesses for optional requirements.
When an optional requirement goes unfulfilled by a conformance, and
there is a non-@objc declaration with that name in the type/extension
declaring conformance, warn that it does not satisfy the optional
requirement. Sadly, this diagnostic is long because there are notes
for the two potential fixes: add @objc to try to conform, or move the
declaration elsewhere to silence the compiler.

Fixes rdar://problem/20219297.

Swift SVN r28908
2015-05-22 06:22:23 +00:00