Files
swift-mirror/test/PrintAsObjC/circularity-errors.swift
Becca Royal-Gordon da07ff577c [PrintAsClang] Warn about unstable decl order
PrintAsClang is supposed to emit declarations in the same order regardless of the compiler’s internal state, but we have repeatedly found that our current criteria are inadequate, resulting in non-functionality-affecting changes to generated header content. Add a diagnostic that’s emitted when this happens soliciting a bug report.

Since there *should* be no cases where the compiler fails to order declarations, this diagnostic is never actually emitted. Instead, we test this change by enabling `-verify` on nearly all PrintAsClang tests to make sure they are unaffected.

This did demonstrate a missing criterion that only mattered in C++ mode: extensions that varied only in their generic signature were not sorted stably. Add a sort criterion for this.
2025-02-14 21:41:36 -08:00

74 lines
2.6 KiB
Swift

// Please keep this file in alphabetical order!
// REQUIRES: objc_interop
// 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
// FIXME: END -enable-source-import hackaround
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -import-objc-header %S/Inputs/circularity.h -emit-module -o %t %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/../Inputs/clang-importer-sdk -I %t) -import-objc-header %S/Inputs/circularity.h -parse-as-library %t/circularity-errors.swiftmodule -typecheck -verify -emit-objc-header-path %t/circularity-errors.h
// RUN: %FileCheck %s < %t/circularity-errors.h
// RUN: not %check-in-clang %t/circularity-errors.h
import Foundation
// CHECK: @protocol A2;
// CHECK-LABEL: @protocol A1 <Proto>
@objc protocol A1: Proto {
// CHECK: - (void)test:
func test(_: NeedsProto<A2>)
} // CHECK: @end
// CHECK-LABEL: @protocol A2 <Proto>
@objc protocol A2: Proto {
// CHECK: - (void)test:
func test(_: NeedsProto<A1>)
} // CHECK: @end
// CHECK: @class B2;
// CHECK-LABEL: @protocol B1 <Proto>
@objc protocol B1: Proto {
// CHECK: - (void)test:
@objc optional func test(_: NeedsProto<B2>)
} // CHECK: @end
// CHECK-LABEL: @interface B2 : ProtoImpl <B1>
class B2: ProtoImpl, B1 {
} // CHECK: @end
// CHECK: @class C1;
// Moved below.
class C1: ProtoImpl, C2 {}
// CHECK-LABEL: @protocol C2 <Proto>
@objc protocol C2: Proto {
// CHECK: - (void)test:
@objc optional func test(_: NeedsProto<C1>)
} // CHECK: @end
// CHECK-LABEL: @interface C1 : ProtoImpl <C2>
// CHECK: @end
// CHECK: @protocol D2;
// CHECK-LABEL: @protocol D1 <Proto>
@objc protocol D1: Proto {
// CHECK: - (void)test:
func test(_: NeedsProto<D2>)
} // CHECK: @end
// CHECK-LABEL: @protocol D2 <D1>
@objc protocol D2: D1 {
} // CHECK: @end
// CHECK: @protocol E1;
// Moved below.
@objc protocol E1: E2 {}
// CHECK-LABEL: @protocol E2 <Proto>
@objc protocol E2: Proto {
// CHECK: - (void)test:
func test(_: NeedsProto<E1>)
} // CHECK: @end
// CHECK-LABEL: @protocol E1 <E2>
// CHECK: @end