mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Ban @objcMembers Without Importing Foundation
rdar://98734024
This commit is contained in:
@@ -5238,7 +5238,7 @@ ERROR(objc_extension_not_class,none,
|
||||
"'@objc' can only be applied to an extension of a class", ())
|
||||
|
||||
// If you change this, also change enum ObjCReason
|
||||
#define OBJC_ATTR_SELECT "select{marked @_cdecl|marked dynamic|marked @objc|marked @IBOutlet|marked @IBAction|marked @IBSegueAction|marked @NSManaged|a member of an @objc protocol|implicitly @objc|an @objc override|an implementation of an @objc requirement|marked @IBInspectable|marked @GKInspectable|in an @objc extension of a class (without @nonobjc)|marked @objc by an access note}"
|
||||
#define OBJC_ATTR_SELECT "select{marked @_cdecl|marked dynamic|marked @objc|marked @objcMembers|marked @IBOutlet|marked @IBAction|marked @IBSegueAction|marked @NSManaged|a member of an @objc protocol|implicitly @objc|an @objc override|an implementation of an @objc requirement|marked @IBInspectable|marked @GKInspectable|in an @objc extension of a class (without @nonobjc)|marked @objc by an access note}"
|
||||
|
||||
WARNING(attribute_meaningless_when_nonobjc,none,
|
||||
"'@%0' attribute is meaningless on a property that cannot be "
|
||||
|
||||
@@ -1147,9 +1147,11 @@ static bool checkObjCDeclContext(Decl *D) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void diagnoseObjCAttrWithoutFoundation(ObjCAttr *attr, Decl *decl,
|
||||
static void diagnoseObjCAttrWithoutFoundation(DeclAttribute *attr, Decl *decl,
|
||||
ObjCReason reason,
|
||||
DiagnosticBehavior behavior) {
|
||||
assert(attr->getKind() == DeclAttrKind::DAK_ObjC ||
|
||||
attr->getKind() == DeclAttrKind::DAK_ObjCMembers);
|
||||
auto *SF = decl->getDeclContext()->getParentSourceFile();
|
||||
assert(SF);
|
||||
|
||||
@@ -1369,6 +1371,10 @@ void AttributeChecker::visitNonObjCAttr(NonObjCAttr *attr) {
|
||||
void AttributeChecker::visitObjCMembersAttr(ObjCMembersAttr *attr) {
|
||||
if (!isa<ClassDecl>(D))
|
||||
diagnoseAndRemoveAttr(attr, diag::objcmembers_attribute_nonclass);
|
||||
|
||||
auto reason = ObjCReason(ObjCReason::ExplicitlyObjCMembers, attr);
|
||||
auto behavior = behaviorLimitForObjCReason(reason, Ctx);
|
||||
diagnoseObjCAttrWithoutFoundation(attr, D, reason, behavior);
|
||||
}
|
||||
|
||||
void AttributeChecker::visitOptionalAttr(OptionalAttr *attr) {
|
||||
|
||||
@@ -37,6 +37,7 @@ swift::behaviorLimitForObjCReason(ObjCReason reason, ASTContext &ctx) {
|
||||
case ObjCReason::ExplicitlyCDecl:
|
||||
case ObjCReason::ExplicitlyDynamic:
|
||||
case ObjCReason::ExplicitlyObjC:
|
||||
case ObjCReason::ExplicitlyObjCMembers:
|
||||
case ObjCReason::ExplicitlyIBOutlet:
|
||||
case ObjCReason::ExplicitlyIBAction:
|
||||
case ObjCReason::ExplicitlyIBSegueAction:
|
||||
@@ -71,6 +72,7 @@ unsigned swift::getObjCDiagnosticAttrKind(ObjCReason reason) {
|
||||
case ObjCReason::ExplicitlyCDecl:
|
||||
case ObjCReason::ExplicitlyDynamic:
|
||||
case ObjCReason::ExplicitlyObjC:
|
||||
case ObjCReason::ExplicitlyObjCMembers:
|
||||
case ObjCReason::ExplicitlyIBOutlet:
|
||||
case ObjCReason::ExplicitlyIBAction:
|
||||
case ObjCReason::ExplicitlyIBSegueAction:
|
||||
@@ -128,6 +130,7 @@ void ObjCReason::describe(const Decl *D) const {
|
||||
case ObjCReason::ExplicitlyCDecl:
|
||||
case ObjCReason::ExplicitlyDynamic:
|
||||
case ObjCReason::ExplicitlyObjC:
|
||||
case ObjCReason::ExplicitlyObjCMembers:
|
||||
case ObjCReason::ExplicitlyIBOutlet:
|
||||
case ObjCReason::ExplicitlyIBAction:
|
||||
case ObjCReason::ExplicitlyIBSegueAction:
|
||||
|
||||
@@ -49,6 +49,8 @@ public:
|
||||
ExplicitlyDynamic,
|
||||
/// Has an explicit '@objc' attribute.
|
||||
ExplicitlyObjC,
|
||||
/// Has an explicit '@objcmembers' attribute.
|
||||
ExplicitlyObjCMembers,
|
||||
/// Has an explicit '@IBOutlet' attribute.
|
||||
ExplicitlyIBOutlet,
|
||||
/// Has an explicit '@IBAction' attribute.
|
||||
@@ -101,6 +103,7 @@ private:
|
||||
case ExplicitlyCDecl:
|
||||
case ExplicitlyDynamic:
|
||||
case ExplicitlyObjC:
|
||||
case ExplicitlyObjCMembers:
|
||||
case ExplicitlyIBOutlet:
|
||||
case ExplicitlyIBAction:
|
||||
case ExplicitlyIBSegueAction:
|
||||
|
||||
6
test/Sema/objcmembers_attr_requires_module.swift
Normal file
6
test/Sema/objcmembers_attr_requires_module.swift
Normal file
@@ -0,0 +1,6 @@
|
||||
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s
|
||||
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s -parse-as-library
|
||||
|
||||
@objcMembers class Oof {
|
||||
// expected-error@-1 {{@objcMembers attribute used without importing module 'Foundation'}}
|
||||
}
|
||||
Reference in New Issue
Block a user