mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
In #69257, we modified `ObjCReason` to carry a pointer to the @implementation attribute for the `MemberOfObjCImplementationExtension` kind. This made it mark the @implementation attribute as invalid, suppressing diagnostics from the ObjCImplementationChecker. However, invalidating the attribute *also* causes it to be skipped by serialization. That isn’t a problem if the diagnostics are errors, since we’ll never emit the serialized module, but #74135 softened these diagnostics to warnings for early adopters. The upshot was that if Swift emitted one of these warnings when it compiled a library, clients of that library would see the objcImpl extension as a normal extension instead. This would cause various kinds of mischief: ambiguous name lookups because implementations weren’t being excluded, overrides failing because an implementation was `public` instead of `open`, asserts and crashes in SILGen and IRGen because stored properties were found in seemingly normal extensions, etc. Fix this by setting a separate bit on ObjCImplementationAttr, rather than the invalid bit, and modifying the implementation checker to manually suppress many diagnostics when that bit is set. Fixes rdar://134730183.
26 lines
1.2 KiB
Swift
26 lines
1.2 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-typecheck-verify-swift -target %target-stable-abi-triple -module-name main -I %S/Inputs %s
|
|
// RUN: %target-swift-frontend -emit-module -target %target-stable-abi-triple -module-name main -o %t -I %S/Inputs %s
|
|
// RUN: llvm-bcanalyzer %t/main.swiftmodule > %t/main.swiftmodule.txt
|
|
// RUN: %target-swift-ide-test -print-module -target %target-stable-abi-triple -module-to-print=main -I %t -source-filename=%s >%t/main.txt
|
|
// RUN: %FileCheck %s --input-file=%t/main.txt
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
import objc_implementation
|
|
|
|
// rdar://134730183 - ensure that errors reduced to warnings by early adopter
|
|
// syntax don't invalidate the @implementation attribute (and cause it to not
|
|
// be serialized)
|
|
|
|
// CHECK-LABEL: @_objcImplementation extension ObjCImpl
|
|
@_objcImplementation extension ObjCImpl {
|
|
// CHECK-DAG: func cannotBeObjCMethod(_ value: Int?)
|
|
private func cannotBeObjCMethod(_ value: Int?) {}
|
|
// expected-warning@-1 {{method cannot be in an @objc @implementation extension of a class (without final or @nonobjc) because the type of the parameter cannot be represented in Objective-C}}
|
|
|
|
// CHECK-DAG: @objc func goodMethod()
|
|
@objc public func goodMethod() {}
|
|
}
|