diff --git a/lib/Sema/TypeCheckDeclObjC.cpp b/lib/Sema/TypeCheckDeclObjC.cpp index 230c2765080c..a6316accce16 100644 --- a/lib/Sema/TypeCheckDeclObjC.cpp +++ b/lib/Sema/TypeCheckDeclObjC.cpp @@ -2387,6 +2387,7 @@ bool swift::diagnoseObjCUnsatisfiedOptReqConflicts(SourceFile &sf) { break; } } + assert(req != bestConflict && "requirement conflicts with itself?"); // Diagnose the conflict. auto reqDiagInfo = getObjCMethodDiagInfo(unsatisfied.second); diff --git a/lib/Sema/TypeChecker.cpp b/lib/Sema/TypeChecker.cpp index 9d6f9b02d675..d8806c5b8e4e 100644 --- a/lib/Sema/TypeChecker.cpp +++ b/lib/Sema/TypeChecker.cpp @@ -344,9 +344,19 @@ void swift::performWholeModuleTypeChecking(SourceFile &SF) { auto &Ctx = SF.getASTContext(); FrontendStatsTracer tracer(Ctx.Stats, "perform-whole-module-type-checking"); - diagnoseObjCMethodConflicts(SF); - diagnoseObjCUnsatisfiedOptReqConflicts(SF); - diagnoseUnintendedObjCMethodOverrides(SF); + switch (SF.Kind) { + case SourceFileKind::Library: + case SourceFileKind::Main: + diagnoseObjCMethodConflicts(SF); + diagnoseObjCUnsatisfiedOptReqConflicts(SF); + diagnoseUnintendedObjCMethodOverrides(SF); + return; + case SourceFileKind::SIL: + case SourceFileKind::Interface: + // SIL modules and .swiftinterface files don't benefit from whole-module + // ObjC checking - skip it. + return; + } } bool swift::isAdditiveArithmeticConformanceDerivationEnabled(SourceFile &SF) { diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/CoreFeatures b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/CoreFeatures new file mode 120000 index 000000000000..085f649ae945 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/CoreFeatures @@ -0,0 +1 @@ +Versions/Current/CoreFeatures \ No newline at end of file diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Headers b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Headers new file mode 120000 index 000000000000..a177d2a6b926 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Modules b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Modules new file mode 120000 index 000000000000..5736f3186e79 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/CoreFeatures b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/CoreFeatures new file mode 100755 index 000000000000..c41701129128 Binary files /dev/null and b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/CoreFeatures differ diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures-Swift.h b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures-Swift.h new file mode 100644 index 000000000000..9c19c04a68a5 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures-Swift.h @@ -0,0 +1,442 @@ +#if 0 +#elif defined(__arm64__) && __arm64__ +// Generated by Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +#ifndef COREFEATURES_SWIFT_H +#define COREFEATURES_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +#else +# define SWIFT_RELEASES_ARGUMENT +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#if __has_feature(modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#import + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="CoreFeatures",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + + +@interface RootObject (SWIFT_EXTENSION(CoreFeatures)) +@end + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop +#endif + +#elif defined(__x86_64__) && __x86_64__ +// Generated by Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +#ifndef COREFEATURES_SWIFT_H +#define COREFEATURES_SWIFT_H +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(ns_consumed) +# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed)) +#else +# define SWIFT_RELEASES_ARGUMENT +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif +#if !defined(SWIFT_RESILIENT_CLASS) +# if __has_attribute(objc_class_stub) +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub)) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME) +# else +# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) +# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME) +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_WEAK_IMPORT) +# define SWIFT_WEAK_IMPORT __attribute__((weak_import)) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if !defined(IBSegueAction) +# define IBSegueAction +#endif +#if __has_feature(modules) +#if __has_warning("-Watimport-in-framework-header") +#pragma clang diagnostic ignored "-Watimport-in-framework-header" +#endif +#endif + +#import + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="CoreFeatures",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + + +@interface RootObject (SWIFT_EXTENSION(CoreFeatures)) +@end + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop +#endif + +#endif diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures.h b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures.h new file mode 100644 index 000000000000..e160d0014e86 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/CoreFeatures.h @@ -0,0 +1 @@ +#import diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/RootObject.h b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/RootObject.h new file mode 100644 index 000000000000..46b978afdfed --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Headers/RootObject.h @@ -0,0 +1,14 @@ +__attribute__((objc_root_class)) +@interface RootObject +- (instancetype) init; +@end + +@protocol RootProtocol +@optional +- (void) rootObject:(RootObject *)root willChangeValue:(void *)value; +- (void) rootObject:(RootObject *)root didChangeValue:(void *)value; +@end + +@protocol ReactiveRootProtocol +@end + diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftdoc b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftdoc new file mode 100644 index 000000000000..b811c5d392a1 Binary files /dev/null and b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftdoc differ diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftinterface b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftinterface new file mode 100644 index 000000000000..3a003f37a708 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64-apple-macos.swiftinterface @@ -0,0 +1,8 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name CoreFeatures +@_exported import CoreFeatures +import Foundation +import Swift +extension RootObject : CoreFeatures.ReactiveRootProtocol { +} diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftdoc b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftdoc new file mode 100644 index 000000000000..b811c5d392a1 Binary files /dev/null and b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftdoc differ diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftinterface b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftinterface new file mode 100644 index 000000000000..3a003f37a708 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/arm64.swiftinterface @@ -0,0 +1,8 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +// swift-module-flags: -target arm64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name CoreFeatures +@_exported import CoreFeatures +import Foundation +import Swift +extension RootObject : CoreFeatures.ReactiveRootProtocol { +} diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftdoc b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftdoc new file mode 100644 index 000000000000..b7497fe39ff7 Binary files /dev/null and b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftdoc differ diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftinterface b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftinterface new file mode 100644 index 000000000000..827d360b9df2 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64-apple-macos.swiftinterface @@ -0,0 +1,8 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name CoreFeatures +@_exported import CoreFeatures +import Foundation +import Swift +extension RootObject : CoreFeatures.ReactiveRootProtocol { +} diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftdoc b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftdoc new file mode 100644 index 000000000000..b7497fe39ff7 Binary files /dev/null and b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftdoc differ diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftinterface b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftinterface new file mode 100644 index 000000000000..827d360b9df2 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/CoreFeatures.swiftmodule/x86_64.swiftinterface @@ -0,0 +1,8 @@ +// swift-interface-format-version: 1.0 +// swift-compiler-version: Apple Swift version 5.3 (swiftlang-1200.0.29.2 clang-1200.0.30.1) +// swift-module-flags: -target x86_64-apple-macos11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name CoreFeatures +@_exported import CoreFeatures +import Foundation +import Swift +extension RootObject : CoreFeatures.ReactiveRootProtocol { +} diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/module.modulemap b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 000000000000..f7cd21a55f09 --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,11 @@ +framework module CoreFeatures { + umbrella header "CoreFeatures.h" + + export * + module * { export * } +} + +module CoreFeatures.Swift { + header "CoreFeatures-Swift.h" + requires objc +} diff --git a/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/Current b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/Current new file mode 120000 index 000000000000..8c7e5a667f1b --- /dev/null +++ b/test/ClangImporter/Inputs/requirement-conflict/CoreFeatures.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/test/ClangImporter/requirement-conflict.swift b/test/ClangImporter/requirement-conflict.swift new file mode 100644 index 000000000000..39e9a52e6db1 --- /dev/null +++ b/test/ClangImporter/requirement-conflict.swift @@ -0,0 +1,28 @@ +// RUN: %empty-directory(%t) +// RUN: mkdir -p %t/clang-module-cache +// RUN: %target-swift-frontend -typecheck -F %S/Inputs/requirement-conflict -module-cache-path %t/clang-module-cache %s + +// REQUIRES: objc_interop +// N.B. technically only need objc_interop here, but CoreFeatures would have to +// be cross-compiled for more architectures. It's sufficient to verify this +// works for macOS alone since we only care that we don't emit errors. +// REQUIRES: OS=macosx + +import CoreFeatures + +// The RootObject class in CoreFeatures is intentionally quite strange. +// Formally, RootObject declares a conformance to an Objective-C protocol called +// 'ReactiveRootProtocol', but in Swift instead of ObjC. When we go to import +// the ObjC side of the framework, we notice this and mirror-in the requirements +// from its ancestor 'RootProtocol'. With that accomplished, we now have an ObjC +// class imported through Swift with ObjC members mirrored on top. This combo +// used to be toxic - we would see the very members we synthesized during the +// shadowing pass and would diagnose them as directly conflicting with the +// protocol conformance we had declared in Swift. That is - we would say +// a requirement conflicted directly... with itself! +// +// Nowadays we just exempt interface files from this kind of checking, which is +// the same behavior one would get if they had set up this very scenario with +// a plain swiftmodule file. +let root = CoreFeatures.RootObject() +print(root)