Skip to content

Commit b3bc295

Browse files
authored
Merge pull request #41578 from slavapestov/rqm-check-mode
RequirementMachine: Add fourth 'check' option to 'on'/'off'/'verify' flags
2 parents 711d0ff + e8d2406 commit b3bc295

File tree

5 files changed

+37
-10
lines changed

5 files changed

+37
-10
lines changed

include/swift/Basic/LangOptions.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ namespace swift {
8888
Enabled = 1,
8989

9090
/// Use both and assert if the results do not match.
91-
Verify = 2
91+
Verify = 2,
92+
93+
/// Use both, print a message only but do not assert on mismatch.
94+
Check = 3,
9295
};
9396

9497
/// A collection of options that affect the language dialect and

include/swift/Option/Options.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,15 +626,15 @@ def no_emit_module_separately:
626626

627627
def requirement_machine_protocol_signatures_EQ : Joined<["-"], "requirement-machine-protocol-signatures=">,
628628
Flags<[FrontendOption]>,
629-
HelpText<"Control usage of experimental protocol requirement signature minimization: 'on', 'off', or 'verify'">;
629+
HelpText<"Control usage of experimental protocol requirement signature minimization: 'on', 'off', 'verify' or 'check'">;
630630

631631
def requirement_machine_abstract_signatures_EQ : Joined<["-"], "requirement-machine-abstract-signatures=">,
632632
Flags<[FrontendOption]>,
633-
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;
633+
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', 'verify' or 'check'">;
634634

635635
def requirement_machine_inferred_signatures_EQ : Joined<["-"], "requirement-machine-inferred-signatures=">,
636636
Flags<[FrontendOption]>,
637-
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;
637+
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', 'verify' or 'check'">;
638638

639639
def experimental_hermetic_seal_at_link:
640640
Flag<["-"], "experimental-hermetic-seal-at-link">,

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8382,7 +8382,8 @@ AbstractGenericSignatureRequest::evaluate(
83828382
case RequirementMachineMode::Enabled:
83838383
return buildViaRQM();
83848384

8385-
case RequirementMachineMode::Verify: {
8385+
case RequirementMachineMode::Verify:
8386+
case RequirementMachineMode::Check: {
83868387
auto rqmResult = buildViaRQM();
83878388
auto gsbResult = buildViaGSB();
83888389

@@ -8401,7 +8402,9 @@ AbstractGenericSignatureRequest::evaluate(
84018402
gsbResult.getPointer()->print(llvm::errs(), opts);
84028403
llvm::errs() << "\n";
84038404

8404-
abort();
8405+
if (ctx.LangOpts.RequirementMachineAbstractSignatures
8406+
== RequirementMachineMode::Verify)
8407+
abort();
84058408
}
84068409

84078410
return rqmResult;
@@ -8559,7 +8562,8 @@ InferredGenericSignatureRequest::evaluate(
85598562
case RequirementMachineMode::Enabled:
85608563
return buildViaRQM();
85618564

8562-
case RequirementMachineMode::Verify: {
8565+
case RequirementMachineMode::Verify:
8566+
case RequirementMachineMode::Check: {
85638567
auto rqmResult = buildViaRQM();
85648568
auto gsbResult = buildViaGSB();
85658569

@@ -8578,7 +8582,9 @@ InferredGenericSignatureRequest::evaluate(
85788582
gsbResult.getPointer()->print(llvm::errs(), opts);
85798583
llvm::errs() << "\n";
85808584

8581-
abort();
8585+
if (ctx.LangOpts.RequirementMachineInferredSignatures
8586+
== RequirementMachineMode::Verify)
8587+
abort();
85828588
}
85838589

85848590
return rqmResult;
@@ -8672,7 +8678,8 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86728678
case RequirementMachineMode::Enabled:
86738679
return buildViaRQM();
86748680

8675-
case RequirementMachineMode::Verify: {
8681+
case RequirementMachineMode::Verify:
8682+
case RequirementMachineMode::Check: {
86768683
auto rqmResult = buildViaRQM();
86778684
auto gsbResult = buildViaGSB();
86788685

@@ -8697,7 +8704,9 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
86978704
gsbSig.print(llvm::errs(), opts);
86988705
llvm::errs() << "\n";
86998706

8700-
abort();
8707+
if (ctx.LangOpts.RequirementMachineProtocolSignatures
8708+
== RequirementMachineMode::Verify)
8709+
abort();
87018710
}
87028711

87038712
return rqmResult;

lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -886,6 +886,7 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
886886
.Case("off", RequirementMachineMode::Disabled)
887887
.Case("on", RequirementMachineMode::Enabled)
888888
.Case("verify", RequirementMachineMode::Verify)
889+
.Case("check", RequirementMachineMode::Check)
889890
.Default(None);
890891

891892
if (value)
@@ -900,6 +901,7 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
900901
.Case("off", RequirementMachineMode::Disabled)
901902
.Case("on", RequirementMachineMode::Enabled)
902903
.Case("verify", RequirementMachineMode::Verify)
904+
.Case("check", RequirementMachineMode::Check)
903905
.Default(None);
904906

905907
if (value)
@@ -914,6 +916,7 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
914916
.Case("off", RequirementMachineMode::Disabled)
915917
.Case("on", RequirementMachineMode::Enabled)
916918
.Case("verify", RequirementMachineMode::Verify)
919+
.Case("check", RequirementMachineMode::Check)
917920
.Default(None);
918921

919922
if (value)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %target-swift-emit-silgen %s -requirement-machine-abstract-signatures=on | %FileCheck %s
2+
3+
// This is a GenericSignatureBuilder bug fixed with the Requirement Machine, from
4+
// https://bugs.swift.org/browse/SR-15917.
5+
6+
public struct Foo<Unused: CaseIterable> {
7+
public struct Nested {}
8+
9+
public let closure: () -> Nested
10+
}
11+
12+
// CHECK-LABEL: sil [transparent] [serialized] [ossa] @$s029type_lowering_subst_function_A13_caseiterable3FooV7closureAC6NestedVyx_Gycvg : $@convention(method) <Unused where Unused : CaseIterable> (@guaranteed Foo<Unused>) -> @owned @callee_guaranteed @substituted <τ_0_0, τ_0_1 where τ_0_0 : CaseIterable, τ_0_0 == τ_0_1> () -> Foo<τ_0_0>.Nested for <Unused, Unused>

0 commit comments

Comments
 (0)