Author: Saleem Abdulrasool Date: 2020-09-15T20:15:34Z New Revision: 7d26d6a1b062f7ce820b02b39d102d5f8f15fa5f
URL: https://github.com/llvm/llvm-project/commit/7d26d6a1b062f7ce820b02b39d102d5f8f15fa5f DIFF: https://github.com/llvm/llvm-project/commit/7d26d6a1b062f7ce820b02b39d102d5f8f15fa5f.diff LOG: Sema: add support for `__attribute__((__swift_bridged_typedef__))` Extend the semantic attributes that clang processes for Swift to include `swift_bridged_typedef`. This attribute enables typedefs to be bridged into Swift with a bridged name. This is based on the work of the original changes in https://github.com/llvm/llvm-project-staging/commit/8afaf3aad2af43cfedca7a24cd817848c4e95c0c Differential Revision: https://reviews.llvm.org/D87396 Reviewed By: Aaron Ballman Added: clang/test/AST/attr-swift_bridged_typedef.m clang/test/AST/attr-swift_bridged_typedef.mm clang/test/SemaObjC/attr-swift_bridged_typedef.m Modified: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/lib/Sema/SemaDeclAttr.cpp clang/test/Misc/pragma-attribute-supported-attributes-list.test Removed: ################################################################################ diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 3221cf23c4b5..6df348618260 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -2130,6 +2130,12 @@ def Regparm : TypeAttr { let ASTNode = 0; } +def SwiftBridgedTypedef : InheritableAttr { + let Spellings = [GNU<"swift_bridged_typedef">]; + let Subjects = SubjectList<[TypedefName], ErrorDiag>; + let Documentation = [SwiftBridgedTypedefDocs]; +} + def SwiftObjCMembers : Attr { let Spellings = [GNU<"swift_objc_members">]; let Subjects = SubjectList<[ObjCInterface], ErrorDiag>; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 939f52dae3d5..7aff443e9a12 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -3476,6 +3476,27 @@ Swift. }]; } +def SwiftBridgedTypedefDocs : Documentation { + let Category = SwiftDocs; + let Heading = "swift_bridged"; + let Content = [{ +The ``swift_bridged_typedef`` attribute indicates that when the typedef to which +the attribute appertains is imported into Swift, it should refer to the bridged +Swift type (e.g. Swift's ``String``) rather than the Objective-C type as written +(e.g. ``NSString``). + + .. code-block:: c + + @interface NSString; + typedef NSString *AliasedString __attribute__((__swift_bridged_typedef__)); + + extern void acceptsAliasedString(AliasedString _Nonnull parameter); + +In this case, the function ``acceptsAliasedString`` will be imported into Swift +as a function which accepts a ``String`` type parameter. + }]; +} + def SwiftObjCMembersDocs : Documentation { let Category = SwiftDocs; let Heading = "swift_objc_members"; diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index bf9d8497f5a2..02ffd752233d 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -7533,6 +7533,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, break; // Swift attributes. + case ParsedAttr::AT_SwiftBridgedTypedef: + handleSimpleAttribute<SwiftBridgedTypedefAttr>(S, D, AL); + break; case ParsedAttr::AT_SwiftError: handleSwiftError(S, D, AL); break; diff --git a/clang/test/AST/attr-swift_bridged_typedef.m b/clang/test/AST/attr-swift_bridged_typedef.m new file mode 100644 index 000000000000..8c7c0987569e --- /dev/null +++ b/clang/test/AST/attr-swift_bridged_typedef.m @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -ast-dump %s | FileCheck %s + +typedef struct T TBridged __attribute((__swift_bridged_typedef__)); +// CHECK: TypedefDecl {{.*}} TBridged 'struct T' +// CHECK: SwiftBridgedTypedefAttr + +typedef struct T TBridged; +// CHECK: TypedefDecl {{.*}} TBridged 'struct T' +// CHECK: SwiftBridgedTypedefAttr diff --git a/clang/test/AST/attr-swift_bridged_typedef.mm b/clang/test/AST/attr-swift_bridged_typedef.mm new file mode 100644 index 000000000000..44fd022d5ea7 --- /dev/null +++ b/clang/test/AST/attr-swift_bridged_typedef.mm @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -fsyntax-only %s -ast-dump | FileCheck %s + +@interface NSString +@end + +using NSStringAlias __attribute__((__swift_bridged_typedef__)) = NSString *; +// CHECK: TypeAliasDecl {{.*}} NSStringAlias 'NSString *' +// CHECK: SwiftBridgedTypedefAttr diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index dcf7cd2b7f1a..024081b02e3e 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -146,6 +146,7 @@ // CHECK-NEXT: Section (SubjectMatchRule_function, SubjectMatchRule_variable_is_global, SubjectMatchRule_objc_method, SubjectMatchRule_objc_property) // CHECK-NEXT: SetTypestate (SubjectMatchRule_function_is_member) // CHECK-NEXT: SpeculativeLoadHardening (SubjectMatchRule_function, SubjectMatchRule_objc_method) +// CHECK-NEXT: SwiftBridgedTypedef (SubjectMatchRule_type_alias) // CHECK-NEXT: SwiftContext (SubjectMatchRule_variable_is_parameter) // CHECK-NEXT: SwiftError (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: SwiftErrorResult (SubjectMatchRule_variable_is_parameter) diff --git a/clang/test/SemaObjC/attr-swift_bridged_typedef.m b/clang/test/SemaObjC/attr-swift_bridged_typedef.m new file mode 100644 index 000000000000..2836b886a903 --- /dev/null +++ b/clang/test/SemaObjC/attr-swift_bridged_typedef.m @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -verify -fsyntax-only %s + +@interface NSString +@end + +typedef NSString *NSStringAlias __attribute__((__swift_bridged_typedef__)); + +typedef int IntAlias __attribute__((__swift_bridged_typedef__)); + +struct __attribute__((swift_bridged_typedef)) S {}; +// expected-error@-1 {{'swift_bridged_typedef' attribute only applies to typedefs}} + +typedef unsigned char UnsignedChar __attribute__((__swift_bridged_typedef__("UnsignedChar"))); +// expected-error@-1 {{'__swift_bridged_typedef__' attribute takes no arguments}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits