Commit Graph

329 Commits

Author SHA1 Message Date
Pavel Yaskevich
ce4ec06547 Merge pull request #66796 from xedin/rdar-111059036
[CSSimplify] Add special handling if specialized type comes from `TypeExpr`
2023-06-23 09:08:39 -07:00
Becca Royal-Gordon
49831a9e93 Fix @objcImpl crash with async/sync overloads
The @objcImpl checker would accidentally dereference a null pointer when it tried to check if an async requirement could be satisfied by a non-async method. Fix that mistake.

Fixes rdar://111064481.
2023-06-22 13:15:56 -07:00
Pavel Yaskevich
5e30445495 [CSSimplify] Add special handling if specialized type comes from TypeExpr
Add a special case for `TypeExpr` due to i.e. context specialization,
in such cases there is nothing for the solver to "open" so we need
to form opened type map manually.

Resolves: rdar://111059036
2023-06-20 21:58:04 -07:00
Becca Royal-Gordon
1532fb188c Merge pull request #66609 from beccadax/just-empty-protocol
Diagnose conformances on @objcImpl extensions
2023-06-14 14:12:13 -07:00
Becca Royal-Gordon
6758fdb518 Diagnose conformances on @objcImpl extensions
@objcImpl extensions aren’t allowed to declare new conformances; instead, they should either be declared in the header or in an ordinary extensions. (If they were permitted, they’d be ignored.)

Fixes rdar://110669366.
2023-06-13 17:21:44 -07:00
Becca Royal-Gordon
b14c00d521 Support required inits in @objcImpl
• Allow `required init`s in @objcImpl extensions of a class’s main body
• Validate that the presence or absence of a `required` modifier matches the imported header declaration.

Fixes rdar://110016760.
2023-06-01 13:21:02 -07:00
Becca Royal-Gordon
5c1ce9af80 Merge pull request #66073 from beccadax/implementation-errors
Diagnose additional @objcImpl member mismatch errors
2023-05-24 16:49:30 -07:00
Becca Royal-Gordon
9f0928e239 Match @objcImpl member types
Check the types of @objcImpl candidates against their requirements and diagnose *most* mismatches.

Unlike typical type matching rules, @objcImpl allows an implementation’s parameter *and* result types to be an IUO when the requirement isn’t. This runs against the normal covariance rules in the case of the result type. It’s meant to allow an implementation to handle nils passed to it and return nils even if the declaration formally claims nils are not permitted; this is occasionally necessary to reimplement Objective-C APIs without breaking ABI compatibility.

Fixes rdar://102063730.
2023-05-23 11:34:51 -07:00
Becca Royal-Gordon
2333ff5a20 Diagnose @objcImpl kind and settability errors
Sema now diagnoses @objcImpl implementations with:

• The wrong settability (i.e. a `let` used for a `readwrite` property)
• The wrong kind (i.e. a method used for a property)
2023-05-19 11:48:25 -07:00
Nate Chandler
594e690a00 [Test] Added new redundancy warnings.
Now that `InferredGenericSignatureRequest` creates
`StructuralRequirement`s from of the generic signature with valid source
locations, additional redundancy warnings are produced.  Update tests
with the new warnings.
2023-05-17 15:16:23 -07:00
Becca Royal-Gordon
00e55cb92d Don’t require @optional ObjC methods in @objcImpl
rdar://108461441
2023-05-03 19:58:45 -07:00
Slava Pestov
290701cb4d Sema: Ban shadowing generic parameters from outer scopes
Code like that is usually indicative of programmer error, and does not
round-trip through module interface files since there is no source
syntax to refer to an outer generic parameter.

For source compatibility this is a warning, but becomes an error with
-swift-version 6.

Fixes rdar://problem/108385980 and https://github.com/apple/swift/issues/62767.
2023-04-25 17:41:23 -04:00
Doug Gregor
79e26970ba Handle async vs. completion-handler mismatches in @_objcImplementation.
Fixes rdar://108160837.
2023-04-18 08:52:20 -07:00
Becca Royal-Gordon
a2f1d357ca Refactor and expand @objcImpl checking
Create a checker for @_objcImplementation member implementations that considers all of a class’s interface and implementation decls at once. This allows us to handle several things better:

• Unimplemented requirements are now diagnosed

• Header members that can match several implementations, or implementations that could match several header members, are now diagnosed

• Tailored diagnostic when the implementation's Swift name matches the header's selector instead of its Swift name

• Recommends inserting `@objc(<selector>)` when a Swift name matches but the implicit ObjC name doesn't

• An `@objc(<selector>)` on one implementation can eliminate its requirement from being considered for other implementations, resolving ambiguities

This does unfortunately regress the diagnostics when a requirement is implemented in the wrong extension. Some sort of whole-module checking would be needed to address this problem.
2023-03-25 14:53:29 -07:00
Becca Royal-Gordon
3bcefc0731 Diagnose objcImpl members with wrong name 2023-03-25 14:52:40 -07:00
Becca Royal-Gordon
cf86fd4a73 Correct and improve objcImpl member matching
• `@objc` is now inferred on non-`final` members of @objcImplementation extensions
• Diagnostics now suggest adding `private` to ObjC helper members, not `@objc`, in line with currently proposed behavior
• Better diagnostic for members implemented in the wrong extension

Part of rdar://103150189.
2023-03-25 14:52:40 -07:00
Michael Gottesman
40449a6987 [move-only] Emit a clearer message around deinits.
Specifically:

1. Fix the error message so that when we say you can't have a deinit that a
deinit can be on a noncopyable type along side a class or an actor.

2. Even though we already error on @objc enums and say they cannot be
noncopyable, we did not emit an error on the deinit saying that @objc enums
cannot have a deinit. I put in a nice to have error just to make it even
clearer.

rdar://105855978
rdar://106566054
2023-03-12 14:47:34 -07:00
Doug Gregor
ef7f707fcc Revert "Improve @objcImplementation member checking" 2023-03-10 12:00:33 -08:00
Becca Royal-Gordon
7f688ef2c1 Refactor and expand @objcImpl checking
Create a checker for @_objcImplementation member implementations that considers all of a class’s interface and implementation decls at once. This allows us to handle several things better:

• Unimplemented requirements are now diagnosed

• Header members that can match several implementations, or implementations that could match several header members, are now diagnosed

• Tailored diagnostic when the implementation's Swift name matches the header's selector instead of its Swift name

• Recommends inserting `@objc(<selector>)` when a Swift name matches but the implicit ObjC name doesn't

• An `@objc(<selector>)` on one implementation can eliminate its requirement from being considered for other implementations, resolving ambiguities

This does unfortunately regress the diagnostics when a requirement is implemented in the wrong extension. Some sort of whole-module checking would be needed to address this problem.
2023-03-03 17:40:48 -08:00
Becca Royal-Gordon
e7c91b2236 Diagnose objcImpl members with wrong name 2023-03-01 09:00:43 -08:00
Becca Royal-Gordon
3212d2e60e Correct and improve objcImpl member matching
• `@objc` is now inferred on non-`final` members of @objcImplementation extensions
• Diagnostics now suggest adding `private` to ObjC helper members, not `@objc`, in line with currently proposed behavior
• Better diagnostic for members implemented in the wrong extension

Part of rdar://103150189.
2023-03-01 09:00:43 -08:00
Luciano Almeida
e5e9827bd5 Merge pull request #60680 from cbjeukendrup/diag_unsupported_existential_extension
Improve diagnostics when trying to extend existential type
2023-01-05 10:11:36 -03:00
Becca Royal-Gordon
3e4ea43adf Don’t diagnose @_objcImpl conflicts with inherited inits
Previously, Swift would reject an `override public init(…)` in an `@_objcImplementation` because ClangImporter would have already synthesized inherited initializers that conflicted with the overrides. Ignore these spurious conflicts, and also move a check out of IsObjCRequest and into the conflict-handling code.

Additional work towards rdar://70730077.
2022-10-27 17:00:43 -07:00
Becca Royal-Gordon
75965d0588 Exclude overrides from being member impls
Without this change, an `@_objcImplementation` cannot override parent class methods, because the special access control behavior breaks the access control checks for overrides.
2022-10-27 17:00:43 -07:00
Becca Royal-Gordon
881f1f90a8 Re-allow @objc final
Treating this as forbidden was incorrect; an `@objc final` method is simply one that isn’t a member implementation but does have an ObjC entry point.

Formalize and centralize the definition of what a member implementation is, tweak it so that it’s basically “non-final and internal or greater”, and permit `@objc final`. Also remove the inference of `final` on `let`s in @_objcImpl extensions.
2022-10-27 16:51:13 -07:00
Becca Royal-Gordon
ecf0ee65b8 Cache @_objcImpl pointers and diagnose dupes 2022-10-18 17:21:56 -07:00
Becca Royal-Gordon
3a2f12a099 Allow stored properties in @_objcImpls
Stored properties are only allowed in the extension implementing the class's main interface, not its categories. This also means banning `@objc final`, which is unenforceable anyway when ObjC subclasses are allowed, and therefore allowing `@objc let` and `@objc static` properties to be overridden if they're declared in objcImplementations.
2022-10-18 17:21:56 -07:00
Becca Royal-Gordon
0678a38ce4 Require objcImplementation members to avoid vtable
They either must be @objc dynamic (the dynamic is implicit) or final.
2022-10-18 17:21:56 -07:00
Becca Royal-Gordon
e544c21f99 Make all internal-or-more @_objcImpl members impls 2022-10-18 17:21:56 -07:00
Becca Royal-Gordon
f2a0ab79c7 Add basic Sema support for @_objcImplementation
Does not validate members yet; nor does it emit different metadata.
2022-10-18 17:21:56 -07:00
Casper Jeukendrup
d47bba6644 Improve diagnostics when attempting to extend existential type 2022-09-23 19:27:05 +02:00
Anthony Latsis
0ab77fb849 Gardening: Migrate test suite to GH issues (file names): decl 2022-09-18 17:54:58 +03:00
Anthony Latsis
0c749b2651 Gardening: Migrate test suite to GH issues: decl/ext 2022-08-26 03:26:32 +03:00
Slava Pestov
b1182ebc15 Sema: Improved check for failure to bind an extension
Calling computeExtendedNominal() won't catch the case where the
extended type did not exist at extension binding time but then
appeared later, like an inferred associated type witness for
example.
2022-08-02 23:12:24 -04:00
Holly Borla
609733bb88 [SE-0361] Update tests for bound generic extensions. 2022-06-30 17:25:17 -07:00
Slava Pestov
dac8d666ee Stop passing -requirement-machine-{abstract,inferred,protocol}-signatures flags in tests
These flags are now no-ops.
2022-05-10 12:56:17 -04:00
Slava Pestov
f39372b33d RequirementMachine: Turn off redundant requirement warnings by default and add -warn-redundant-requirements frontend flag 2022-05-10 01:49:56 -04:00
Slava Pestov
b4b873332f Update -requirement-machine-* flags in various tests
- Don't pass 'verify' since it's now the default
- Update tests where diagnostics changed in a correct way to pass 'on' instead
- Delete compiler_scale/explicit_requirements_perf.swift since it's not testing anything with the requirement machine
2022-03-31 15:57:36 -04:00
Kavon Farvardin
c4fc99e71d update diagnostic since actors can have deinits 2022-02-28 16:24:55 -07:00
Robert Widmann
25ab410896 Implement (Sugared) Bound Generic Extensions
A scoped-down version of #39307. Implement extension of bound generic types. The important bit here is in TypeCheckGeneric where we now use the underlying type of a typealias and its associated nominal type decl when we're generating substitutions for the extended type.

Put this behind a new experimental flag

-enable-experimental-bound-generic-extensions

Resolves SR-4875
Resolves rdar://17434633
2022-02-02 17:05:23 -08:00
Anthony Latsis
5215fe5d95 AST: Make sure malscoped extensions get their extended nominal computed 2021-11-08 17:29:38 +03:00
Pavel Yaskevich
b4976df82c [Diagnostics] Adjust missing conformance note to use ':' instead of '==' 2021-06-25 12:05:47 -07:00
Slava Pestov
299ff02684 GSB: Diagnose redundant layout requirements using the redundant requirement graph 2021-03-27 00:35:19 -04:00
Anthony Latsis
b7fcd2f434 Diag: Reword some errors for invalid usage of covariant Self 2021-03-12 15:54:21 +03:00
Anthony Latsis
06ceb19ccf Diag: Fix inaccuracy in dynamic_self_invalid 2021-02-11 03:22:20 +03:00
Suyash Srijan
6e6de518eb [Sema] Improve diagnostics for use of self access kind modifier on accessors inside classes (#33602) 2020-08-25 20:02:52 +01:00
Rintaro Ishizaki
bc2085683f [Test] Add a test case for extension where clause with missing body
rdar://problem/66943328
2020-08-12 16:36:16 -07:00
Varun Gandhi
a1716fe2a6 [Diagnostics] Update compiler diagnostics to use less jargon. (#31315)
Fixes rdar://problem/62375243.
2020-04-28 14:11:39 -07:00
Eric York
8a1a194f36 [SR-12460] Don't crash when missing a type in a Diagnostic message. (#30979)
* Don't crash when missing a type in a Diagnostic message.
Print an empty string for the missing type.

Resolves SR-12460

* Added new diagnostic message, eg. "operator '==' declared in extension must be 'static'"
2020-04-14 16:13:06 -07:00
Owen Voorhees
77aa5642c3 [Diagnostics] Expand test coverage of existing edu notes 2020-04-09 18:18:25 -07:00