Commit Graph

996 Commits

Author SHA1 Message Date
Joe Groff
8bdc8ecf25 Merge pull request #7167 from jckarter/super-final-c-extension-expialidocious
Sema: "super" calls to non-ObjC extension methods must be statically dispatched.
2017-01-31 14:23:52 -08:00
Joe Groff
8159c84bc9 Sema: "super" calls to non-ObjC extension methods must be statically dispatched.
They currently can't ever show up in the vtable, so we must emit static calls to them. Fixes rdar://problem/30030229.
2017-01-31 13:30:21 -08:00
Rintaro Ishizaki
590ac72316 [Parse] Parse subscript with '#' expressions
Fixes: https://bugs.swift.org/browse/SR-3439
2017-01-27 19:59:55 +09:00
Jordan Rose
6fed3d1edf Merge pull request #6990 from jrose-apple/available-is-better-than-unavailable
[ClangImporter] Prefer available enum elements over unavailable ones.
2017-01-26 11:52:36 -08:00
Slava Pestov
c206f629e7 Merge pull request #6678 from karwa/one-plus-two
[ClangImporter] Teach the importer about a couple more kinds macro constants
2017-01-24 19:04:38 -08:00
Erik Eckstein
1d3724666f tests: convert about 400 tests to the new mangling by using the -new-mangling-for-tests option
When the new mangling is enabled permanently, the option can be removed from the RUN command lines again.
2017-01-24 15:27:45 -08:00
Jordan Rose
3411fc380e [ClangImporter] Prefer available enum elements over unavailable ones.
...and avoid making aliases from one unavailable declaration to another.
If it's unavailable, we can just import it as a normal case and not
worry about it. This fixes an issue where Sema would try to diagnose
the body of an "alias" for referring to unavailable declarations.

(Background: enum cases in Swift have to have unique values, so we
import any duplicate values as static properties. Pattern matching
logic has a hack to recognize these particular static properties as
being "case-like".)

This commit also sinks enum element uniqueness checking into importing
the enum, instead of keeping a global map we never consult again. This
should save a small bit of memory.

rdar://problem/30025723
2017-01-23 15:34:20 -08:00
SpringsUp
fa834e2f80 [ClangImporter] Teach the importer about more infix operators between
integer constants, and to always look through macro definitions for them.

Also, logical comparisons now return a Boolean.

New operations: +, -, *, /, ^, >>, ==, >, >=, <, <=
2017-01-23 21:02:47 +01:00
Daniel Martín
d510793566 Fix SR-2860 2017-01-16 09:39:36 +01:00
Daniel Martín
4ce3070133 Add test case that reproduces bug SR-2860 2017-01-07 18:09:21 +01:00
Daniel Martín
45428a57f4 Sort test file alphabetically 2017-01-07 18:09:21 +01:00
Jordan Rose
e54ec3d2d4 Merge pull request #5854 from jrose-apple/excise-silgen_name-from-Dispatch
Use an extra shims header to remove _silgen_name from Dispatch.
2016-12-02 09:20:24 -08:00
Michael Ilseman
d1efc80b1f [Import Decl] Don’t import as init using omit needless words
Previously, for an Objective-C class method declaration that could be
imported as init, we were making 4 decls:

1) The Swift 2 init
2) The Swift 2 class method decl (suppressing init formation)
3) The Swift 3 init (omitting needless words)
4) The Swift 3 class method decl (suppressing init formation and
   omitting needless words)

Decls 1), 2), and 4) exist for diagnostics and redirect the user at
3). But, 4) does not correspond to any actual Swift version name and
producing it correctly would require the user to understand how
omit-needless-words and other importer magic operates. It provides
very limited value and more importantly gets in the way of future
Clang importer refactoring. We’d like to turn Decl importing into
something that is simpler and language-version parameterized, but
there is no real Swift version to correspond to decl 4).

Therefore we will be making the following decls:

1) The "raw" decl, the name as it would appear to the user if they
   copy-pasted Objective-C code
2) The name as it appeared in Swift 2 (which could be an init)
3) The name as it appeared in Swift 3 (which could be an init and omit
   needless words)

This aligns with the language versions we want to import as in the
future: raw, swift2, swift3, …, and current.

Note that swift-ide-test prunes decls that are unavailable in the
current Swift version, so the Swift 2 non-init decls are not printed
out, though they are still present. Tests were updated and expanded to
ensure this was still the case.
2016-12-01 18:50:40 -08:00
Jordan Rose
7d61a5e6a2 [SDK] Use an extra shims header to remove _silgen_name from Dispatch.
We still have a bunch of redeclarations of Dispatch functions to avoid
the automatic bridging of dispatch_data_t and dispatch_block_t, but
mostly this is a vast reduction in complexity (and increase in safety).
2016-12-01 16:06:15 -08:00
Jordan Rose
106ba8d21e [ClangImporter] Import nullability-unspecified va_list as non-optional. (#5848)
Most people don't even think of va_list as a pointer type, so they
won't bother to put nullability on it. Conversely, on some platforms
va_list /isn't/ a pointer type (or an array that decays to a pointer
type in parameter positions), so putting nullability on a va_list
would be non-portable.

If nullability isn't explicitly specified for a va_list, or even if
it's explicitly marked _Null_unspecified for some reason, treat it as
non-optional in Swift. Anyone who /really/ needs to (non-portably)
pass NULL to a va_list parameter can do so via a C trampoline
function.

This change is potentially source-breaking, since someone could be
passing NULL to a va_list today. However, this is incredibly unlikely,
and even less likely to do something useful.

More fallout from rdar://problem/25846421 (supporting nullability on
array parameters).
2016-11-18 10:15:47 -08:00
Jordan Rose
d7cc1fd81e [ClangImporter] C static-qualified array params are non-nullable. (#5617)
If the keyword 'static' also appears within the '[' and ']' of the
    array type derivation, then for each call to the function, the
    value of the corresponding actual argument shall provide access to
    the first element of an array with at least as many elements as
    specified by the size expression. (C11 6.7.6.3p7)

Limit this change to Swift 4 so as not to break existing code, though
use of 'static' in this way is rare to begin with and passing nil
would probably be an error anyway.

Small part of rdar://problem/25846421.
2016-11-16 09:14:28 -08:00
Jordan Rose
e68e312bf0 [test] Add new tests for imported array parameters with nullability.
The feature was all implemented in Clang; the Swift-side tests just
help confirm that it's working as expected.

rdar://problem/25846421
2016-11-14 13:15:19 -08:00
Francis Ricci
15fc1ae183 Remove Darwin module's dependency on ctypes.h
Upstream cfe change r284797 adds explicit handling for modules
named Darwin, and requires that it not depend on modules which
it does not parent. Because ctypes is a peer module of Darwin,
this means that Darwin must no longer depend on ctypes.

This can be avoided by duplicating some integral definitions
in MacTypes.h, and by adding extra imports to a few tests.
2016-11-01 17:03:30 -07:00
practicalswift
cc852042c9 [gardening] Fix accidental trailing whitespace. 2016-10-29 10:22:58 +02:00
Jordan Rose
6163679538 [APINotes] Replace old FactoryAsInit annotation with equivalent SwiftNames.
'processInfo' was removed entirely because it's now considered a class property,
and we don't ever import those as initializers.
2016-10-14 09:07:43 -07:00
Slava Pestov
53b3a69a9a Runtime: Fix dynamic casts to support resilient protocols
If a protocol witness table requires instantiation, the runtime
needs to call the witness table accessor when looking up the
conformance in swift_conformsToProtocol().

We had a bit of code for this already, but it wasn't fully
hooked up. Change IRGen to emit a reference to the witness table
accessor rather than the witness table itself if the witness
table needs instantiation, and add support to the runtime for
calling the accessor.
2016-09-30 18:28:11 -07:00
Slava Pestov
1a2beb7cda IRGen: Fix extensions of resilient enums
We need to arrange enum type metadata in a way where a client can
fish out generic parameters without knowing if we have a payload
size or not. The payload size is only used inside the module that
defined the enum, and may change if new cases are added.

So put the generic parameters first before the payload size, and
don't crash when an EnumMetadataScanner is used with a resilient
enum.
2016-09-30 18:28:11 -07:00
Joe Groff
86fbeee285 SE-0139: Bridge Cocoa framework structs to NSValue.
For every struct type for which the frameworks provides an NSValue category for boxing and unboxing values of that type, provide an _ObjectiveCBridgeable conformance in the Swift overlay that bridges that struct to NSValue, allowing the structs to be used naturally with id-as-Any APIs and Cocoa container classes. This is mostly a matter of gyb-ing out boilerplate using `NSValue.init(bytes:objCType:)` to construct the instance, `NSValue.objCType` to check its type when casting, and `NSValue.getValue(_:)` to extract the unboxed value, though there are a number of special snowflake cases that need special accommodation:

- To maintain proper layering, CoreGraphics structs need to be bridged in the Foundation overlay.
- AVFoundation provides the NSValue boxing categories for structs owned by CoreMedia, but it does so using its own internal subclasses of NSValue, and these subclasses do not interop properly with the standard `NSValue` subclasses instantiated by Foundation. To do the right thing, we therefore have to let AVFoundation provide the bridging implementation for the CoreMedia types, and we have to use its category methods to do so.
- SceneKit provides NSValue categories to box and unbox SCNVector3, SCNVector4, and SCNMatrix4; however, the methods it provides do so in an unusual way. SCNVector3 and SCNVector4 are packaged into `CGRect`s and then the CGRect is boxed using `valueWithCGRect:`. SCNMatrix4 is copied into a CATransform3D, which is then boxed using `valueWithCATransform3D:` from CoreAnimation. To be consistent with what SceneKit does, use its category methods for these types as well, and when casting, check the type against the type encoding SceneKit uses rather than the type encoding of the expected type.
2016-09-21 19:26:10 -07:00
Jordan Rose
a335ebce80 [SILGen] Restore old logic for checking (non-)zero error results. (#4681)
Actually bridging ObjCBool to Bool is overkill for this, but moreover
it caused problems for non-boolean types that took this code
path. Just go back to the previous logic of unwrapping multiple levels
of struct; this way we can also handle wrappers around integer types
(if we ever have any).

rdar://problem/27985744
2016-09-09 09:31:59 -07:00
Jacob Bandes-Storch
89d0d62bd6 [PrintAsObjC] print __attribute__((noescape)) in Obj-C headers (#4438)
https://bugs.swift.org/browse/SR-2406
2016-08-31 09:27:59 -07:00
Joe Groff
484429daa0 SILGen: Bridge id to Any using a stdlib helper.
Bitcast the AnyObject result to AnyObject?, then call our new helper function, so that we can handle nils without choking. Fixes rdar://problem/27874026.
2016-08-18 15:09:55 -07:00
Jordan Rose
ea4d110146 [PrintAsObjC] Handle typealiases in ObjC generics.
More specifically, don't try to emit a definition for them. Just fall
through to what we do for forward-declarations...which also needed some
fixing, to make sure we don't use a Swift typealias as its underlying
type but never import the underlying type.

https://bugs.swift.org/browse/SR-2352
2016-08-16 11:09:49 -07:00
Slava Pestov
56e2e1327a Targeted fix for pulling in Hashable conformance for Set and Dictionary when a nil literal is bridged
When bridging values via the ObjectiveCBridgeable protocol,
SILGen has to look up conformances directly, behind the
type checker's back.

To make sure the ObjectiveCBridgeable conformance is forced,
Sema calls useObjectiveCBridgeableConformances() in the right
places.

However, another conformance we may also need when bridging
is the Hashable conformance for a Set or Dictionary's key type.

Make sure we force these too, because otherwise when bridging
a nil literal nothing needs them in Sema.

Fixes <rdar://problem/27470505>.
2016-08-15 14:29:59 -07:00
Argyrios Kyrtzidis
d187609c61 [test] Update test 'test/IDE/comment_to_xml.swift'. 2016-08-09 21:18:44 -07:00
Joe Groff
62afa03eb9 Improve Foundation overlay to handle bridging subscripts and dictionary literals.
SE-0072 took implicit bridging conversions away, which regressed the ability to express NSDictionaries as dictionary literals and index them using literal keys. Address this by changing the signature of init(dictionaryLiteral:) to use Hashable and Any, and by replacing the subscript from Objective-C with one using _Hashable that does the bridging on the user's behalf. This largely restores the QoI of working with NS collections.
2016-08-04 08:42:36 -07:00
Doug Gregor
58cce2745c Merge pull request #3940 from DougGregor/rdar-27543121
[Sema] Improve diagnostics for attempt to throw an error *code*
2016-08-02 15:57:18 -07:00
Mishal Shah
8d854d24b5 Merge pull request #3918 from jckarter/printasobjc-crash
PrintAsObjC: Handle new upper bounds of Array/Dictionary/Set correctly.
2016-08-02 15:14:38 -07:00
Doug Gregor
31edf710bf [Sema] Improve diagnostics for attempt to throw an error *code*
Attempting to throw an error code value, e.g.,

  throw CocoaError.fileNoSuchFileError

is now ill-formed, although it was well-formed prior to the
introduction of NSError bridging (SE-0112). Provide a specialized
diagnostic with a Fix-It to add the appropriate parentheses:

  throw CocoaError(.fileNoSuchFileError)

Fixes rdar://problem/27543121.
2016-08-02 14:47:18 -07:00
Joe Groff
cfcb6ea50e PrintAsObjC: Handle new upper bounds of Array/Dictionary/Set correctly.
We would crash because 'Any' doesn't have a corresponding bridged type through the normal bridging mechanism. Handle this correctly, and correctly recognize 'AnyHashable' and 'Any' as the upper bounds of Dictionary, Set, and Array so we present the unqualified NS types in the generated header.
2016-08-02 09:54:22 -07:00
John McCall
afdda3d107 Implement SE-0117.
One minor revision: this lifts the proposed restriction against
overriding a non-open method with an open one.  On reflection,
that was inconsistent with the existing rule permitting non-public
methods to be overridden with public ones.  The restriction on
subclassing a non-open class with an open class remains, and is
in fact consistent with the existing access rule.
2016-08-02 07:46:38 -07:00
Jordan Rose
b5aca663bc [ClangImporter] Remove importer-based NS stripping. (#3880)
* [ClangImporter] Remove importer-based NS stripping.

As Tony puts it, in the end we wound up with more Foundation
declarations imported as members or keeping "NS" than those that
dropped it, and any further decisions will be made on a case-by-case
basis. Move all of the existing cases of prefix-stripping into
Foundation's API notes and drop the logic from the compiler.

Tested by dumping the generated interface for Foundation and its
submodules for both macOS and the iOS simulator, and comparing the
results. A few cases did slip through here because of the interaction
between "SwiftName" and "Availability: nonswift".

The next commit will re-add "NS" to some stragglers that we missed.

rdar://problem/26880017

* APINotes: Add "NS" back to a few types.

NSKeyedUnarchiverDelegate
NSKeyedArchiverDelegate
NSTextCheckingTypes
NSBinarySearchingOptions
NSEnumerationOptions
NSSortOptions

More rdar://problem/26880017

* Remove now-redundant SwiftNames from API notes.

No change observed in the generated interface of Foundation and its
submodules.

Finishes rdar://problem/26880017.
2016-08-01 20:54:26 -07:00
Doug Gregor
b9363fe6bd [SE-0111] Enable SE-0111 by default. 2016-07-29 17:28:24 -07:00
Jordan Rose
7ae0825781 [ClangImporter] Default optional "options" params to nil, not [:]. (#3789)
When a parameter has distinct "nil" and "empty" values, "nil"
generally represents the default settings, while "empty" is
explicitly cleared.

rdar://problem/27196867
2016-07-28 23:09:05 -07:00
Joe Groff
2a5b9d6559 Remove now-dead _isBridgedToObjectiveC() declarations in _ObjectiveCBridgeable conformers. 2016-07-28 12:29:47 -07:00
Jordan Rose
e4118f19c8 Port tests to 'fileprivate'.
Similar to apple/swift#3753.

Groundwork for SE-0025 ('private' and 'fileprivate').
No intended functionality change.
2016-07-25 20:20:58 -07:00
Dmitri Gribenko
e34df7f221 tests: remove comments that don’t mean anything now 2016-07-18 02:41:20 -07:00
Chris Lattner
af30ae3222 Remove the last parts of the Boolean protocol, finishing up:
SE-0109: Remove the Boolean protocol.

We still love you George, even if we forgot your e.
2016-07-17 22:18:17 -07:00
Robert Widmann
f97e5dcb0e [SE-0115][1/2] Rename *LiteralConvertible protocols to ExpressibleBy*Literal. This
change includes both the necessary protocol updates and the deprecation
warnings
suitable for migration.  A future patch will remove the renamings and
make this
a hard error.
2016-07-12 15:25:24 -07:00
Doug Gregor
823c24b355 [SE-0112] Rename ErrorProtocol to Error.
This is bullet (5) of the proposed solution in SE-0112, and the last
major piece to be implemented.
2016-07-12 10:53:52 -07:00
Doug Gregor
ca4a32b5a9 [SE-0112] Bridge NSError to ErrorProtocol.
Introduce bridging of NSError to ErrorProtocol, so an Objective-C API
expressed via an "NSError *" will be imported using ErrorProtocol in
the Swift. For example, the Objective-C method:

  - (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted;

will now be imported as:

  func handleError(_ error: ErrorProtocol, userInteractionPermitted: Bool)

This is bullet (3) under the proposed solution of SE-0112. Note that
we made one semantic change here: instead of removing the conformance
of NSError to ErrorProtocol, which caused numerous problems both
theoretical and actual because the model expects that an NSError
conforms to ErrorProtocol without requiring wrapping, we instead limit
the ErrorProtocol -> NSError conversion that would be implied by
bridging. This is defensible in the short term because it also
eliminates the implicit conversion, and aligns with SE-0072, which
eliminates implicit bridging conversions altogether.
2016-07-12 10:53:52 -07:00
Joe Groff
e6ba22fc0e SILGen: Look through ErasureExprs when bridging to AnyObject.
When we have an argument expr of type Any that's being emitted as a bridged ObjC object parameter, look through any ErasureExprs and directly bridge the concrete value. This saves us emitting an intermediate 'Any' value in the common case where a value of known concrete type is passed in from Swift.
2016-07-06 21:25:13 -07:00
Joe Groff
231db9d108 Clang importer: Import ObjC 'id' as Swift 'Any' (behind a flag).
For experimentation purposes, add a flag to cause the Clang importer to map ObjC APIs using `id` to `Any` instead of `AnyObject`.
2016-07-05 12:29:45 -07:00
Alex Hoppen
884af9ccab [Parser] Make #selector a primary expression
This allows #selector to be followed by a trailing `?` in case statements as reported in SR-1827
2016-06-27 22:11:58 +02:00
Mishal Shah
87b7bcfd3e Update master to build with Xcode 8 beta 1, OS X 10.12, iOS 10, tvOS 10, and watchOS 3 SDKs. 2016-06-14 14:53:55 -07:00
Slava Pestov
0d3ef548e7 ClangImporter: Add support for __attribute__((availability(..., replacement="")))
We map clang::AvailabilityAttr::getReplacement() to
swift::AvailableAttr::Rename, transforming the replacement
name using by looking up the named Clang replacement, and
importing its name.

Fixes <rdar://problem/26301742>.
2016-06-01 23:12:48 -07:00