Sema: add support for `__attribute__((__swift_private__))`

This attribute allows declarations to be restricted to the framework
itself, enabling Swift to remove the declarations when importing
libraries.  This is useful in the case that the functions can be
implemented in a more natural way for Swift.

This is based on the work of the original changes in
8afaf3aad2

Differential Revision: https://reviews.llvm.org/D87720
Reviewed By: Aaron Ballman
This commit is contained in:
Saleem Abdulrasool 2020-09-14 23:45:07 +00:00
parent 152ff3772c
commit 58cdbf518b
5 changed files with 76 additions and 0 deletions

View File

@ -2177,6 +2177,11 @@ def SwiftNewType : InheritableAttr {
let HasCustomParsing = 1;
}
def SwiftPrivate : InheritableAttr {
let Spellings = [GNU<"swift_private">];
let Documentation = [SwiftPrivateDocs];
}
def NoDeref : TypeAttr {
let Spellings = [Clang<"noderef">];
let Documentation = [NoDerefDocs];

View File

@ -3713,6 +3713,19 @@ ypedef.
}];
}
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";

View File

@ -7899,6 +7899,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
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:

View File

@ -0,0 +1,26 @@
// 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
void f(void) __attribute__((__swift_private__));
// CHECK: FunctionDecl {{.*}} f 'void (void)'
// CHECK: SwiftPrivateAttr
void f(void) {
}
// CHECK: FunctionDecl {{.*}} f 'void (void)'
// CHECK: SwiftPrivateAttr {{.*}} Inherited

View File

@ -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}}