Skip to content

Commit ee5a3fe

Browse files
committed
AST: AbstractGenericSignatureRequest and InferredGenericSignatureRequest return the HadAnyError bit
For now I'm going to use this in -verify-generic-signatures, but it could be useful in other places too.
1 parent f38f25a commit ee5a3fe

File tree

8 files changed

+65
-45
lines changed

8 files changed

+65
-45
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,8 @@ class GenericSignatureBuilder {
608608
bool allowConcreteGenericParams,
609609
const ProtocolDecl *requirementSignatureSelfProto) &&;
610610

611+
bool hadAnyError() const;
612+
611613
/// Finalize the set of requirements and compute the generic
612614
/// signature.
613615
///
@@ -617,9 +619,6 @@ class GenericSignatureBuilder {
617619
bool allowConcreteGenericParams = false,
618620
const ProtocolDecl *requirementSignatureSelfProto = nullptr) &&;
619621

620-
/// Compute the requirement signature for the given protocol.
621-
static GenericSignature computeRequirementSignature(ProtocolDecl *proto);
622-
623622
private:
624623
/// Finalize the set of requirements, performing any remaining checking
625624
/// required before generating archetypes.

include/swift/AST/TypeCheckRequests.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,11 +1411,17 @@ class ClassAncestryFlagsRequest :
14111411

14121412
void simple_display(llvm::raw_ostream &out, AncestryFlags value);
14131413

1414+
/// AbstractGenericSignatureRequest and InferredGenericSignatureRequest
1415+
/// return this type, which stores a GenericSignature together with a bit
1416+
/// indicating if there were any errors detected in the original
1417+
/// requirements.
1418+
using GenericSignatureWithError = llvm::PointerIntPair<GenericSignature, 1>;
1419+
14141420
class AbstractGenericSignatureRequest :
14151421
public SimpleRequest<AbstractGenericSignatureRequest,
1416-
GenericSignature (const GenericSignatureImpl *,
1417-
SmallVector<GenericTypeParamType *, 2>,
1418-
SmallVector<Requirement, 2>),
1422+
GenericSignatureWithError (const GenericSignatureImpl *,
1423+
SmallVector<GenericTypeParamType *, 2>,
1424+
SmallVector<Requirement, 2>),
14191425
RequestFlags::Cached> {
14201426
public:
14211427
using SimpleRequest::SimpleRequest;
@@ -1424,7 +1430,7 @@ class AbstractGenericSignatureRequest :
14241430
friend SimpleRequest;
14251431

14261432
// Evaluation.
1427-
GenericSignature
1433+
GenericSignatureWithError
14281434
evaluate(Evaluator &evaluator,
14291435
const GenericSignatureImpl *baseSignature,
14301436
SmallVector<GenericTypeParamType *, 2> addedParameters,
@@ -1442,13 +1448,13 @@ class AbstractGenericSignatureRequest :
14421448

14431449
class InferredGenericSignatureRequest :
14441450
public SimpleRequest<InferredGenericSignatureRequest,
1445-
GenericSignature (ModuleDecl *,
1446-
const GenericSignatureImpl *,
1447-
GenericParamList *,
1448-
WhereClauseOwner,
1449-
SmallVector<Requirement, 2>,
1450-
SmallVector<TypeLoc, 2>,
1451-
bool),
1451+
GenericSignatureWithError (ModuleDecl *,
1452+
const GenericSignatureImpl *,
1453+
GenericParamList *,
1454+
WhereClauseOwner,
1455+
SmallVector<Requirement, 2>,
1456+
SmallVector<TypeLoc, 2>,
1457+
bool),
14521458
RequestFlags::Cached> {
14531459
public:
14541460
using SimpleRequest::SimpleRequest;
@@ -1457,7 +1463,7 @@ class InferredGenericSignatureRequest :
14571463
friend SimpleRequest;
14581464

14591465
// Evaluation.
1460-
GenericSignature
1466+
GenericSignatureWithError
14611467
evaluate(Evaluator &evaluator,
14621468
ModuleDecl *parentModule,
14631469
const GenericSignatureImpl *baseSignature,

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
SWIFT_REQUEST(TypeChecker, AbstractGenericSignatureRequest,
19-
GenericSignature (const GenericSignatureImpl *,
20-
SmallVector<GenericTypeParamType *, 2>,
21-
SmallVector<Requirement, 2>),
19+
GenericSignatureWithError (const GenericSignatureImpl *,
20+
SmallVector<GenericTypeParamType *, 2>,
21+
SmallVector<Requirement, 2>),
2222
Cached, NoLocationInfo)
2323
SWIFT_REQUEST(TypeChecker, ApplyAccessNoteRequest,
2424
evaluator::SideEffect(ValueDecl *), Cached, NoLocationInfo)
@@ -131,12 +131,12 @@ SWIFT_REQUEST(TypeChecker, HasImplementationOnlyImportsRequest,
131131
SWIFT_REQUEST(TypeChecker, ModuleLibraryLevelRequest,
132132
LibraryLevel(ModuleDecl *), Cached, NoLocationInfo)
133133
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
134-
GenericSignature (ModuleDecl *,
135-
const GenericSignatureImpl *,
136-
GenericParamList *,
137-
WhereClauseOwner,
138-
SmallVector<Requirement, 2>,
139-
SmallVector<TypeLoc, 2>, bool),
134+
GenericSignatureWithError (ModuleDecl *,
135+
const GenericSignatureImpl *,
136+
GenericParamList *,
137+
WhereClauseOwner,
138+
SmallVector<Requirement, 2>,
139+
SmallVector<TypeLoc, 2>, bool),
140140
Cached, NoLocationInfo)
141141
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
142142
bool(ModuleDecl *), Cached, NoLocationInfo)

lib/AST/GenericSignature.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1749,5 +1749,5 @@ swift::buildGenericSignature(ASTContext &ctx,
17491749
baseSignature.getPointer(),
17501750
addedParameters,
17511751
addedRequirements},
1752-
GenericSignature());
1752+
GenericSignatureWithError()).getPointer();
17531753
}

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8342,6 +8342,10 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
83428342
requirementSignatureSelfProto);
83438343
}
83448344

8345+
bool GenericSignatureBuilder::hadAnyError() const {
8346+
return Impl->HadAnyError;
8347+
}
8348+
83458349
GenericSignature GenericSignatureBuilder::computeGenericSignature(
83468350
bool allowConcreteGenericParams,
83478351
const ProtocolDecl *requirementSignatureSelfProto) && {
@@ -8577,7 +8581,7 @@ static bool isCanonicalRequest(GenericSignature baseSignature,
85778581
return true;
85788582
}
85798583

8580-
GenericSignature
8584+
GenericSignatureWithError
85818585
AbstractGenericSignatureRequest::evaluate(
85828586
Evaluator &evaluator,
85838587
const GenericSignatureImpl *baseSignatureImpl,
@@ -8587,7 +8591,7 @@ AbstractGenericSignatureRequest::evaluate(
85878591
// If nothing is added to the base signature, just return the base
85888592
// signature.
85898593
if (addedParameters.empty() && addedRequirements.empty())
8590-
return baseSignature;
8594+
return GenericSignatureWithError(baseSignature, /*hadError=*/false);
85918595

85928596
ASTContext &ctx = addedParameters.empty()
85938597
? addedRequirements.front().getFirstType()->getASTContext()
@@ -8600,8 +8604,9 @@ AbstractGenericSignatureRequest::evaluate(
86008604
baseSignature.getGenericParams().begin(),
86018605
baseSignature.getGenericParams().end());
86028606

8603-
return GenericSignature::get(addedParameters,
8604-
baseSignature.getRequirements());
8607+
auto result = GenericSignature::get(addedParameters,
8608+
baseSignature.getRequirements());
8609+
return GenericSignatureWithError(result, /*hadError=*/false);
86058610
}
86068611

86078612
// If the request is non-canonical, we won't need to build our own
@@ -8624,16 +8629,18 @@ AbstractGenericSignatureRequest::evaluate(
86248629
}
86258630

86268631
// Build the canonical signature.
8627-
auto canSignatureResult = evaluator(
8632+
auto canSignatureResult = evaluateOrDefault(
8633+
ctx.evaluator,
86288634
AbstractGenericSignatureRequest{
86298635
canBaseSignature.getPointer(), std::move(canAddedParameters),
8630-
std::move(canAddedRequirements)});
8631-
if (!canSignatureResult || !*canSignatureResult)
8632-
return GenericSignature();
8636+
std::move(canAddedRequirements)},
8637+
GenericSignatureWithError());
8638+
if (!canSignatureResult.getPointer())
8639+
return GenericSignatureWithError();
86338640

86348641
// Substitute in the original generic parameters to form the sugared
86358642
// result the original request wanted.
8636-
auto canSignature = *canSignatureResult;
8643+
auto canSignature = canSignatureResult.getPointer();
86378644
SmallVector<GenericTypeParamType *, 2> resugaredParameters;
86388645
resugaredParameters.reserve(canSignature.getGenericParams().size());
86398646
if (baseSignature) {
@@ -8660,7 +8667,9 @@ AbstractGenericSignatureRequest::evaluate(
86608667
resugaredRequirements.push_back(*resugaredReq);
86618668
}
86628669

8663-
return GenericSignature::get(resugaredParameters, resugaredRequirements);
8670+
return GenericSignatureWithError(
8671+
GenericSignature::get(resugaredParameters, resugaredRequirements),
8672+
canSignatureResult.getInt());
86648673
}
86658674

86668675
// Create a generic signature that will form the signature.
@@ -8677,11 +8686,13 @@ AbstractGenericSignatureRequest::evaluate(
86778686
for (const auto &req : addedRequirements)
86788687
builder.addRequirement(req, source, nullptr);
86798688

8680-
return std::move(builder).computeGenericSignature(
8689+
bool hadError = builder.hadAnyError();
8690+
auto result = std::move(builder).computeGenericSignature(
86818691
/*allowConcreteGenericParams=*/true);
8692+
return GenericSignatureWithError(result, hadError);
86828693
}
86838694

8684-
GenericSignature
8695+
GenericSignatureWithError
86858696
InferredGenericSignatureRequest::evaluate(
86868697
Evaluator &evaluator,
86878698
ModuleDecl *parentModule,
@@ -8801,7 +8812,9 @@ InferredGenericSignatureRequest::evaluate(
88018812

88028813
for (const auto &req : addedRequirements)
88038814
builder.addRequirement(req, source, parentModule);
8804-
8805-
return std::move(builder).computeGenericSignature(
8815+
8816+
bool hadError = builder.hadAnyError();
8817+
auto result = std::move(builder).computeGenericSignature(
88068818
allowConcreteGenericParams);
8819+
return GenericSignatureWithError(result, hadError);
88078820
}

lib/Sema/TypeCheckAttr.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2286,7 +2286,8 @@ void AttributeChecker::visitSpecializeAttr(SpecializeAttr *attr) {
22862286
/*allowConcreteGenericParams=*/true};
22872287

22882288
auto specializedSig = evaluateOrDefault(Ctx.evaluator, request,
2289-
GenericSignature());
2289+
GenericSignatureWithError())
2290+
.getPointer();
22902291

22912292
// Check the validity of provided requirements.
22922293
checkSpecializeAttrRequirements(attr, genericSig, specializedSig, Ctx);
@@ -4349,7 +4350,8 @@ bool resolveDifferentiableAttrDerivativeGenericSignature(
43494350

43504351
// Compute generic signature for derivative functions.
43514352
derivativeGenSig = evaluateOrDefault(ctx.evaluator, request,
4352-
GenericSignature());
4353+
GenericSignatureWithError())
4354+
.getPointer();
43534355

43544356
bool hadInvalidRequirements = false;
43554357
for (auto req : derivativeGenSig.requirementsNotSatisfiedBy(originalGenSig)) {

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -770,8 +770,8 @@ GenericSignatureRequest::evaluate(Evaluator &evaluator,
770770
GC->getGenericParams(), WhereClauseOwner(GC),
771771
sameTypeReqs, inferenceSources,
772772
allowConcreteGenericParams};
773-
auto sig = evaluateOrDefault(ctx.evaluator,
774-
request, nullptr);
773+
auto sig = evaluateOrDefault(ctx.evaluator, request,
774+
GenericSignatureWithError()).getPointer();
775775

776776
// Debugging of the generic signature builder and generic signature
777777
// generation.

lib/Sema/TypeChecker.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,8 +441,8 @@ swift::handleSILGenericParams(GenericParamList *genericParams,
441441
DC->getParentModule(), /*parentSig=*/nullptr,
442442
nestedList.back(), WhereClauseOwner(),
443443
{}, {}, /*allowConcreteGenericParams=*/true};
444-
auto sig = evaluateOrDefault(DC->getASTContext().evaluator,
445-
request, GenericSignature());
444+
auto sig = evaluateOrDefault(DC->getASTContext().evaluator, request,
445+
GenericSignatureWithError()).getPointer();
446446

447447
return sig.getGenericEnvironment();
448448
}

0 commit comments

Comments
 (0)