Skip to content

Commit 74ea47a

Browse files
authored
Merge pull request #84489 from xymus/c-identifier-only
Parser: Reject `@c` attributes using the string format
2 parents 228e2f7 + 7ec1d36 commit 74ea47a

12 files changed

+84
-87
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3032,14 +3032,7 @@ ParserStatus Parser::parseNewDeclAttribute(DeclAttributes &Attributes,
30323032
}
30333033

30343034
case DeclAttrKind::CDecl: {
3035-
if (!AttrName.starts_with("_") &&
3036-
3037-
// Backwards support for @c("stringId"). Remove before enabling in
3038-
// production so we accept only the identifier format.
3039-
lookahead(1, [&](CancellableBacktrackingScope &) {
3040-
return Tok.isNot(tok::string_literal);
3041-
})) {
3042-
3035+
if (AttrName == "c") {
30433036
std::optional<StringRef> CName;
30443037
if (consumeIfAttributeLParen()) {
30453038
// Custom C name.

test/PrintAsObjC/cdecl-enum-reference.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@
2525
// REQUIRES: swift_feature_CDecl
2626

2727
//--- CoreLib.swift
28-
@c("CEnum")
28+
@c(CEnum)
2929
public enum CEnum: CInt { case A, B }
3030

3131
//--- MiddleLib.swift
3232
import CoreLib
3333

34-
@c("CFunc")
34+
@c(CFunc)
3535
public func CFunc(e: CEnum) {}
3636
// CHECK: typedef SWIFT_ENUM_FWD_DECL(int, CEnum)
3737
// CHECK: SWIFT_EXTERN void CFunc(SWIFT_ENUM_TAG CEnum e) SWIFT_NOEXCEPT;

test/PrintAsObjC/cdecl-enums.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ import Foundation
5757
// CHECK-NEXT: }
5858

5959
/// Foo: A feer, a female feer.
60-
@c("FooComments") public enum FooComments: CInt {
60+
@c(FooComments) public enum FooComments: CInt {
6161
/// Zim: A zeer, a female zeer.
6262
case Zim
6363
case Zang, Zung
@@ -67,7 +67,7 @@ import Foundation
6767
// CHECK-NEXT: Zang = -219,
6868
// CHECK-NEXT: Zung = -218,
6969
// CHECK-NEXT: };
70-
@c("NegativeValues") enum NegativeValues: Int16 {
70+
@c(NegativeValues) enum NegativeValues: Int16 {
7171
case Zang = -219, Zung
7272

7373
func methodNotExportedToC() {}
@@ -77,40 +77,40 @@ import Foundation
7777
// CHECK-NEXT: SomeErrorBadness = 9001,
7878
// CHECK-NEXT: SomeErrorWorseness = 9002,
7979
// CHECK-NEXT: };
80-
@c("SomeError") enum SomeError: Int, Error {
80+
@c(SomeError) enum SomeError: Int, Error {
8181
case Badness = 9001
8282
case Worseness
8383
}
8484

8585
// CHECK-LABEL: typedef SWIFT_ENUM_NAMED(ptrdiff_t, SomeOtherError, "SomeOtherError", closed) {
8686
// CHECK-NEXT: SomeOtherErrorDomain = 0,
8787
// CHECK-NEXT: };
88-
@c("SomeOtherError") enum SomeOtherError: Int, Error {
88+
@c(SomeOtherError) enum SomeOtherError: Int, Error {
8989
case Domain
9090
}
9191

9292
// CHECK-LABEL: typedef SWIFT_ENUM_NAMED(ptrdiff_t, ObjcErrorType, "SomeRenamedErrorType", closed) {
9393
// CHECK-NEXT: ObjcErrorTypeBadStuff = 0,
9494
// CHECK-NEXT: };
95-
@c("ObjcErrorType") enum SomeRenamedErrorType: Int, Error {
95+
@c(ObjcErrorType) enum SomeRenamedErrorType: Int, Error {
9696
case BadStuff
9797
}
9898

99-
@c("acceptMemberImported") func acceptMemberImported(a: Wrapper.Raw, b: Wrapper.Enum, c: Wrapper.Options, d: Wrapper.Typedef, e: Wrapper.Anon, ee: Wrapper.Anon2) {}
99+
@c(acceptMemberImported) func acceptMemberImported(a: Wrapper.Raw, b: Wrapper.Enum, c: Wrapper.Options, d: Wrapper.Typedef, e: Wrapper.Anon, ee: Wrapper.Anon2) {}
100100
// CHECK-LABEL: SWIFT_EXTERN void acceptMemberImported(enum MemberRaw a, enum MemberEnum b, MemberOptions c, enum MemberTypedef d, MemberAnon e, MemberAnon2 ee) SWIFT_NOEXCEPT;
101101

102-
@c("acceptPlainEnum") func acceptPlainEnum(_: NSMalformedEnumMissingTypedef) {}
102+
@c(acceptPlainEnum) func acceptPlainEnum(_: NSMalformedEnumMissingTypedef) {}
103103
// CHECK-LABEL: SWIFT_EXTERN void acceptPlainEnum(enum NSMalformedEnumMissingTypedef) SWIFT_NOEXCEPT;
104104

105-
@c("acceptTopLevelImported") func acceptTopLevelImported(a: TopLevelRaw, b: TopLevelEnum, c: TopLevelOptions, d: TopLevelTypedef, e: TopLevelAnon) {}
105+
@c(acceptTopLevelImported) func acceptTopLevelImported(a: TopLevelRaw, b: TopLevelEnum, c: TopLevelOptions, d: TopLevelTypedef, e: TopLevelAnon) {}
106106
// CHECK-LABEL: SWIFT_EXTERN void acceptTopLevelImported(enum TopLevelRaw a, TopLevelEnum b, TopLevelOptions c, TopLevelTypedef d, TopLevelAnon e) SWIFT_NOEXCEPT;
107107

108-
@c("takeAndReturnEnumC") func takeAndReturnEnumC(_ foo: FooComments) -> NegativeValues {
108+
@c(takeAndReturnEnumC) func takeAndReturnEnumC(_ foo: FooComments) -> NegativeValues {
109109
return .Zung
110110
}
111111
// CHECK-LABEL: SWIFT_EXTERN SWIFT_ENUM_TAG NegativeValues takeAndReturnEnumC(SWIFT_ENUM_TAG FooComments foo) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
112112

113-
@c("takeAndReturnRenamedEnum") func takeAndReturnRenamedEnum(_ foo: EnumNamed) -> EnumNamed {
113+
@c(takeAndReturnRenamedEnum) func takeAndReturnRenamedEnum(_ foo: EnumNamed) -> EnumNamed {
114114
return .A
115115
}
116116
// CHECK-LABEL: SWIFT_EXTERN SWIFT_ENUM_TAG ObjcEnumNamed takeAndReturnRenamedEnum(SWIFT_ENUM_TAG ObjcEnumNamed foo) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;

test/PrintAsObjC/cdecl-includes-with-objc.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ import Foundation
5353
// CHECK: extern "C" {
5454
// CHECK: #endif
5555

56-
@c("get_int_alias")
56+
@c(get_int_alias)
5757
public func getIntAlias() -> IntFromCFramework { 42 }
5858
// CHECK: SWIFT_EXTERN IntFromCFramework get_int_alias(void) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
5959

60-
@c("imports_cgpoint")
60+
@c(imports_cgpoint)
6161
public func importsCGPoint(pt: CGPoint) { }
6262
// CHECK: SWIFT_EXTERN void imports_cgpoint(CGPoint pt) SWIFT_NOEXCEPT;
6363

test/PrintAsObjC/cdecl-includes.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,16 @@ import CModule
7878
// CHECK: extern "C" {
7979
// CHECK: #endif
8080

81-
@c("mirror_struct")
81+
@c(mirror_struct)
8282
public func a_mirrorStruct(_ a: CStruct) -> CStruct { a }
8383
// CHECK: SWIFT_EXTERN struct CStruct mirror_struct(struct CStruct a) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
8484

85-
@c("mirror_union")
85+
@c(mirror_union)
8686
public func b_mirrorStruct(_ a: CUnion) -> CUnion { a }
8787
// CHECK: SWIFT_EXTERN union CUnion mirror_union(union CUnion a) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
8888

8989

90-
@c("TKGetDefaultToastSetting")
90+
@c(TKGetDefaultToastSetting)
9191
public func c_defaultToastSetting() -> TKTimeSetting { TKTimeSettingNormal } // It would be nice to import TKTimeSettingNormal as a member.
9292
// CHECK: SWIFT_EXTERN TKTimeSetting TKGetDefaultToastSetting(void) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
9393

test/PrintAsObjC/cdecl-official.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,30 @@ func a0_simple(x: Int, bar y: Int) -> Int { return x }
5353
func a1_defaultName(x: Int) -> Int { return x }
5454
// CHECK-LABEL: SWIFT_EXTERN ptrdiff_t a1_defaultName(ptrdiff_t x) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
5555

56-
@c("primitiveTypes")
56+
@c(primitiveTypes)
5757
public func b_primitiveTypes(i: Int, ci: CInt, l: CLong, c: CChar, f: Float, d: Double, b: Bool) {}
5858
// CHECK-LABEL: SWIFT_EXTERN void primitiveTypes(ptrdiff_t i, int ci, long l, char c, float f, double d, bool b) SWIFT_NOEXCEPT;
5959

60-
@c("has_keyword_arg_names")
60+
@c(has_keyword_arg_names)
6161
func c_keywordArgNames(auto: Int, union: Int) {}
6262
// CHECK-LABEL: SWIFT_EXTERN void has_keyword_arg_names(ptrdiff_t auto_, ptrdiff_t union_) SWIFT_NOEXCEPT;
6363

64-
@c("return_never")
64+
@c(return_never)
6565
func d_returnNever() -> Never { fatalError() }
6666
// CHECK-LABEL: SWIFT_EXTERN void return_never(void) SWIFT_NOEXCEPT SWIFT_NORETURN;
6767

6868
/// Pointer types
6969
// CHECK: /// Pointer types
7070

71-
@c("pointers")
71+
@c(pointers)
7272
func f_pointers(_ x: UnsafeMutablePointer<Int>,
7373
y: UnsafePointer<Int>,
7474
z: UnsafeMutableRawPointer,
7575
w: UnsafeRawPointer,
7676
u: OpaquePointer) {}
7777
// CHECK: SWIFT_EXTERN void pointers(ptrdiff_t * _Nonnull x, ptrdiff_t const * _Nonnull y, void * _Nonnull z, void const * _Nonnull w, void * _Nonnull u) SWIFT_NOEXCEPT;
7878

79-
@c("nullable_pointers")
79+
@c(nullable_pointers)
8080
func g_nullablePointers(_ x: UnsafeMutableRawPointer,
8181
y: UnsafeMutableRawPointer?,
8282
z: UnsafeMutableRawPointer!) {}
@@ -87,23 +87,23 @@ func g_nullablePointers(_ x: UnsafeMutableRawPointer,
8787
@c
8888
enum CEnum: CInt { case A, B }
8989

90-
@c("CEnumRenamed_CName")
90+
@c(CEnumRenamed_CName)
9191
enum CEnumRenamed: CLong { case A, B }
9292

93-
@c("use_enum")
93+
@c(use_enum)
9494
func h_useCEnum(e: CEnum) -> CEnum { return e }
9595
// CHECK: SWIFT_EXTERN SWIFT_ENUM_TAG CEnum use_enum(SWIFT_ENUM_TAG CEnum e) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
9696

97-
@c("use_enum_renamed")
97+
@c(use_enum_renamed)
9898
func i_useCEnumLong(e: CEnumRenamed) -> CEnumRenamed { return e }
9999
// CHECK: SWIFT_EXTERN SWIFT_ENUM_TAG CEnumRenamed_CName use_enum_renamed(SWIFT_ENUM_TAG CEnumRenamed_CName e) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
100100

101-
@c("use_enum_late")
101+
@c(use_enum_late)
102102
func j_useCEnumChar(e: zCEnumDefinedLate) -> zCEnumDefinedLate { return e }
103103
// CHECK: SWIFT_EXTERN SWIFT_ENUM_TAG zCEnumDefinedLate use_enum_late(SWIFT_ENUM_TAG zCEnumDefinedLate e) SWIFT_NOEXCEPT SWIFT_WARN_UNUSED_RESULT;
104104

105105
/// Declare this enum late in the source file and in alphabetical order.
106-
@c("zCEnumDefinedLate")
106+
@c(zCEnumDefinedLate)
107107
enum zCEnumDefinedLate: CChar { case A, B }
108108

109109
// CHECK: #if defined(__cplusplus)

test/PrintAsObjC/cdecl-with-objc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
// REQUIRES: swift_feature_CDecl
1919
// REQUIRES: objc_interop
2020

21-
@c("cFunc")
21+
@c(cFunc)
2222
func cFunc() { }
2323
// CHECK: cFunc
2424
// CHECK-NOT: cFunc

0 commit comments

Comments
 (0)