Skip to content

Commit 4a9a932

Browse files
committed
Ban @objcMembers Without Importing Foundation
rdar://98734024
1 parent 2c295ab commit 4a9a932

File tree

5 files changed

+20
-2
lines changed

5 files changed

+20
-2
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5238,7 +5238,7 @@ ERROR(objc_extension_not_class,none,
52385238
"'@objc' can only be applied to an extension of a class", ())
52395239

52405240
// If you change this, also change enum ObjCReason
5241-
#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}"
5241+
#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}"
52425242

52435243
WARNING(attribute_meaningless_when_nonobjc,none,
52445244
"'@%0' attribute is meaningless on a property that cannot be "

lib/Sema/TypeCheckAttr.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,9 +1147,11 @@ static bool checkObjCDeclContext(Decl *D) {
11471147
return false;
11481148
}
11491149

1150-
static void diagnoseObjCAttrWithoutFoundation(ObjCAttr *attr, Decl *decl,
1150+
static void diagnoseObjCAttrWithoutFoundation(DeclAttribute *attr, Decl *decl,
11511151
ObjCReason reason,
11521152
DiagnosticBehavior behavior) {
1153+
assert(attr->getKind() == DeclAttrKind::DAK_ObjC ||
1154+
attr->getKind() == DeclAttrKind::DAK_ObjCMembers);
11531155
auto *SF = decl->getDeclContext()->getParentSourceFile();
11541156
assert(SF);
11551157

@@ -1369,6 +1371,10 @@ void AttributeChecker::visitNonObjCAttr(NonObjCAttr *attr) {
13691371
void AttributeChecker::visitObjCMembersAttr(ObjCMembersAttr *attr) {
13701372
if (!isa<ClassDecl>(D))
13711373
diagnoseAndRemoveAttr(attr, diag::objcmembers_attribute_nonclass);
1374+
1375+
auto reason = ObjCReason(ObjCReason::ExplicitlyObjCMembers, attr);
1376+
auto behavior = behaviorLimitForObjCReason(reason, Ctx);
1377+
diagnoseObjCAttrWithoutFoundation(attr, D, reason, behavior);
13721378
}
13731379

13741380
void AttributeChecker::visitOptionalAttr(OptionalAttr *attr) {

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ swift::behaviorLimitForObjCReason(ObjCReason reason, ASTContext &ctx) {
3737
case ObjCReason::ExplicitlyCDecl:
3838
case ObjCReason::ExplicitlyDynamic:
3939
case ObjCReason::ExplicitlyObjC:
40+
case ObjCReason::ExplicitlyObjCMembers:
4041
case ObjCReason::ExplicitlyIBOutlet:
4142
case ObjCReason::ExplicitlyIBAction:
4243
case ObjCReason::ExplicitlyIBSegueAction:
@@ -71,6 +72,7 @@ unsigned swift::getObjCDiagnosticAttrKind(ObjCReason reason) {
7172
case ObjCReason::ExplicitlyCDecl:
7273
case ObjCReason::ExplicitlyDynamic:
7374
case ObjCReason::ExplicitlyObjC:
75+
case ObjCReason::ExplicitlyObjCMembers:
7476
case ObjCReason::ExplicitlyIBOutlet:
7577
case ObjCReason::ExplicitlyIBAction:
7678
case ObjCReason::ExplicitlyIBSegueAction:
@@ -128,6 +130,7 @@ void ObjCReason::describe(const Decl *D) const {
128130
case ObjCReason::ExplicitlyCDecl:
129131
case ObjCReason::ExplicitlyDynamic:
130132
case ObjCReason::ExplicitlyObjC:
133+
case ObjCReason::ExplicitlyObjCMembers:
131134
case ObjCReason::ExplicitlyIBOutlet:
132135
case ObjCReason::ExplicitlyIBAction:
133136
case ObjCReason::ExplicitlyIBSegueAction:

lib/Sema/TypeCheckObjC.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class ObjCReason {
4949
ExplicitlyDynamic,
5050
/// Has an explicit '@objc' attribute.
5151
ExplicitlyObjC,
52+
/// Has an explicit '@objcmembers' attribute.
53+
ExplicitlyObjCMembers,
5254
/// Has an explicit '@IBOutlet' attribute.
5355
ExplicitlyIBOutlet,
5456
/// Has an explicit '@IBAction' attribute.
@@ -101,6 +103,7 @@ class ObjCReason {
101103
case ExplicitlyCDecl:
102104
case ExplicitlyDynamic:
103105
case ExplicitlyObjC:
106+
case ExplicitlyObjCMembers:
104107
case ExplicitlyIBOutlet:
105108
case ExplicitlyIBAction:
106109
case ExplicitlyIBSegueAction:
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s
2+
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s -parse-as-library
3+
4+
@objcMembers class Oof {
5+
// expected-error@-1 {{@objcMembers attribute used without importing module 'Foundation'}}
6+
}

0 commit comments

Comments
 (0)