Skip to content

Commit 8e81b59

Browse files
committed
swift-module-digester: diagnose fixed-order property changes to computed property and vice versa as ABI breakage.
1 parent 4b8507c commit 8e81b59

File tree

8 files changed

+26
-1
lines changed

8 files changed

+26
-1
lines changed

include/swift/AST/DiagnosticsModuleDiffer.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ ERROR(decl_reorder,none,"%0 in a non-resilient type changes position from %1 to
5858

5959
ERROR(decl_added,none,"%0 is added to a non-resilient type", (StringRef))
6060

61+
ERROR(decl_has_fixed_order_change,none,"%0 is %select{now|no longer}1 a property with fixed layout order", (StringRef, bool))
62+
6163
ERROR(default_arg_removed,none,"%0 has removed default argument from %1", (StringRef, StringRef))
6264

6365
ERROR(conformance_removed,none,"%0 has removed %select{conformance to|inherited protocol}2 %1", (StringRef, StringRef, bool))

test/api-digester/Inputs/cake1.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ public struct fixedLayoutStruct {
5555
public var a = 1
5656
}
5757

58+
@_fixed_layout
59+
public struct fixedLayoutStruct2 {
60+
public private(set) var NoLongerWithFixedBinaryOrder = 1
61+
public var BecomeFixedBinaryOrder: Int { return 1 }
62+
}
63+
5864
@_frozen
5965
public enum FrozenKind {
6066
case Unchanged

test/api-digester/Inputs/cake2.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ public struct fixedLayoutStruct {
5959
private lazy var lazy_d = 4
6060
}
6161

62+
@_fixed_layout
63+
public struct fixedLayoutStruct2 {
64+
public var NoLongerWithFixedBinaryOrder: Int { return 1 }
65+
public var BecomeFixedBinaryOrder = 1
66+
}
67+
6268
@_frozen
6369
public enum FrozenKind {
6470
case Unchanged

test/api-digester/Outputs/Cake-abi.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ cake1: AssociatedType RequiementChanges.removedType has been removed
1010
cake1: Class C3 has been removed
1111
cake1: Constructor Somestruct2.init(_:) has been removed
1212
cake1: Constructor fixedLayoutStruct.init(b:a:) has been removed
13+
cake1: Constructor fixedLayoutStruct2.init(NoLongerWithFixedBinaryOrder:) has been removed
1314
cake1: Func C4.foo() has been removed
1415
cake1: Func RequiementChanges.removedFunc() has been removed
1516
cake1: Subscript RemoveSetters.subscript(_:) has removed its setter
@@ -53,6 +54,8 @@ cake1: EnumElement FrozenKind.Fixed in a non-resilient type changes position fro
5354
cake1: EnumElement FrozenKind.Rigid in a non-resilient type changes position from 2 to 1
5455
cake1: Var fixedLayoutStruct.a in a non-resilient type changes position from 1 to 0
5556
cake1: Var fixedLayoutStruct.b in a non-resilient type changes position from 0 to 1
57+
cake1: Var fixedLayoutStruct2.BecomeFixedBinaryOrder is now a property with fixed layout order
58+
cake1: Var fixedLayoutStruct2.NoLongerWithFixedBinaryOrder is no longer a property with fixed layout order
5659
cake2: EnumElement FrozenKind.AddedCase is added to a non-resilient type
5760
cake2: Var fixedLayoutStruct.c is added to a non-resilient type
5861
cake2: Var fixedLayoutStruct.lazy_d.storage is added to a non-resilient type

test/api-digester/Outputs/Cake.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ cake1: Protocol P3 has generic signature change from <Self : P1, Self : P2> to <
99
cake1: AssociatedType RequiementChanges.removedType has been removed
1010
cake1: Constructor Somestruct2.init(_:) has been removed
1111
cake1: Constructor fixedLayoutStruct.init(b:a:) has been removed
12+
cake1: Constructor fixedLayoutStruct2.init(NoLongerWithFixedBinaryOrder:) has been removed
1213
cake1: Func C4.foo() has been removed
1314
cake1: Func RequiementChanges.removedFunc() has been removed
1415
cake1: Subscript RemoveSetters.subscript(_:) has removed its setter

tools/swift-api-digester/ModuleAnalyzerNodes.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,9 @@ bool static isSDKNodeEqual(SDKContext &Ctx, const SDKNode &L, const SDKNode &R)
693693
// them equal because we need to check definition orders.
694694
if (auto *LV = dyn_cast<SDKNodeDeclVar>(&L)) {
695695
if (auto *RV = dyn_cast<SDKNodeDeclVar>(&R)) {
696-
if (LV->hasFixedBinaryOrder() && RV->hasFixedBinaryOrder()) {
696+
if (LV->hasFixedBinaryOrder() != RV->hasFixedBinaryOrder())
697+
return false;
698+
if (LV->hasFixedBinaryOrder()) {
697699
if (LV->getFixedBinaryOrder() != RV->getFixedBinaryOrder())
698700
return false;
699701
}

tools/swift-api-digester/ModuleDiagsConsumer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ static StringRef getCategoryName(uint32_t ID) {
5454
return "/* Generic Signature Changes */";
5555
case LocalDiagID::decl_added:
5656
case LocalDiagID::decl_reorder:
57+
case LocalDiagID::decl_has_fixed_order_change:
5758
return "/* Fixed-layout Type Changes */";
5859
case LocalDiagID::conformance_added:
5960
case LocalDiagID::conformance_removed:

tools/swift-api-digester/swift-api-digester.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,10 @@ void swift::ide::api::SDKNodeDeclVar::diagnose(SDKNode *Right) {
808808
getScreenInfo());
809809
}
810810
if (Ctx.checkingABI()) {
811+
if (hasFixedBinaryOrder() != RV->hasFixedBinaryOrder()) {
812+
Ctx.getDiags().diagnose(SourceLoc(), diag::decl_has_fixed_order_change,
813+
getScreenInfo(), hasFixedBinaryOrder());
814+
}
811815
if (hasFixedBinaryOrder() && RV->hasFixedBinaryOrder() &&
812816
getFixedBinaryOrder() != RV->getFixedBinaryOrder()) {
813817
Ctx.getDiags().diagnose(SourceLoc(), diag::decl_reorder,

0 commit comments

Comments
 (0)