Skip to content

Commit 3b1ad80

Browse files
authored
Merge pull request #3972 from swiftwasm/main
[pull] swiftwasm from main
2 parents aa7c420 + 2d12fab commit 3b1ad80

Some content is hidden

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

43 files changed

+1899
-700
lines changed

docs/DifferentiableProgramming.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ differentiation: given an "original function" to differentiate, a derivative
698698
function is generated by replacing function applications in the original
699699
function with corresponding derivative function applications. The algorithm is
700700
described in detail in the
701-
[Swift Differentiable Programming Implementation Overview document](http://bit.ly/swift-autodiff-internals).
701+
[Swift Differentiable Programming Implementation Overview](DifferentiableProgrammingImplementation.md).
702702

703703
Some languages provide the ability to define custom code transformations:
704704

docs/DifferentiableProgrammingImplementation.md

Lines changed: 1000 additions & 0 deletions
Large diffs are not rendered by default.
Loading
Loading

include/swift/AST/ASTContext.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,6 +1231,11 @@ class ASTContext final {
12311231
bool isRecursivelyConstructingRequirementMachine(
12321232
CanGenericSignature sig);
12331233

1234+
/// This is a hack to break cycles. Don't introduce new callers of this
1235+
/// method.
1236+
bool isRecursivelyConstructingRequirementMachine(
1237+
const ProtocolDecl *proto);
1238+
12341239
/// Retrieve a generic signature with a single unconstrained type parameter,
12351240
/// like `<T>`.
12361241
CanGenericSignature getSingleGenericParameterSignature() const;

include/swift/AST/Attr.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ CONTEXTUAL_SIMPLE_DECL_ATTR(_const, CompileTimeConst,
699699
ABIStableToAdd | ABIStableToRemove | APIBreakingToAdd | APIStableToRemove,
700700
126)
701701

702-
SIMPLE_DECL_ATTR(_unavailableFromAsync, UnavailableFromAsync,
702+
DECL_ATTR(_unavailableFromAsync, UnavailableFromAsync,
703703
OnFunc | OnConstructor | UserInaccessible |
704704
ABIStableToAdd | ABIStableToRemove |
705705
APIBreakingToAdd | APIStableToRemove,

include/swift/AST/Attr.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2085,6 +2085,26 @@ class TypeSequenceAttr : public DeclAttribute {
20852085
}
20862086
};
20872087

2088+
/// The @_unavailableFromAsync attribute, used to make function declarations
2089+
/// unavailable from async contexts.
2090+
class UnavailableFromAsyncAttr : public DeclAttribute {
2091+
public:
2092+
UnavailableFromAsyncAttr(StringRef Message, SourceLoc AtLoc,
2093+
SourceRange Range, bool Implicit)
2094+
: DeclAttribute(DAK_UnavailableFromAsync, AtLoc, Range, Implicit),
2095+
Message(Message) {}
2096+
UnavailableFromAsyncAttr(StringRef Message, bool Implicit)
2097+
: UnavailableFromAsyncAttr(Message, SourceLoc(), SourceRange(),
2098+
Implicit) {}
2099+
const StringRef Message;
2100+
2101+
bool hasMessage() const { return !Message.empty(); }
2102+
2103+
static bool classof(const DeclAttribute *DA) {
2104+
return DA->getKind() == DAK_UnavailableFromAsync;
2105+
}
2106+
};
2107+
20882108
/// Attributes that may be applied to declarations.
20892109
class DeclAttributes {
20902110
/// Linked list of declaration attributes.

include/swift/AST/DiagnosticsParse.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,6 +1435,8 @@ ERROR(attr_missing_label,PointsToFirstBadToken,
14351435
"missing label '%0:' in '@%1' attribute", (StringRef, StringRef))
14361436
ERROR(attr_expected_label,none,
14371437
"expected label '%0:' in '@%1' attribute", (StringRef, StringRef))
1438+
ERROR(attr_expected_colon_after_label,none,
1439+
"expected ':' after label '%0'", (StringRef))
14381440

14391441
ERROR(alignment_must_be_positive_integer,none,
14401442
"alignment value must be a positive integer literal", ())

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4719,7 +4719,8 @@ ERROR(async_named_decl_must_be_available_from_async,none,
47194719
"asynchronous %0 %1 must be available from asynchronous contexts",
47204720
(DescriptiveDeclKind, DeclName))
47214721
ERROR(async_unavailable_decl,none,
4722-
"%0 %1 is unavailable from asynchronous contexts", (DescriptiveDeclKind, DeclBaseName))
4722+
"%0 %1 is unavailable from asynchronous contexts%select{|; %3}2",
4723+
(DescriptiveDeclKind, DeclBaseName, bool, StringRef))
47234724

47244725
//------------------------------------------------------------------------------
47254726
// MARK: Type Check Types

lib/AST/ASTContext.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,11 @@ bool ASTContext::isRecursivelyConstructingRequirementMachine(
20172017
return getRewriteContext().isRecursivelyConstructingRequirementMachine(sig);
20182018
}
20192019

2020+
bool ASTContext::isRecursivelyConstructingRequirementMachine(
2021+
const ProtocolDecl *proto) {
2022+
return getRewriteContext().isRecursivelyConstructingRequirementMachine(proto);
2023+
}
2024+
20202025
Optional<llvm::TinyPtrVector<ValueDecl *>>
20212026
OverriddenDeclsRequest::getCachedResult() const {
20222027
auto decl = std::get<0>(getStorage());

lib/AST/Attr.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,17 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
11641164
break;
11651165
}
11661166

1167+
case DAK_UnavailableFromAsync: {
1168+
Printer.printAttrName("@_unavailableFromAsync");
1169+
const UnavailableFromAsyncAttr *attr = cast<UnavailableFromAsyncAttr>(this);
1170+
if (attr->hasMessage()) {
1171+
Printer << "(message: \"";
1172+
Printer << attr->Message;
1173+
Printer << "\")";
1174+
}
1175+
break;
1176+
}
1177+
11671178
case DAK_Count:
11681179
llvm_unreachable("exceed declaration attribute kinds");
11691180

@@ -1317,6 +1328,8 @@ StringRef DeclAttribute::getAttrName() const {
13171328
return "transpose";
13181329
case DAK_TypeSequence:
13191330
return "_typeSequence";
1331+
case DAK_UnavailableFromAsync:
1332+
return "_unavailableFromAsync";
13201333
}
13211334
llvm_unreachable("bad DeclAttrKind");
13221335
}

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,9 @@ struct GenericSignatureBuilder::Implementation {
680680
/// requirements.
681681
bool RebuildingWithoutRedundantConformances = false;
682682

683+
/// Whether we are building a protocol requirement signature.
684+
bool BuildingProtocolRequirementSignature = false;
685+
683686
/// A mapping of redundant explicit requirements to the best root requirement
684687
/// that implies them. Built by computeRedundantRequirements().
685688
using RedundantRequirementMap =
@@ -2313,6 +2316,11 @@ void GenericSignatureBuilder::addConditionalRequirements(
23132316
if (Impl->RebuildingWithoutRedundantConformances)
23142317
return;
23152318

2319+
// We do not perform requirement inference, including conditional requirement
2320+
// inference, inside protocols.
2321+
if (Impl->BuildingProtocolRequirementSignature)
2322+
return;
2323+
23162324
// Abstract conformances don't have associated decl-contexts/modules, but also
23172325
// don't have conditional requirements.
23182326
if (conformance.isConcrete()) {
@@ -3399,10 +3407,12 @@ void EquivalenceClass::modified(GenericSignatureBuilder &builder) {
33993407
}
34003408

34013409
GenericSignatureBuilder::GenericSignatureBuilder(
3402-
ASTContext &ctx)
3410+
ASTContext &ctx,
3411+
bool requirementSignature)
34033412
: Context(ctx), Diags(Context.Diags), Impl(new Implementation) {
34043413
if (auto *Stats = Context.Stats)
34053414
++Stats->getFrontendCounters().NumGenericSignatureBuilders;
3415+
Impl->BuildingProtocolRequirementSignature = requirementSignature;
34063416
}
34073417

34083418
GenericSignatureBuilder::GenericSignatureBuilder(
@@ -3991,6 +4001,8 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
39914001
auto protocolSubMap = SubstitutionMap::getProtocolSubstitutions(
39924002
proto, selfType.getDependentType(*this), ProtocolConformanceRef(proto));
39934003

4004+
auto result = ConstraintResult::Resolved;
4005+
39944006
// Use the requirement signature to avoid rewalking the entire protocol. This
39954007
// cannot compute the requirement signature directly, because that may be
39964008
// infinitely recursive: this code is also used to construct it.
@@ -4007,19 +4019,20 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
40074019
auto reqResult = substReq
40084020
? addRequirement(*substReq, innerSource, nullptr)
40094021
: ConstraintResult::Conflicting;
4010-
if (isErrorResult(reqResult)) return reqResult;
4022+
if (isErrorResult(reqResult) && !isErrorResult(result))
4023+
result = reqResult;
40114024
}
40124025

4013-
return ConstraintResult::Resolved;
4026+
return result;
40144027
}
40154028

40164029
if (!onlySameTypeConstraints) {
40174030
// Add all of the inherited protocol requirements, recursively.
40184031
auto inheritedReqResult =
40194032
addInheritedRequirements(proto, selfType.getUnresolvedType(), source,
40204033
nullptr);
4021-
if (isErrorResult(inheritedReqResult))
4022-
return inheritedReqResult;
4034+
if (isErrorResult(inheritedReqResult) && !isErrorResult(inheritedReqResult))
4035+
result = inheritedReqResult;
40234036
}
40244037

40254038
// Add any requirements in the where clause on the protocol.
@@ -4048,7 +4061,7 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
40484061
getASTContext()),
40494062
innerSource);
40504063

4051-
return ConstraintResult::Resolved;
4064+
return result;
40524065
}
40534066

40544067
// Remaining logic is not relevant in ObjC protocol cases.
@@ -4156,11 +4169,13 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
41564169
Type assocType =
41574170
DependentMemberType::get(selfType.getDependentType(*this), assocTypeDecl);
41584171
if (!onlySameTypeConstraints) {
4172+
(void) resolve(assocType, source);
4173+
41594174
auto assocResult =
41604175
addInheritedRequirements(assocTypeDecl, assocType, source,
41614176
/*inferForModule=*/nullptr);
4162-
if (isErrorResult(assocResult))
4163-
return assocResult;
4177+
if (isErrorResult(assocResult) && !isErrorResult(result))
4178+
result = assocResult;
41644179
}
41654180

41664181
// Add requirements from this associated type's where clause.
@@ -4314,7 +4329,7 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
43144329
}
43154330
}
43164331

4317-
return ConstraintResult::Resolved;
4332+
return result;
43184333
}
43194334

43204335
ConstraintResult GenericSignatureBuilder::addConformanceRequirement(
@@ -8830,7 +8845,8 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
88308845
}
88318846

88328847
auto buildViaGSB = [&]() {
8833-
GenericSignatureBuilder builder(proto->getASTContext());
8848+
GenericSignatureBuilder builder(proto->getASTContext(),
8849+
/*requirementSignature=*/true);
88348850

88358851
// Add all of the generic parameters.
88368852
for (auto gp : *proto->getGenericParams())
@@ -8873,9 +8889,23 @@ RequirementSignatureRequest::evaluate(Evaluator &evaluator,
88738889
auto rqmResult = buildViaRQM();
88748890
auto gsbResult = buildViaGSB();
88758891

8876-
if (rqmResult.size() != gsbResult.size() ||
8877-
!std::equal(rqmResult.begin(), rqmResult.end(),
8878-
gsbResult.begin())) {
8892+
// For now, only compare conformance requirements, since those are the
8893+
// important ones from the ABI perspective.
8894+
SmallVector<Requirement, 2> rqmConformances;
8895+
for (auto req : rqmResult) {
8896+
if (req.getKind() == RequirementKind::Conformance)
8897+
rqmConformances.push_back(req);
8898+
}
8899+
SmallVector<Requirement, 2> gsbConformances;
8900+
for (auto req : gsbResult) {
8901+
if (req.getKind() == RequirementKind::Conformance)
8902+
gsbConformances.push_back(req);
8903+
}
8904+
8905+
if (rqmConformances.size() != gsbConformances.size() ||
8906+
!std::equal(rqmConformances.begin(),
8907+
rqmConformances.end(),
8908+
gsbConformances.begin())) {
88798909
llvm::errs() << "RequirementMachine protocol signature minimization is broken:\n";
88808910
llvm::errs() << "Protocol: " << proto->getName() << "\n";
88818911

lib/AST/GenericSignatureBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,8 @@ class GenericSignatureBuilder {
496496

497497
public:
498498
/// Construct a new generic signature builder.
499-
explicit GenericSignatureBuilder(ASTContext &ctx);
499+
explicit GenericSignatureBuilder(ASTContext &ctx,
500+
bool requirementSignature=false);
500501
GenericSignatureBuilder(GenericSignatureBuilder &&);
501502
~GenericSignatureBuilder();
502503

0 commit comments

Comments
 (0)