Skip to content

Commit b373bd6

Browse files
committed
Sema: Don't verify protocol requirement signatures if there was an error
1 parent ac7efc1 commit b373bd6

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2653,7 +2653,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
26532653
// Do this before visiting members, to avoid a request cycle if
26542654
// a member referenecs another declaration whose generic signature
26552655
// has a conformance requirement to this protocol.
2656-
auto reqSig = PD->getRequirementSignature().getRequirements();
2656+
auto reqSig = PD->getRequirementSignature();
26572657

26582658
// Check the members.
26592659
for (auto Member : PD->getMembers())
@@ -2669,8 +2669,9 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
26692669
TypeChecker::inferDefaultWitnesses(PD);
26702670

26712671
if (PD->getASTContext().TypeCheckerOpts.DebugGenericSignatures) {
2672-
auto requirementsSig =
2673-
GenericSignature::get({PD->getProtocolSelfType()}, reqSig);
2672+
auto sig =
2673+
GenericSignature::get({PD->getProtocolSelfType()},
2674+
reqSig.getRequirements());
26742675

26752676
llvm::errs() << "\n";
26762677
llvm::errs() << "Protocol requirement signature:\n";
@@ -2679,34 +2680,34 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
26792680
llvm::errs() << "Requirement signature: ";
26802681
PrintOptions Opts;
26812682
Opts.ProtocolQualifiedDependentMemberTypes = true;
2682-
requirementsSig->print(llvm::errs(), Opts);
2683+
sig->print(llvm::errs(), Opts);
26832684
llvm::errs() << "\n";
26842685

26852686
llvm::errs() << "Canonical requirement signature: ";
2686-
auto canRequirementSig =
2687-
CanGenericSignature::getCanonical(requirementsSig.getGenericParams(),
2688-
requirementsSig.getRequirements());
2689-
canRequirementSig->print(llvm::errs(), Opts);
2687+
auto canSig =
2688+
CanGenericSignature::getCanonical(sig.getGenericParams(),
2689+
sig.getRequirements());
2690+
canSig->print(llvm::errs(), Opts);
26902691
llvm::errs() << "\n";
26912692
}
26922693

2693-
if (getASTContext().LangOpts.RequirementMachineProtocolSignatures ==
2694-
RequirementMachineMode::Disabled) {
2695-
#ifndef NDEBUG
2696-
// The GenericSignatureBuilder outputs incorrectly-minimized signatures
2697-
// sometimes, so only check invariants in asserts builds.
2698-
PD->getGenericSignature().verify(reqSig);
2699-
#endif
2700-
} else {
2701-
// When using the Requirement Machine, always verify signatures.
2702-
// An incorrect signature indicates a serious problem which can cause
2703-
// miscompiles or inadvertent ABI dependencies on compiler bugs, so
2704-
// we really want to avoid letting one slip by.
2705-
PD->getGenericSignature().verify(reqSig);
2694+
if (!reqSig.getErrors()) {
2695+
if (getASTContext().LangOpts.RequirementMachineProtocolSignatures ==
2696+
RequirementMachineMode::Disabled) {
2697+
#ifndef NDEBUG
2698+
// The GenericSignatureBuilder outputs incorrectly-minimized signatures
2699+
// sometimes, so only check invariants in asserts builds.
2700+
PD->getGenericSignature().verify(reqSig.getRequirements());
2701+
#endif
2702+
} else {
2703+
// When using the Requirement Machine, always verify signatures.
2704+
// An incorrect signature indicates a serious problem which can cause
2705+
// miscompiles or inadvertent ABI dependencies on compiler bugs, so
2706+
// we really want to avoid letting one slip by.
2707+
PD->getGenericSignature().verify(reqSig.getRequirements());
2708+
}
27062709
}
27072710

2708-
(void) reqSig;
2709-
27102711
checkExplicitAvailability(PD);
27112712
}
27122713

0 commit comments

Comments
 (0)