Skip to content

Commit deffb17

Browse files
authored
Merge pull request swiftlang#18965 from DougGregor/case-the-joint-5.0
[5.0 branch] Make sure to allow '@objc' on enum elements
2 parents 6d0c9de + a017fed commit deffb17

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ bool swift::shouldDiagnoseObjCReason(ObjCReason reason, ASTContext &ctx) {
4949

5050
case ObjCReason::MemberOfObjCSubclass:
5151
case ObjCReason::MemberOfObjCMembersClass:
52+
case ObjCReason::ElementOfObjCEnum:
5253
case ObjCReason::Accessor:
5354
return false;
5455
}
@@ -73,6 +74,7 @@ unsigned swift::getObjCDiagnosticAttrKind(ObjCReason reason) {
7374

7475
case ObjCReason::MemberOfObjCSubclass:
7576
case ObjCReason::MemberOfObjCMembersClass:
77+
case ObjCReason::ElementOfObjCEnum:
7678
case ObjCReason::Accessor:
7779
llvm_unreachable("should not diagnose this @objc reason");
7880
}
@@ -1272,6 +1274,14 @@ bool IsObjCRequest::evaluate(Evaluator &evaluator, ValueDecl *VD) const {
12721274
// as an arithmetic type in C.
12731275
if (isEnumObjC(enumDecl))
12741276
isObjC = ObjCReason(ObjCReason::ExplicitlyObjC);
1277+
} else if (auto enumElement = dyn_cast<EnumElementDecl>(VD)) {
1278+
// Enum elements can be @objc so long as the containing enum is @objc.
1279+
if (enumElement->getParentEnum()->isObjC()) {
1280+
if (enumElement->getAttrs().hasAttribute<ObjCAttr>())
1281+
isObjC = ObjCReason::ExplicitlyObjC;
1282+
else
1283+
isObjC = ObjCReason::ElementOfObjCEnum;
1284+
}
12751285
} else if (auto proto = dyn_cast<ProtocolDecl>(VD)) {
12761286
if (proto->getAttrs().hasAttribute<ObjCAttr>()) {
12771287
isObjC = ObjCReason(ObjCReason::ExplicitlyObjC);
@@ -1520,7 +1530,7 @@ void markAsObjC(ValueDecl *D, ObjCReason reason,
15201530
ctx.getLazyResolver()->resolveDeclSignature(D);
15211531
}
15221532

1523-
if (!isa<AccessorDecl>(D)) {
1533+
if (!isa<TypeDecl>(D) && !isa<AccessorDecl>(D) && !isa<EnumElementDecl>(D)) {
15241534
useObjectiveCBridgeableConformances(D->getInnermostDeclContext(),
15251535
D->getInterfaceType());
15261536
}

lib/Sema/TypeCheckObjC.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,15 @@ class ObjCReason {
6565
ExplicitlyGKInspectable,
6666
/// Is it a member of an @objc extension of a class.
6767
MemberOfObjCExtension,
68+
69+
// These kinds do not appear in diagnostics.
70+
6871
/// Is it a member of an @objcMembers class.
6972
MemberOfObjCMembersClass,
7073
/// A member of an Objective-C-defined class or subclass.
7174
MemberOfObjCSubclass,
75+
/// Is a member of an @objc enum.
76+
ElementOfObjCEnum,
7277
/// An accessor to a property.
7378
Accessor,
7479
};

test/PrintAsObjC/enums.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
// RUN: %empty-directory(%t)
2+
23
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-source-import -emit-module -emit-module-doc -o %t %s -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
34
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -parse-as-library %t/enums.swiftmodule -typecheck -emit-objc-header-path %t/enums.h -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
45
// RUN: %FileCheck %s < %t/enums.h
56
// RUN: %FileCheck -check-prefix=NEGATIVE %s < %t/enums.h
67
// RUN: %check-in-clang %t/enums.h
78
// RUN: %check-in-clang -fno-modules -Qunused-arguments %t/enums.h -include ctypes.h -include CoreFoundation.h
89

10+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-source-import -emit-module -o /dev/null -emit-module-doc-path /dev/null -module-name enums %s -emit-objc-header-path %t/enums.WMO.h -import-objc-header %S/Inputs/enums.h -disable-objc-attr-requires-foundation-module
11+
// RUN: %FileCheck %s < %t/enums.WMO.h
12+
// RUN: %FileCheck -check-prefix=NEGATIVE %s < %t/enums.WMO.h
13+
// RUN: %check-in-clang %t/enums.WMO.h
14+
// RUN: %check-in-clang -fno-modules -Qunused-arguments %t/enums.WMO.h -include ctypes.h -include CoreFoundation.h
15+
916
// REQUIRES: objc_interop
1017

1118
import Foundation

test/attr/attr_nonobjc.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,7 @@ protocol SR4226_Protocol : class {}
111111
extension SR4226_Protocol {
112112
@nonobjc func function() {} // expected-error {{only class members and extensions of classes can be declared @nonobjc}}
113113
}
114+
115+
@objc enum SomeEnum: Int {
116+
@nonobjc case what // expected-error {{'@nonobjc' attribute cannot be applied to this declaration}}
117+
}

0 commit comments

Comments
 (0)