compnerd updated this revision to Diff 294140. compnerd added a comment. add more tests to cover the confusing case of attribute merge handling
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D87720/new/ https://reviews.llvm.org/D87720 Files: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclAttr.cpp clang/test/AST/attr-swift_private.m clang/test/SemaObjC/attr-swift_private.m
Index: clang/test/SemaObjC/attr-swift_private.m =================================================================== --- /dev/null +++ clang/test/SemaObjC/attr-swift_private.m @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -verify -fsyntax-only -fobjc-arc %s + +__attribute__((__swift_private__)) +@protocol P +@end + +__attribute__((__swift_private__)) +@interface I +@end + +@interface J +@property id property __attribute__((__swift_private__)); +- (void)instanceMethod __attribute__((__swift_private__)); ++ (void)classMethod __attribute__((__swift_private__)); +@end + +void f(void) __attribute__((__swift_private__)); + +struct __attribute__((__swift_private__)) S {}; + +enum __attribute__((__swift_private__)) E { + one, + two, +}; + +typedef struct { } T __attribute__((__swift_private__)); + +void g(void) __attribute__((__swift_private__("private"))); +// expected-error@-1 {{'__swift_private__' attribute takes no arguments}} Index: clang/test/AST/attr-swift_private.m =================================================================== --- /dev/null +++ clang/test/AST/attr-swift_private.m @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -ast-dump %s | FileCheck %s + +@interface I +- (void)method __attribute__((__swift_private__)); +@end + +// CHECK: ObjCInterfaceDecl {{.*}} I +// CHECK: ObjCMethodDecl {{.*}} method 'void' +// CHECK: SwiftPrivateAttr + +@interface J : I +- (void)method; +@end + +// CHECK: ObjCInterfaceDecl {{.*}} J +// CHECK: ObjCMethodDecl {{.*}} method 'void' +// CHECK: SwiftPrivateAttr {{.*}} Inherited Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -7904,6 +7904,9 @@ case ParsedAttr::AT_SwiftObjCMembers: handleSimpleAttribute<SwiftObjCMembersAttr>(S, D, AL); break; + case ParsedAttr::AT_SwiftPrivate: + handleSimpleAttribute<SwiftPrivateAttr>(S, D, AL); + break; // XRay attributes. case ParsedAttr::AT_XRayLogArgs: Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -2595,6 +2595,8 @@ else if (const auto *SNA = dyn_cast<SwiftNameAttr>(Attr)) NewAttr = S.mergeSwiftNameAttr(D, *SNA, SNA->getName(), AMK == Sema::AMK_Override); + else if (isa<SwiftPrivateAttr>(Attr) && AMK == Sema::AMK_Override) + NewAttr = nullptr; else if (const auto *OA = dyn_cast<OptimizeNoneAttr>(Attr)) NewAttr = S.mergeOptimizeNoneAttr(D, *OA); else if (const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(Attr)) Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -3653,6 +3653,19 @@ }]; } +def SwiftPrivateDocs : Documentation { + let Category = SwiftDocs; + let Heading = "swift_private"; + let Content = [{ +Declarations marked with the ``swift_private`` attribute are hidden from the +framework client but are still made available for use within the framework or +Swift SDK overlay. + +The purpose of this attribute is to permit a more idomatic implementation of +declarations in Swift while hiding the non-idiomatic one. + }]; +} + def OMPDeclareSimdDocs : Documentation { let Category = DocCatFunction; let Heading = "#pragma omp declare simd"; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -2177,6 +2177,11 @@ let HasCustomParsing = 1; } +def SwiftPrivate : InheritableAttr { + let Spellings = [GNU<"swift_private">]; + let Documentation = [SwiftPrivateDocs]; +} + def NoDeref : TypeAttr { let Spellings = [Clang<"noderef">]; let Documentation = [NoDerefDocs];
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits