Files
swift-mirror/test/PrintAsObjC/override.swift
Doug Gregor f39fe1a755 [Tests] Put NSObject Equatable/Hashable back in the ObjectiveC module.
Technically, these operations belong in the ObjectiveC module, where NSObject
is defined. Keep them there. However, we need to build the mock ObjectiveC
overlay with `-disable-objc-attr-requires-foundation-module` now.
2018-08-01 09:25:28 -07:00

107 lines
5.0 KiB
Swift

// RUN: %empty-directory(%t)
// FIXME: BEGIN -enable-source-import hackaround
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -emit-module -o %t %S/../Inputs/clang-importer-sdk/swift-modules/ObjectiveC.swift -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -emit-module -o %t %S/../Inputs/clang-importer-sdk/swift-modules/CoreGraphics.swift
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -emit-module -o %t %S/../Inputs/clang-importer-sdk/swift-modules/Foundation.swift
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -emit-module -o %t %S/../Inputs/clang-importer-sdk/swift-modules/AppKit.swift
// FIXME: END -enable-source-import hackaround
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -emit-module -I %S/Inputs/custom-modules -o %t %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -parse-as-library %t/override.swiftmodule -typecheck -emit-objc-header-path %t/override.h
// RUN: %FileCheck %s < %t/override.h
// RUN: %check-in-clang %t/override.h -I %S/Inputs/custom-modules -Wno-super-class-method-mismatch -Wno-overriding-method-mismatch
// RUN: not %check-in-clang %t/override.h -Wno-super-class-method-mismatch -I %S/Inputs/custom-modules 2>&1 | %FileCheck -check-prefix=CLANG %s
// REQUIRES: objc_interop
import OverrideBase
// No errors from Clang until we get to the FixMe class.
// CLANG-NOT: error
// CHECK-LABEL: @interface A_Child : Base
class A_Child : Base {
// CHECK-NEXT: @property (nonatomic, readonly, getter=getProp) NSUInteger prop;
override var prop: Int { return 0 }
// CHECK-NEXT: @property (nonatomic, readonly) NSInteger originalName;
override var renamedProp: Int { return 0 }
// CHECK-NEXT: - (id _Nullable)objectAtIndexedSubscript:(NSUInteger)x SWIFT_WARN_UNUSED_RESULT;
override subscript(x: Int) -> Any? { return nil }
// CHECK-NEXT: - (NSUInteger)foo SWIFT_WARN_UNUSED_RESULT;
override func foo() -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)_ SWIFT_WARN_UNUSED_RESULT;
override func foo(_: Int) -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)x y:(NSUInteger)y SWIFT_WARN_UNUSED_RESULT;
override func foo(_ x: Int, y: Int) -> Int { return x + y }
// CHECK-NEXT: - (BOOL)doThingAndReturnError:(NSError * _Nullable * _Nullable)error;
override func doThing() throws {}
// CHECK-NEXT: - (BOOL)doAnotherThingWithError:(NSError * _Nullable * _Nullable)error;
override func doAnotherThing() throws {}
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
} // CHECK-NEXT: @end
// CHECK-LABEL: @interface A_Grandchild : A_Child
class A_Grandchild : A_Child {
// CHECK-NEXT: @property (nonatomic, readonly, getter=getProp) NSUInteger prop;
override var prop: Int { return 0 }
// CHECK-NEXT: - (id _Nullable)objectAtIndexedSubscript:(NSUInteger)x SWIFT_WARN_UNUSED_RESULT;
override subscript(x: Int) -> Any? { return nil }
// CHECK-NEXT: - (NSUInteger)foo SWIFT_WARN_UNUSED_RESULT;
override func foo() -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)_ SWIFT_WARN_UNUSED_RESULT;
override func foo(_: Int) -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)x y:(NSUInteger)y SWIFT_WARN_UNUSED_RESULT;
override func foo(_ x: Int, y: Int) -> Int { return x + y }
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
} // CHECK-NEXT: @end
// CHECK-LABEL: @interface B_EmptyChild : Base
class B_EmptyChild : Base {
} // CHECK: @end
// CHECK-LABEL: @interface B_GrandchildViaEmpty : B_EmptyChild
class B_GrandchildViaEmpty : B_EmptyChild {
// CHECK-NEXT: @property (nonatomic, getter=getProp) NSUInteger prop;
override var prop: Int {
get { return 0 }
set {}
}
// CHECK-NEXT: - (id _Nullable)objectAtIndexedSubscript:(NSUInteger)x SWIFT_WARN_UNUSED_RESULT;
// CHECK-NEXT: - (void)setObject:(id _Nullable)newValue atIndexedSubscript:(NSUInteger)x;
override subscript(x: Int) -> Any? {
get { return nil }
set {}
}
// CHECK-NEXT: - (NSUInteger)foo SWIFT_WARN_UNUSED_RESULT;
override func foo() -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)_ SWIFT_WARN_UNUSED_RESULT;
override func foo(_: Int) -> Int { return 0 }
// CHECK-NEXT: - (NSUInteger)foo:(NSUInteger)x y:(NSUInteger)y SWIFT_WARN_UNUSED_RESULT;
override func foo(_ x: Int, y: Int) -> Int { return x + y }
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
} // CHECK-NEXT: @end
// The output in this class doesn't yet preserve NSUInteger correctly.
// CHECK-LABEL: @interface FixMe : Base
class FixMe : Base {
// CHECK-NEXT: - (void)callback:(NSInteger (^ _Nullable)(void))fn;
// CLANG: error: conflicting parameter types in declaration of 'callback:'
override func callback(_ fn: (() -> Int)?) {}
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
} // CHECK-NEXT: @end
// No more errors from Clang.
// CLANG-NOT: error: