Commit Graph

4105 Commits

Author SHA1 Message Date
Joe Groff
4e87971d81 Disallow bare type references.
Diagnose a metatype reference that doesn't appear as part of a call or member reference, offering fixits to either default-construct the type or get at the metatype explicitly using '.self'. Also diagnose an attempt to refer to 'T.type' by fixiting it to '.self'.

Swift SVN r14433
2014-02-27 00:22:02 +00:00
Chris Lattner
97e1cb5ac5 switch diagnostics to refer to 'let'
Swift SVN r14420
2014-02-26 22:44:20 +00:00
Doug Gregor
709c06f67e Zap the now-unused class override checking pass.
All override checking is now performed when we validate a declaration.

Swift SVN r14410
2014-02-26 21:33:22 +00:00
Doug Gregor
765cf2a9f3 Improve override checking for subscript declarations.
A couple of related fixes here:
  * Properly diagnose extraneous @override on subscript declarations
  * Allow covariant overrides of (non-mutable!) subscripts
  * Check subscript overrides as part of declaration validation

Swift SVN r14409
2014-02-26 21:33:21 +00:00
Doug Gregor
a1bef5aea3 Improve property overriding semantics.
A few improvements in our checking of property overrides:
  * Properly check for an extraneous @override on a property
  * Don't allow overriding of stored properties or with a stored property
  * Only allow a covariant override when the overridden property is not mutable
  * Check overrides as part of validation, not in a post-pass

Swift SVN r14403
2014-02-26 20:06:59 +00:00
Doug Gregor
230c8a4982 Introduce the 'override' attribute and start requiring it on all overrides.
The 'override' attribute indicates that the given declaration, which
may be a method, property, or subscript, overrides a declaration in
its superclass. Per today's discussion, the 'override' attribute must
be present if and only if the corresponding declaration overrides a
declaration in its superclass. 

This implements most of <rdar://problem/14798539>. There's still more
work to do to on property and subscript overrides.



Swift SVN r14388
2014-02-26 08:53:06 +00:00
Doug Gregor
0bde325327 Collapse 'DynamicSelf' into 'Self'.
Swift SVN r14377
2014-02-26 05:04:05 +00:00
Doug Gregor
61c240c8a8 Allow construction of existential values based on an existential metatype value.
... but obviously not when we've statically derived the existential
metatype. This isn't quite the way I'd like to prohibit these issues,
but more work on existentials and metatypes is coming up shortly.


Swift SVN r14326
2014-02-25 00:32:31 +00:00
Doug Gregor
c4cc906210 Turn a sentinel value for diagnostics into an enum.
Swift SVN r14324
2014-02-24 23:36:31 +00:00
Doug Gregor
96be672daf Allow initializer requirements on protocols and check conformance to them.
Swift SVN r14320
2014-02-24 23:17:09 +00:00
Doug Gregor
048c67350b Move the diagnostic about a missing initializer body into Sema.
We did this for func declarations a long time ago; do it for
initializers as well.


Swift SVN r14318
2014-02-24 22:22:29 +00:00
Joe Pamer
f83f94d9d8 Support build and target configurations
These changes add support for build and target configurations in the compiler.
Build and target configurations, combined with the use of #if/#else/#endif allow
for conditional compilation within declaration and statement contexts.

Build configurations can be passed into the compiler via the new '-D' flag, or
set within the LangOptions class. Target configurations are implicit, and
currently only "os" and "arch" are supported.

Swift SVN r14305
2014-02-24 18:16:48 +00:00
Chris Lattner
b478d53cf9 implement semantic analysis of subscript and property requirements,
to reject invalid code.


Swift SVN r14289
2014-02-24 00:30:18 +00:00
Doug Gregor
0da11a8b0b Implement semantic analysis for abstract initializers.
Swift SVN r14221
2014-02-21 19:41:14 +00:00
Doug Gregor
8024563678 Don't allow construction of classes based on non-statically-derived metatypes.
An arbitrary value of class metatype cannot be used to construct an
object, because there's no guarantee that a given subclass will
provide that initializer.


Swift SVN r14175
2014-02-20 22:17:23 +00:00
Doug Gregor
c630ef33d7 Don't allow one to utter DynamicSelf except as a class/protocol method's result type.
Previously, semantic analysis would permit uses of DynamicSelf in the
body of a DynamicSelf method. However, SILGen's lowering of
DynamicSelf to the underlying self type caused breakage. Because we
don't have a pressing need for this feature, just disable
it. Restricts the scope of <rdar://problem/15862605>.


Swift SVN r14172
2014-02-20 21:34:57 +00:00
Chris Lattner
68a68919e1 Implement:
<rdar://problem/16118658> properties in protocols should require {get / set} specifier



Swift SVN r14136
2014-02-20 07:42:49 +00:00
Doug Gregor
a1673d7c8f Add an Objective-C metatype representation spelled with @objc_metatype.
This representation is just a placeholder at the moment.


Swift SVN r14076
2014-02-19 07:21:38 +00:00
Doug Gregor
8bc87bbe1e fromRaw() witnesses can only be synthesized when the raw type is Equatable.
Swift SVN r14067
2014-02-19 01:09:43 +00:00
Chris Lattner
602da91d1c switch diagnostics from let -> val.
Swift SVN r13990
2014-02-17 16:22:39 +00:00
Doug Gregor
9d41af15b6 Make SIL output for open_existential actually parseable.
Swift SVN r13939
2014-02-15 05:52:19 +00:00
Chris Lattner
380b03c3f5 reject attempts to mark observing accessors @objc, and don't infer them as @objc.
Swift SVN r13930
2014-02-14 23:36:56 +00:00
Dmitri Hrybenko
571c9b3c5e Split 'type' keyword into 'static' and 'class'
rdar://15911697


Swift SVN r13908
2014-02-14 14:50:32 +00:00
Dave Abrahams
5063c33cbb Rename "Stream" protocol back to "Generator"
The name Stream didn't seem to be working out as intended; we kept
gravitating back to calling it Generator, which is precedented in other
languages.  Also, Stream seems to beg for qualification as Input or
Output.  I think we'd like to reserve Stream for things that are more
bulk-character-API-ish.

Swift SVN r13893
2014-02-14 01:48:52 +00:00
Dave Zarzycki
ee01278616 Revert "Diagnostics: 'let' is spelled 'val' now"
Never mind. 'let' is still accepted. We shouldn't fix this until we're
ready to commit to 'val'.

Swift SVN r13873
2014-02-13 20:55:47 +00:00
Dave Zarzycki
2d1de37c1d Diagnostics: 'let' is spelled 'val' now
Swift SVN r13870
2014-02-13 20:28:43 +00:00
Jordan Rose
f7977e6807 [serialization] Reject modules with a different version number.
From now on, /any/ changes to SIL or AST serialization must increment
VERSION_MINOR in ModuleFormat.h.

The original intent of VERSION_MAJOR/VERSION_MINOR was that VERSION_MAJOR
would only increment when backwards-incompatible changes are introduced,
and VERSION_MINOR merely indicates whether to expect additional information.
However, the module infrastructure currently isn't forgiving enough to accept
even backwards-compatible changes to the record schemas, and the SIL
serialization design might not be compatible with that at all.

So for now, treat any version number 0.x as incompatible with any other 0.y.
We can bump to 1 when we hit stability.

<rdar://problem/15494343>

Swift SVN r13841
2014-02-12 21:33:45 +00:00
Chris Lattner
0695fcea12 improve diagnostic about missing ) in parameter list to use the phrase
"parameter list" instead of "tuple argument".  Fix a potential crash I 
introduced by making an assumption about default initialized implied name
parameters being the only thing in parens.


Swift SVN r13813
2014-02-12 05:46:46 +00:00
Doug Gregor
35dfd6e8a8 Clean up @objc checking for subscripts.
Improve diagnostics, diagnose the generic-context case, etc. Fixes the
rest of <rdar://problem/16042185>. 


Swift SVN r13797
2014-02-12 00:53:35 +00:00
Doug Gregor
016d62d930 Disallow @objc on methods, properties, subscripts, etc. in generic contexts.
Addresses <rdar://problem/16042185>.


Swift SVN r13790
2014-02-12 00:09:45 +00:00
Chris Lattner
c57b0d25b7 Implement <rdar://problem/16021869> the first portion of a function selector should allow implicit arg names
This allows us to use implicit names in protocols and asm name functions, as well
as for the first chunk of selectors.  This feature is particularly useful for
delegate methods.



Swift SVN r13751
2014-02-10 17:39:57 +00:00
Doug Gregor
474016398f Model references to DynamicSelf methods on existentials by opening the existential.
Introduce a new expression kind, OpenExistentialExpr, that "opens" up
an existential value into a value of a fresh archetype type that
represents the dynamic type of the existential. That value can be
referenced (via an OpaqueValueExpr) within the within the
subexpression of OpenExistentialExpr. For example, a call to a
DynamicSelf method on an existential looks something like this:

        (open_existential_expr implicit type='P'
          (opaque_value_expr implicit type='opened P' @ 0x7fd95207c290
          unique)
          (load_expr implicit type='P'
            (declref_expr type='@lvalue P' decl=t.(file).func
          decl.p@t.swift:5:37 specialized=no))
          (erasure_expr implicit type='P'
            (call_expr type='opened P'
              (archetype_member_ref_expr type='() -> opened P'
          decl=t.(file).P.f@t.swift:2:8 [with Self=opened P]
                (opaque_value_expr implicit type='opened P' @
          0x7fd95207c290 unique))
              (tuple_expr type='()')))))

Note that we're using archetype_member_ref_expr rather than
existential_member_ref_expr, because the call is operating on the
opaque_value_expr of archetype type. The outer erasure turns the
archetype value back into an existential value.

The SILGen side of this is somewhat incomplete; we're using
project_existential[_ref] to open the existential, which is almost
correct: it gives us access to the value as an archetype, but IRGen
doesn't know to treat the archetype type as a fresh archetype whose
conformances come from the existential. Additionally, the output of
the opened type is not properly parsable. I'll fix this in follow-on
commits.

Finally, the type checker very narrowly introduces support for
OpenExistentialExpr as it pertains to DynamicSelf. However, this can
generalize to support all accesses into existentials, eliminating the
need for ExistentialMemberRef and ExistentialSubscript in the AST and
protocol_method in SIL, as well as enabling more advanced existential
features should we want them later.



Swift SVN r13740
2014-02-10 06:44:44 +00:00
Chris Lattner
f9a83fdc33 Implement the first half of <rdar://problem/15922884> support non-member didset/willset properties
Observing properties now work fine as globals.  Local variables still need some work though.



Swift SVN r13736
2014-02-10 05:43:04 +00:00
Mark Lacey
296691f403 Disallow Swift functions as parameters to @objc functions.
Swift SVN r13733
2014-02-10 05:07:21 +00:00
Chris Lattner
7cd725c9e9 implement <rdar://problem/16008564> inout variadic parameters should be not be allowed
Swift SVN r13689
2014-02-09 00:11:35 +00:00
Chris Lattner
49f7290288 Add specific diagnostics for sil-only attributes.
Treat inout as a SIL-only attribute, but produce a better diagnostic for it
if someone uses it accidentally (which I expect to be common over the next
few weeks).  inout is done.


Swift SVN r13567
2014-02-06 06:52:28 +00:00
Chris Lattner
827acad533 Various inout improvements:
- purge @inout from comments in the compiler except for places talking about
   the SIL argument convention.
 - change diagnostics to not refer to @inout
 - Change the astprinter to print InoutType without the @, so it doesn't show
   up in diagnostics or in closure argument types in code completion.
 - Implement type parsing support for the new inout syntax (before we just 
   handled patterns).
 - Switch the last couple of uses in the stdlib (in types) to inout.
 - Various testcase updates (more to come).



Swift SVN r13564
2014-02-06 06:22:27 +00:00
Chris Lattner
fa58183545 Teach the parser to accept "mutating func f()" as an alias for
"@mutating func f()".   I'm keeping the @mutating version around
so we can determine what to do with @!mutating.

Also, improve the QoI of mutating related diagnostics.


Swift SVN r13480
2014-02-05 07:09:11 +00:00
Chris Lattner
63adafc7c6 Move my parser-time check for variable initializer requirements to Sema.
Swift SVN r13402
2014-02-04 01:43:12 +00:00
Doug Gregor
692d024c4a Protocol conformance checking for DynamicSelf protocols.
Swift SVN r13293
2014-02-01 05:57:53 +00:00
Doug Gregor
af82df1aec Simplify the AST for expressions referencing DynamicSelf methods.
When referring to a DynamicSelf method, treat DynamicSelf as an alias
for the class type in which the method was declared, then perform a
function conversion to a method with the appropriate subclass as the
result result type. This is always a (trivial) subtype conversion on
the method.

Swift SVN r13268
2014-02-01 01:20:26 +00:00
Jordan Rose
1d0d9ed070 Include the xcrun incantation to print the SDK path in the "no SDK" error.
Per DaveA's suggestion.

Swift SVN r13250
2014-01-31 23:01:08 +00:00
Joe Groff
9fe1ab427a Implement 'if let' and 'while let' statements.
Allow IfStmts and WhileStmts to have as their condition either an expression, as usual, or a pattern binding introduced by 'var' or 'let', which will conditionally bind to the value inside an optional. Unlike normal pattern bindings, these bindings require an in-line initializer, which will be required to be Optional type. Parse variable bindings in this position, and type-check them by requiring an Optional on the right-hand side and unwrapping it to form the pattern type. Extend SILGen's lowering of if and while statements to handle conditionally binding variables.

Swift SVN r13146
2014-01-30 10:37:39 +00:00
Doug Gregor
9ccaf820b8 Start making the method overriding rules a bit more sane.
When we type check the signature of a method, determine which method
it overrides (if any) at that time. This ensures that we always have
this information for name lookup (per <rdar://problem/15932845>). 

As part of this, start to make the overriding rules a little more
sane. John has worked out more of the model here, but this patch:
  - Considers an Objective-C method an override of another Objective-C
  method if the selectors match and the type vs. instance-ness of the
  methods match. The method types are checked for consistency
  (subtyping is okay).
  - Diagnoses when a method overrides more than one method from a
  superclass, and
  - Eliminates the "cannot overload method from a superclass"
  diagnostic, which is overly pedantic and oddly limiting.

Note that we lose some amount of checking here. Specifically, we don't
have a good place to check that one has not provided two different
methods that override the same superclass method. The older code did
that (somewhat), and it's not a trivial problem to solve efficiently.

This fixes the part of <rdar://problem/15597226> that is needed for
<rdar://problem/15932845>. It still doesn't handle properties,
subscripts, and undoubtedly other issues.



Swift SVN r13108
2014-01-29 11:08:56 +00:00
Jordan Rose
5faec6e183 Don't crash when forward-referencing a local variable.
Since we type-check local variables in statement order in a function, but
resolve names on a whole-scope basis, we can end up with a name that refers
to a local variable before its declaration has been reached. If this happens,
the variable won't have a type.

Checking this correctly may require comparing the order of statements in a
syntactic scope, but for now, just emit an error message if a reference
ever resolves to a variable without a type. (Note that UnqualifiedLookup
will have already tried to validate the decl, so if it's a global we just
haven't seen yet there's not a problem.)

Unfortunately, we won't get this right for top-level variables in script
source files, since those are still stored at global context and can be
validated on demand. They're never uninitialized, but zero-initialization
may not be valid for all global kinds.

<rdar://problem/15912025>

Swift SVN r13003
2014-01-27 20:37:04 +00:00
John McCall
fcf1c14924 When deciding whether we can support a type property,
ignore whether it's in an extension vs. the primary declaration,
and permit non-stored properties in any context except a protocol.

Swift SVN r12943
2014-01-24 22:46:22 +00:00
Doug Gregor
6f42f69876 Parse DynamicSelf as a type, restricted to contexts in which it is allowed.
Take DynamicSelf as a keyword, but parse it as a type-identifier.
Teach function declaration checking to sniff out and validate
DynamicSelf early, with appropriate QoI for references to DynamicSelf
that appear in other places.

As a temporary hack, DynamicSelf resolves to an alias for 'Self' in a
protocol or the enclosing nominal type.

Swift SVN r12708
2014-01-22 05:54:11 +00:00
Doug Gregor
81279c6c00 QoI: Provide a Fix-It that replaces 'Self' with the enclosing nominal type.
As part of this, give diagnoseUnknownType() the ability to fix the current component so that we continue as-if the user had written what we wanted. This gives us a hook for various forms of fixes, e.g., typo correction on type references.

Swift SVN r12707
2014-01-22 05:54:10 +00:00
John McCall
9c415a3bed Remove the TrivialSubtype conversion kind and implement
its basic logic in libAST, which both makes it easier to
implement and makes it possible to use in the places that
should care about it, i.e. in IR-gen and SIL-gen.

Per Doug, none of the places that were introducing
trivial-subtype constraints really needed to do so rather
than just using subtype constraints.

Swift SVN r12679
2014-01-22 00:19:56 +00:00
Jordan Rose
41b56a5aba Disallow use of associated types on existentials.
protocol BaseProto {
    typealias AssocTy
  }
  var a: BaseProto.AssocTy // error!

While this could be interpreted to mean "a is an existential bounded by
whatever AssocTy is bounded by", we don't actually support this in any
other contexts; if a protocol has a function that returns an associated type,
it can only be used in a concrete or generic context, not an existential one.

<rdar://problem/15850024>

Swift SVN r12600
2014-01-20 18:45:49 +00:00