Skip to content

Commit fdc04fd

Browse files
authored
Merge pull request #41800 from slavapestov/rqm-assorted-validation-test-fixes
RequirementMachine: Cleanups and fixes to make more validation-tests pass with inferred-signatures=verify
2 parents 1f7d52d + df49e11 commit fdc04fd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1335
-679
lines changed

include/swift/AST/Decl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4389,6 +4389,7 @@ class ProtocolDecl final : public NominalTypeDecl {
43894389
friend class ProtocolDependenciesRequest;
43904390
friend class RequirementSignatureRequest;
43914391
friend class RequirementSignatureRequestRQM;
4392+
friend class RequirementSignatureRequestGSB;
43924393
friend class ProtocolRequiresClassRequest;
43934394
friend class ExistentialConformsToSelfRequest;
43944395
friend class ExistentialRequiresAnyRequest;

include/swift/AST/GenericSignature.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,29 @@ GenericSignature buildGenericSignature(
529529
SmallVector<GenericTypeParamType *, 2> addedParameters,
530530
SmallVector<Requirement, 2> addedRequirements);
531531

532+
/// Summary of error conditions detected by the Requirement Machine.
533+
enum class GenericSignatureErrorFlags {
534+
/// The original requirements referenced a non-existent type parameter.
535+
HasUnresolvedType = (1<<0),
536+
537+
/// The original requirements were in conflict with each other, meaning
538+
/// there are no possible concrete substitutions which statisfy the
539+
/// generic signature.
540+
HasConflict = (1<<1),
541+
542+
/// The Knuth-Bendix completion procedure failed to construct a confluent
543+
/// rewrite system.
544+
CompletionFailed = (1<<2)
545+
};
546+
547+
using GenericSignatureErrors = OptionSet<GenericSignatureErrorFlags>;
548+
549+
/// AbstractGenericSignatureRequest and InferredGenericSignatureRequest
550+
/// return this type, which stores a GenericSignature together with the
551+
/// above set of error flags.
552+
using GenericSignatureWithError = llvm::PointerIntPair<GenericSignature, 3,
553+
GenericSignatureErrors>;
554+
532555
} // end namespace swift
533556

534557
namespace llvm {

include/swift/AST/RequirementSignature.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#ifndef SWIFT_AST_REQUIREMENT_SIGNATURE_H
1818
#define SWIFT_AST_REQUIREMENT_SIGNATURE_H
1919

20+
#include "swift/AST/GenericSignature.h"
2021
#include "swift/AST/Type.h"
2122

2223
namespace swift {
@@ -42,13 +43,16 @@ class ProtocolTypeAlias final {
4243
class RequirementSignature final {
4344
ArrayRef<Requirement> Requirements;
4445
ArrayRef<ProtocolTypeAlias> TypeAliases;
46+
GenericSignatureErrors Errors;
4547

4648
public:
47-
RequirementSignature() = default;
49+
RequirementSignature(GenericSignatureErrors errors = GenericSignatureErrors())
50+
: Errors(errors) {}
4851

4952
RequirementSignature(ArrayRef<Requirement> requirements,
50-
ArrayRef<ProtocolTypeAlias> typeAliases)
51-
: Requirements(requirements), TypeAliases(typeAliases) {}
53+
ArrayRef<ProtocolTypeAlias> typeAliases,
54+
GenericSignatureErrors errors = GenericSignatureErrors())
55+
: Requirements(requirements), TypeAliases(typeAliases), Errors(errors) {}
5256

5357
/// The requirements including any inherited protocols and conformances for
5458
/// associated types that are introduced in this protocol.
@@ -65,6 +69,10 @@ class RequirementSignature final {
6569
ArrayRef<ProtocolTypeAlias> getTypeAliases() const {
6670
return TypeAliases;
6771
}
72+
73+
GenericSignatureErrors getErrors() const {
74+
return Errors;
75+
}
6876
};
6977

7078
} // end namespace swift

include/swift/AST/TypeCheckRequests.h

Lines changed: 94 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,27 @@ class RequirementSignatureRequestRQM :
493493
bool isCached() const { return true; }
494494
};
495495

496+
/// Compute a protocol's requirement signature using the GenericSignatureBuilder.
497+
/// This is temporary; once the GenericSignatureBuilder goes away this will
498+
/// be removed.
499+
class RequirementSignatureRequestGSB :
500+
public SimpleRequest<RequirementSignatureRequestGSB,
501+
RequirementSignature(ProtocolDecl *),
502+
RequestFlags::Cached> {
503+
public:
504+
using SimpleRequest::SimpleRequest;
505+
506+
private:
507+
friend SimpleRequest;
508+
509+
// Evaluation.
510+
RequirementSignature
511+
evaluate(Evaluator &evaluator, ProtocolDecl *proto) const;
512+
513+
public:
514+
bool isCached() const { return true; }
515+
};
516+
496517
/// Compute the requirements that describe a protocol.
497518
class RequirementSignatureRequest :
498519
public SimpleRequest<RequirementSignatureRequest,
@@ -1726,12 +1747,6 @@ class ClassAncestryFlagsRequest :
17261747

17271748
void simple_display(llvm::raw_ostream &out, AncestryFlags value);
17281749

1729-
/// AbstractGenericSignatureRequest and InferredGenericSignatureRequest
1730-
/// return this type, which stores a GenericSignature together with a bit
1731-
/// indicating if there were any errors detected in the original
1732-
/// requirements.
1733-
using GenericSignatureWithError = llvm::PointerIntPair<GenericSignature, 1>;
1734-
17351750
class AbstractGenericSignatureRequest :
17361751
public SimpleRequest<AbstractGenericSignatureRequest,
17371752
GenericSignatureWithError (const GenericSignatureImpl *,
@@ -1793,6 +1808,37 @@ class AbstractGenericSignatureRequestRQM :
17931808
}
17941809
};
17951810

1811+
/// Build a generic signature using the GenericSignatureBuilder. This is temporary;
1812+
/// once the GenericSignatureBuilder goes away this will be removed.
1813+
class AbstractGenericSignatureRequestGSB :
1814+
public SimpleRequest<AbstractGenericSignatureRequestGSB,
1815+
GenericSignatureWithError (const GenericSignatureImpl *,
1816+
SmallVector<GenericTypeParamType *, 2>,
1817+
SmallVector<Requirement, 2>),
1818+
RequestFlags::Cached> {
1819+
public:
1820+
using SimpleRequest::SimpleRequest;
1821+
1822+
private:
1823+
friend SimpleRequest;
1824+
1825+
// Evaluation.
1826+
GenericSignatureWithError
1827+
evaluate(Evaluator &evaluator,
1828+
const GenericSignatureImpl *baseSignature,
1829+
SmallVector<GenericTypeParamType *, 2> addedParameters,
1830+
SmallVector<Requirement, 2> addedRequirements) const;
1831+
1832+
public:
1833+
// Separate caching.
1834+
bool isCached() const { return true; }
1835+
1836+
/// Abstract generic signature requests never have source-location info.
1837+
SourceLoc getNearestLoc() const {
1838+
return SourceLoc();
1839+
}
1840+
};
1841+
17961842
class InferredGenericSignatureRequest :
17971843
public SimpleRequest<InferredGenericSignatureRequest,
17981844
GenericSignatureWithError (ModuleDecl *,
@@ -1876,6 +1922,48 @@ class InferredGenericSignatureRequestRQM :
18761922
void noteCycleStep(DiagnosticEngine &diags) const;
18771923
};
18781924

1925+
/// Build a generic signature using the GenericSignatureBuilder. This is temporary;
1926+
/// once the GenericSignatureBuilder goes away this will be removed.
1927+
class InferredGenericSignatureRequestGSB :
1928+
public SimpleRequest<InferredGenericSignatureRequestGSB,
1929+
GenericSignatureWithError (ModuleDecl *,
1930+
const GenericSignatureImpl *,
1931+
GenericParamList *,
1932+
WhereClauseOwner,
1933+
SmallVector<Requirement, 2>,
1934+
SmallVector<TypeLoc, 2>,
1935+
bool),
1936+
RequestFlags::Cached> {
1937+
public:
1938+
using SimpleRequest::SimpleRequest;
1939+
1940+
private:
1941+
friend SimpleRequest;
1942+
1943+
// Evaluation.
1944+
GenericSignatureWithError
1945+
evaluate(Evaluator &evaluator,
1946+
ModuleDecl *parentModule,
1947+
const GenericSignatureImpl *baseSignature,
1948+
GenericParamList *genericParams,
1949+
WhereClauseOwner whereClause,
1950+
SmallVector<Requirement, 2> addedRequirements,
1951+
SmallVector<TypeLoc, 2> inferenceSources,
1952+
bool allowConcreteGenericParams) const;
1953+
1954+
public:
1955+
// Separate caching.
1956+
bool isCached() const { return true; }
1957+
1958+
/// Inferred generic signature requests don't have source-location info.
1959+
SourceLoc getNearestLoc() const {
1960+
return SourceLoc();
1961+
}
1962+
1963+
// Cycle handling.
1964+
void noteCycleStep(DiagnosticEngine &diags) const;
1965+
};
1966+
18791967
void simple_display(llvm::raw_ostream &out, const TypeLoc source);
18801968

18811969
class ExtendedTypeRequest

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ SWIFT_REQUEST(TypeChecker, AbstractGenericSignatureRequestRQM,
2525
SmallVector<GenericTypeParamType *, 2>,
2626
SmallVector<Requirement, 2>),
2727
Cached, NoLocationInfo)
28+
SWIFT_REQUEST(TypeChecker, AbstractGenericSignatureRequestGSB,
29+
GenericSignatureWithError (const GenericSignatureImpl *,
30+
SmallVector<GenericTypeParamType *, 2>,
31+
SmallVector<Requirement, 2>),
32+
Cached, NoLocationInfo)
2833
SWIFT_REQUEST(TypeChecker, ApplyAccessNoteRequest,
2934
evaluator::SideEffect(ValueDecl *), Cached, NoLocationInfo)
3035
SWIFT_REQUEST(TypeChecker, AttachedResultBuilderRequest,
@@ -192,6 +197,14 @@ SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequestRQM,
192197
SmallVector<Requirement, 2>,
193198
SmallVector<TypeLoc, 2>, bool),
194199
Cached, NoLocationInfo)
200+
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequestGSB,
201+
GenericSignatureWithError (ModuleDecl *,
202+
const GenericSignatureImpl *,
203+
GenericParamList *,
204+
WhereClauseOwner,
205+
SmallVector<Requirement, 2>,
206+
SmallVector<TypeLoc, 2>, bool),
207+
Cached, NoLocationInfo)
195208
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
196209
bool(ModuleDecl *), Cached, NoLocationInfo)
197210
SWIFT_REQUEST(TypeChecker, InheritedTypeRequest,
@@ -288,6 +301,9 @@ SWIFT_REQUEST(TypeChecker, ProtocolDependenciesRequest,
288301
SWIFT_REQUEST(TypeChecker, RequirementSignatureRequestRQM,
289302
RequirementSignature(ProtocolDecl *), Cached,
290303
NoLocationInfo)
304+
SWIFT_REQUEST(TypeChecker, RequirementSignatureRequestGSB,
305+
RequirementSignature(ProtocolDecl *), Cached,
306+
NoLocationInfo)
291307
SWIFT_REQUEST(TypeChecker, RequirementSignatureRequest,
292308
RequirementSignature(ProtocolDecl *), SeparatelyCached,
293309
NoLocationInfo)

lib/AST/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ add_swift_host_library(swiftAST STATIC
8787
RequirementMachine/PropertyMap.cpp
8888
RequirementMachine/PropertyRelations.cpp
8989
RequirementMachine/PropertyUnification.cpp
90+
RequirementMachine/RequirementBuilder.cpp
9091
RequirementMachine/RequirementLowering.cpp
9192
RequirementMachine/RequirementMachine.cpp
9293
RequirementMachine/RequirementMachineRequests.cpp

0 commit comments

Comments
 (0)