Commit Graph

415 Commits

Author SHA1 Message Date
Jordan Rose
c8c5c643bd [ClangImporter] Also strip "WithError" like we do "AndReturnError".
A few APIs in our frameworks use "WithError" instead, even though it's not
the recommended pattern.

rdar://problem/21212613

Swift SVN r29577
2015-06-23 20:39:53 +00:00
Jordan Rose
8410a9bdea [ClangImporter] Teach lookupValue to find top-level swift_private declarations.
Essentially, if we see a name that starts with "__", start the whole process
again.

Part of rdar://problem/20070465

Swift SVN r29428
2015-06-17 01:46:15 +00:00
Joe Groff
c354a7cf63 IRGen: Relax assertion that C parameter ABI types match size of Swift struct representation types.
Share the code that does elementwise coercions, which already behaved correctly, with the code that does struct-to-struct coercions, which still had the overly-conservative constraint. Fixes rdar://problem/21294916.

Swift SVN r29399
2015-06-16 17:23:52 +00:00
Jordan Rose
5619b5dd44 [apinotes] Remove information that has been migrated into the SDKs.
I'll be filing Radars for the rest of these. (Some of them already have them.)

rdar://problem/19003559&19756368&20276854

Swift SVN r29324
2015-06-05 23:02:17 +00:00
Jordan Rose
bfcc8482d8 Re-apply "[ClangImporter] Ban a few deprecated methods of NSDocument."
Now with the right REQUIRES line in the new test.

rdar://problem/21177341

Swift SVN r29237
2015-06-02 17:30:28 +00:00
Ted Kremenek
b2fa002ce4 Revert "[ClangImporter] Ban a few deprecated methods of NSDocument."
This is breaking the iOS testers.

Swift SVN r29227
2015-06-02 05:42:15 +00:00
Jordan Rose
ba8d1a5656 [ClangImporter] Ban a few deprecated methods of NSDocument.
...so that their modern NSError-based variants won't be imported using an
extra "error: ()" parameter. Apart from looking prettier, this avoids a
crash when overriding the "error: ()" versions, rdar://problem/21144509.

Once NS_REFINED_IN_SWIFT has been implemented we can probably use that instead.
Filed rdar://problem/21192039 to remove the hack at that point.

rdar://problem/21177341

Swift SVN r29212
2015-06-01 23:04:01 +00:00
Doug Gregor
e033734757 Add test case from rdar://problem/21081557.
This was recently fixed by r29060.

Swift SVN r29094
2015-05-28 04:05:54 +00:00
Jordan Rose
b92e0c944d [ClangImporter] Implement NS_SWIFT_NAME for enumerators.
NS_SWIFT_NAME on enum constants has two effects: on top of renaming the
member, it also removes it from the prefix-matching logic.

Part of rdar://problem/19240897

Swift SVN r28927
2015-05-22 20:15:09 +00:00
John McCall
af25b38029 Teach SILFunctionType substitution to handle foreign error conventions.
Normally, ObjC methods are never generic, but this comes up
with protocol methods.

rdar://21051021

Swift SVN r28900
2015-05-22 01:23:04 +00:00
Jordan Rose
fa5bd4c6c8 [ClangImporter] Allow apinotes to affect inherited initializers.
Then use that to ban NSError.init(), because it doesn't create a valid
NSError. In the long run Foundation will hopefully add this to their
headers, but they can't yet (rdar://problem/19977891).

rdar://problem/21042412

Swift SVN r28881
2015-05-21 18:11:17 +00:00
Dmitri Hrybenko
180dec1a46 Fix the test to use the correct availability attribute
Swift SVN r28796
2015-05-19 22:44:08 +00:00
Devin Coughlin
4e4a73f4b9 [AST] Use the short-form @available() syntax in the AST printer where possible.
Reapply r28734. Argyrios updated SourceKit dependencies on swift and clang libraries in
SourceKit r28765, so this should work now.

Change the AST printer to use the new short-form @available attribute syntax for
attributes with only introduction versions. So, for example, a declaration
annotated as:
  @available(iOS, introduced=8.0) @available(OSX, introduced=10.10)
  func foo()
will be printed as:
  @available(iOS 8.0, OSX 10.10, *) func foo()

We won't include the attribute on the short form if it has a deprecated or
obsoleted version; nor if it has a message, a rename, or marks unconditional
unavailability.

This commit has a corresponding change to the SourceKit tests.

rdar://problem/20982322

Swift SVN r28768
2015-05-19 08:37:37 +00:00
Devin Coughlin
49a6ceca30 Revert "[AST] Use the short-form @available() syntax in the AST printer where possible."
Something wrong with paired SourceKit commit.

This reverts commit dd5e8248af11c286b992258379744651dd4bb2d0.

Swift SVN r28744
2015-05-19 03:46:36 +00:00
Devin Coughlin
974973eeb1 [AST] Use the short-form @available() syntax in the AST printer where possible.
Change the AST printer to use the new short-form @available attribute syntax for
attributes with only introduction versions. So, for example, a declaration
annotated as:

@available(iOS, introduced=8.0)
@available(OSX, introduced=10.10)
func foo()

will be printed as:

@available(iOS 8.0, OSX 10.10, *)
func foo()

We won't include the attribute on the short form if it has a deprecated or
obsoleted version; nor if it has a message, a rename, or marks unconditional
unavailability.

There is a corresponding change to the SourceKit tests.

rdar://problem/20982322

Swift SVN r28734
2015-05-19 01:24:34 +00:00
John McCall
98824498ba Flesh out the foreign-override testing a bit.
Swift SVN r28709
2015-05-18 18:14:07 +00:00
Slava Pestov
95dc298d3a ForeignErrorConvention ctor was not setting ErrorParameterIsReplaced correctly
For some reason this was only breaking with initializers, and not
ordinary methods, where there was both a throwing and non-throwing
version of the same method.

Fixes <rdar://problem/20922973>.

Swift SVN r28534
2015-05-13 21:42:35 +00:00
Jordan Rose
46b52576d3 Recognize imported enum case aliases in TypeCheckPattern.cpp.
...so that they can still be used with exhaustive switches.

This is a hack---groveling through the AST to see if it's in the particular
form of an imported enum case alias---but at least it's limited to imported
properties.

More rdar://problem/18662118

Swift SVN r28326
2015-05-08 21:01:52 +00:00
Doug Gregor
b5626942b4 When diagnostic Objective-C method conflicts, prefer decls with source locations.
It's possible (and likely!) that Objective-C method conflicts will
involve declarations with and without source locations. Make sure that
the first error has a property source location in such cases. Fixes
rdar://problem/20042769.

Swift SVN r28299
2015-05-07 22:44:33 +00:00
Mark Lacey
1f9e958f38 Fix vtable thunk generation for cases with optional return values.
With the test case included in this commit we were first hitting an
assert due to a cast<FuncDecl>(decl) that failed because the supplied
decl was for a constructor, and after fixing this we failed verification
due to using the wrong result type for the generated thunk.

The result should have the same kind of 'optionalness' as the base-class
method's result, but if the type is some kind of optional it should be
wrapping the same type as the thunked-to function.

Fixes at least part of rdar://problem/20663080. I need to go back and
patch an older toolset to see if this completely resolves the issue.

Swift SVN r28289
2015-05-07 21:19:01 +00:00
John McCall
9065880e5a When an error import would conflict with another method,
preserve the original method name.

This heuristic is based on the Objective-C selector and therefore
doesn't really handle factory methods that would conflict with
initializers, but we can hope that those simply don't come up in
the wild.

It's not clear that this is the best thing to do --- it tends to
promote the non-throwing API over what's probably a newer, throwing
API --- but it's significantly easier, and it unblocks code without
creating deployment problems.

Swift SVN r28066
2015-05-02 01:52:37 +00:00
John McCall
ac50cbc801 Enable error-handling in import by default.
Swift SVN r28048
2015-05-01 20:35:28 +00:00
John McCall
9638611277 Use AbstractionPattern to find Clang types for inputs and
results when finding bridged types, rather than reinventing
(well, pre-inventing) the same thing elsewhere.

Doing this apparently forces AbstractionPattern to deal
with ObjC protocol methods for the first time, which are
generic and therefore require even the Clang-based
abstraction patterns to propagate generic signatures.

Use this infrastructure to allow foreign error conventions
to suppress the wrapping of nonnull bridged collection results
in a level of optionality.  We can't treat nil results as
an empty collection while simultaneously treating them as
an error signal.

Swift SVN r28022
2015-05-01 04:38:17 +00:00
Doug Gregor
de635a8cd9 Implement the 'warn_unused_result' attribute.
@warn_unused_result can be attached to function declarations to
produce a warning if the function is called but its result is not
used. It has two optional parameters that can be placed in
parentheses:

  message="some message": a message to include with the warning.

  mutable_variant="somedecl": the name of the mutable variant of the
  method that should be suggested when the subject method is called on
  a mutable value.

The specific use we're implementing this for now is for the mutating
and in-place operations. For example:

  @warn_unused_result(mutable_variant="sortInPlace") func sort() -> [Generator.Element] { ... }
  mutating func sortInPlace() { ... }

Translate Clang's __attribute__((warn_unused_result)) into
@warn_unused_result.

Implements rdar://problem/18165189.

Swift SVN r28019
2015-05-01 04:10:40 +00:00
John McCall
26b3f386e0 Fix a bug with importing inherited factory methods with
foreign-error conventions.

Swift SVN r28003
2015-04-30 22:34:41 +00:00
John McCall
77f58e99ea Fix ObjC method abstraction patterns for foreign errors.
Swift SVN r27943
2015-04-29 23:11:24 +00:00
John McCall
0c6e412116 Rename and reorganize some error-handling tests.
Swift SVN r27914
2015-04-29 17:28:52 +00:00
John McCall
a00b7f01e4 Strip "AndReturnError" from method base names when removing
an initial error out-parameter.

rdar://20722195

Swift SVN r27865
2015-04-28 08:53:24 +00:00
Devin Coughlin
3de8ec3bca Sema: Consider availability of conforming type when diagnosing protocol witness availability
To be safe, protocol witnesses need to be as available as their requirements.
Otherwise, the programmer could access an unavailable declaration by upcasting
to the protocol type and accessing the declaration via its requirement.

Prior to this commit, we enforced safety by requiring that the annotated
available range of a requirement must be completely contained within the
annotated available range of the witness.

However, there are cases where this requirement is too restrictive. Suppose
there is some super class Super with an availability-restricted method f():

class Super {
  @availability(iOS, introduced=6.0)
  void func f() { ... }
}

Further, suppose there is a protocol HasF with unrestricted availability:

protocol HasF {
  void func f()
}

and then a limited-availability class Sub extends Super and declares a
conformance to HasF:

@availability(iOS, introduced=8.0)
class Sub: Super, HasF {

}

Sub does conform to HasF: the witness for HasF's f() requirement is Super's f().
But Super's f() is less available (iOS 6 and up) than HasF's f() requires
(all versions) and so--prior to this commit--the compiler would emit
an error.

This error is too conservative. The conforming type, Sub,
is only available on iOS 8.0 and later. And, given an environment of iOS 8.0
and later, the availability of the requirement and the witness is the same, so
the conformance is safe.

This false alarm arises in UIKit, where Super is UIView, HasF
is UIGestureRecognizerDelegate, and f() is gestureRecognizerShouldBegin().

The fix is to change the safety requirement for protocol witnesses:
we now require that the intersection of the availabilities of the conforming
type and the protocol requirement is fully contained in the intersection of the
availabilities of the conforming type and the witness. It does not matter if
the containment does not hold for versions on which the conforming type is not
available.

rdar://problem/20693144

Swift SVN r27712
2015-04-24 23:12:19 +00:00
Joe Groff
31388b0899 ClangImporter: Import (some) vector types.
When -enable-simd-import is active, if we encounter a vector type, try to load the SIMD Swift module, and if successful, map float, double, and int vectors to SIMD.{Float,Double,Int}N types if they exist.

Swift SVN r27367
2015-04-16 19:04:09 +00:00
John McCall
6d2326f08a Test (and fix) some simple calls to foreign-error methods.
Swift SVN r27296
2015-04-14 23:52:53 +00:00
Joe Groff
570f08baca Sema: Recognize NSError-to-ErrorType-conformance casts as possible.
Swift SVN r27254
2015-04-13 17:14:49 +00:00
Dmitri Hrybenko
6b8037374c ClangImporter: ignore availability(swift, unavailable) declarations when
calculating the common prefix of enumerators

rdar://20507924

Swift SVN r27228
2015-04-11 02:04:14 +00:00
Dmitri Hrybenko
3b8a2290de ClangImporter: ignore swift1_unavailable declarations when calculating
the common prefix of enumerators

rdar://20507924

Swift SVN r27227
2015-04-11 01:40:55 +00:00
Devin Coughlin
53fd9fb59c Sema: Finish staging back in availability checking in synthesized functions
Remove the suppression of deprecation and potential unavailability diagnostics in
synthesized functions. We still suppress some explicit unavailability diagnostics -- those
in synthesized functions in synthesized functions that are lexically contained in
declarations that are themselves annotated as unavailable. For these cases, the right
solution <rdar://problem/20491640> is to not synthesize the bodies of these functions in
the first place.

rdar://problem/20024980

Swift SVN r27203
2015-04-10 05:19:04 +00:00
Devin Coughlin
e6344938c3 Sema: Disallow potential unavailability on script-mode globals
In source files that are in script mode, global variable initialization
expressions are eagerly executed. For this reason, disallow @availability
attributes having 'introduced=' on script-mode globals.

I had to rejigger a fair number of potential unavailability tests because they
weren't written with this distinction in mind.

Swift SVN r27137
2015-04-08 21:29:14 +00:00
Jordan Rose
182ef27f95 [ClangImporter] Handle __attribute__((availability(swift, unavailable))).
This is the new and improved version of
__attribute__((annotate("swift1_unavailable"))), with the "improved" being
specifically that the 'availability' attribute supports a message.

This requires a corresponding Clang commit.

Swift side of rdar://problem/18768673.

Swift SVN r27053
2015-04-07 02:40:22 +00:00
Devin Coughlin
8a8d53b10c Sema: Infer required availability for synthesized designated initializer overrides.
When synthesizing a designated initializer override, we now ensure that the synthesized
initializer has the same availability as the initializer it is overriding.

Swift SVN r26732
2015-03-30 22:06:06 +00:00
Devin Coughlin
02f542c2d0 [Sema]Suppress availability diagnostics inside synthesized functions.
This commit suppresses errors for references to unavailable symbols inside
implicit functions.

This is a quick hack to fix a hit-listed radar <rdar://problem/20007266> where
the compiler was emitting spurious errors for enums explicitly marked
unavailable in Objective-C and whose nil literal conformance is synthesized by
the importer. These errors could occur when user code made no apparent reference
to the enum in question and instead only referred to an imported class that
itself referred to the enum in a method signature.

We will need to do something systematic about availability and deprecation
diagnostics in synthesized code.  In particular, we should make sure that:
(1) we never emit code that references explicitly unavailable symbols;
(2) that the user never gets an error about symbol that they did not explicitly type; and
(3) that errors can dealt with via the appropriate availability check or annotation. I'm
tracking this with radar rdar://problem/20024980.

rdar://problem/20007266

Swift SVN r26251
2015-03-18 05:51:01 +00:00
Doug Gregor
56443538e9 Clang importer: hammer over inconsistencies between property/getter/setter optionality.
When an imported Objective-C property has nullability, force that
nullability onto the result of its getter and the parameter of its
setter, so that we have consisteny nullability among the three. SILGen
assumes that this is the case, so this fixes the null_resettable-based
crash in <rdar://problem/20145910>.

Swift SVN r26198
2015-03-17 00:03:33 +00:00
Dmitri Hrybenko
e6f53a38cc stdlib: remove swift_createDate
It was added for testing and it is actually never used now.

Swift SVN r26195
2015-03-16 22:25:27 +00:00
Jordan Rose
edf3bb460d [ClangImporter] Ignore deprecated enum constants when computing prefixes.
This fixes the import of enums like NSCalendarUnit, which changed from
NSXXXCalendarUnit to NSCalendarUnitXXX, as has been the guideline in
recent years. Now even when the old names are present, we can still
prefix-strip based on the new names. If /all/ options are deprecated,
though, we'll prefix-strip as we did before.

Note that we /don't/ check the current deployment target for this,
because we want to use the "nice" names as soon as we have an SDK where
they're available, not when the deployment target matches such an SDK.

rdar://problem/17686122

Swift SVN r26184
2015-03-16 18:01:45 +00:00
Devin Coughlin
1e5daf7557 [Sema] Suppress deprecation warnings inside implicit functions
This commit suppresses deprecation warnings for references to deprecated symbols
by climbing the DeclContext hierarchy to determine if the warning location is
inside an implicit function.

This is a quick fix to get rid of spurious warnings for deprecated enums whose
nil literal conformance is synthesized by the importer. These warnings would
occur even when user code made no apparent reference to the enum in question and
instead only referred to an imported class that itself referred to the enum in a
method signature. This quick fix intentionally drops some valid warnings
(for example, for a synthesized call to a deprecated initializer in a super
class). rdar://problem/20024980 tracks adding these special purpose warnings
back.

rdar://problem/20007266

Swift SVN r25720
2015-03-03 21:16:01 +00:00
Jordan Rose
a493410402 [ClangImporter] Map MacTypes.h's ItemCount and ByteCount to Swift.Int.
typedef unsigned long ByteCount;
  typedef unsigned long ItemCount;

Both of these are still in use by CoreMIDI, but we don't have a reason to
keep them distinct in Swift.

rdar://problem/19939552

Swift SVN r25529
2015-02-25 05:00:06 +00:00
Jordan Rose
5554cec143 [ClangImporter] Don't inherit initializers as designated...
...even if they were designated in the base class. (Unless they're required,
in which case they're still required.)

This led to Swift subclasses treating convenience initializers as
designated initializers, which (if synthesized) led to properties being
initialized twice.

rdar://problem/19730160

Swift SVN r25410
2015-02-20 02:26:55 +00:00
Doug Gregor
f919dd5248 __attribute__((noescape)) isn't getting imported properly for methods.
Fixes rdar://problem/19818617.

Swift SVN r25256
2015-02-12 22:53:59 +00:00
Joe Groff
a0ecab5b16 ClangImporter: Don't attempt to bridge __unsafe_unretained NSString * fields in structs.
We certainly can't import them as stored properties, and it's too late to try to bridge them as computed property, so restore the old behavior of importing them as unbridged object types. The types still come in as strong managed reference types, which is still wrong, but seems to be right enough for Khan Academy and potentially other existing apps for now, and I don't want to introduce additional source-breaking changes and instability this late in the game. Fixes rdar://problem/19789023, leaving rdar://problem/19790608 to be done when we can afford more churn.

Swift SVN r25158
2015-02-11 01:30:20 +00:00
Jordan Rose
6a50a12bef [PrintAsObjC] Don't assume typedef'd enums have a name themselves.
...and then fix our forward-declaration logic that assumed that they did.

This fixes a rare case where we would end up printing "enum" twice if the
user (benignly) misused NS_ENUM.

rdar://problem/19769964

Swift SVN r25143
2015-02-10 23:52:44 +00:00
Dmitri Hrybenko
1952a103ef ClangImporter: import size_t as Int
Converging APIs to use ``Int`` as the default integer type allows users to
write fewer explicit type conversions.

Importing ``size_t`` as a signed ``Int`` type is not be a problem for 64-bit
platforms.  32-bit platforms are important, but the usecase for an
unsigned ``size_t`` on 32-bit platforms is pretty marginal, and for code
that nevertheless needs to do that there is always the option of doing a
bitcast to ``UInt`` or using C.

rdar://18949559

Swift SVN r25070
2015-02-07 10:39:00 +00:00
Devin Coughlin
2c5f786ffb clang-importer: Always import attributes for accessors
This commit changes the clang importer to always import attributes on property accessors.
Previously, attributes were only imported if the accessor method was declared before the
property but not if the accessor method was declared after it.

Swift SVN r25018
2015-02-05 21:46:45 +00:00