File tree Expand file tree Collapse file tree 3 files changed +20
-4
lines changed Expand file tree Collapse file tree 3 files changed +20
-4
lines changed Original file line number Diff line number Diff line change @@ -8794,10 +8794,22 @@ void ClangImporter::Implementation::importAttributes(
8794
8794
if (method->isDirectMethod () && !AnyUnavailable) {
8795
8795
assert (isa<AbstractFunctionDecl>(MappedDecl) &&
8796
8796
" objc_direct declarations are expected to be an AbstractFunctionDecl" );
8797
- MappedDecl->getAttrs ().add (new (C) FinalAttr (/* IsImplicit=*/ true ));
8798
- if (auto accessorDecl = dyn_cast<AccessorDecl>(MappedDecl)) {
8799
- auto attr = new (C) FinalAttr (/* isImplicit=*/ true );
8800
- accessorDecl->getStorage ()->getAttrs ().add (attr);
8797
+ if (isa<ConstructorDecl>(MappedDecl)) {
8798
+ // TODO: Teach Swift how to directly call these functions.
8799
+ auto attr = AvailableAttr::createPlatformAgnostic (
8800
+ C,
8801
+ " Swift cannot call Objective-C initializers marked with "
8802
+ " 'objc_direct'" ,
8803
+ /* Rename*/ " " ,
8804
+ PlatformAgnosticAvailabilityKind::UnavailableInSwift);
8805
+ MappedDecl->getAttrs ().add (attr);
8806
+ AnyUnavailable = true ;
8807
+ } else {
8808
+ MappedDecl->getAttrs ().add (new (C) FinalAttr (/* IsImplicit=*/ true ));
8809
+ if (auto accessorDecl = dyn_cast<AccessorDecl>(MappedDecl)) {
8810
+ auto attr = new (C) FinalAttr (/* isImplicit=*/ true );
8811
+ accessorDecl->getStorage ()->getAttrs ().add (attr);
8812
+ }
8801
8813
}
8802
8814
}
8803
8815
}
Original file line number Diff line number Diff line change 2
2
3
3
// REQUIRES: objc_interop
4
4
5
+ let _ = Bar ( value: 4 ) // expected-error {{'init(value:)' is unavailable in Swift}}
6
+ let _ = Bar . init ( value: 5 ) // expected-error {{'init(value:)' is unavailable in Swift}}
5
7
var something = Bar ( ) as AnyObject
6
8
7
9
something. directProperty = 123 // expected-error {{value of type 'AnyObject' has no member 'directProperty'}}
Original file line number Diff line number Diff line change 1
1
#import < Foundation/Foundation.h>
2
2
3
3
@interface Bar : NSObject
4
+ + (instancetype )barWithValue : (int )value __attribute__((objc_direct));
5
+ - (instancetype )initWithValue : (int )value __attribute__((objc_direct));
4
6
@property(direct) int directProperty;
5
7
- (int )objectAtIndexedSubscript : (int )i __attribute__((objc_direct));
6
8
- (void )setObject : (int )obj atIndexedSubscript : (int )i __attribute__((objc_direct));
You can’t perform that action at this time.
0 commit comments