Skip to content

Commit 3703072

Browse files
Added experimental feature to allow weak let and immutable weak captures
1 parent c8f1de2 commit 3703072

File tree

4 files changed

+15
-4
lines changed

4 files changed

+15
-4
lines changed

include/swift/Basic/Features.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,9 @@ EXPERIMENTAL_FEATURE(CDecl, false)
517517
/// Allow use of `@extensible` on public enums
518518
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(ExtensibleAttribute, false)
519519

520+
/// Allow `weak let` and make weak captures immutable
521+
EXPERIMENTAL_FEATURE(WeakLet, true)
522+
520523
#undef EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE
521524
#undef EXPERIMENTAL_FEATURE
522525
#undef UPCOMING_FEATURE

lib/AST/Expr.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,9 +1366,8 @@ CaptureListEntry CaptureListEntry::createParsed(
13661366
SourceRange ownershipRange, Identifier name, SourceLoc nameLoc,
13671367
SourceLoc equalLoc, Expr *initializer, DeclContext *DC) {
13681368

1369-
auto introducer =
1370-
(ownershipKind != ReferenceOwnership::Weak ? VarDecl::Introducer::Let
1371-
: VarDecl::Introducer::Var);
1369+
bool forceVar = ownershipKind == ReferenceOwnership::Weak && !Ctx.LangOpts.hasFeature(Feature::WeakLet);
1370+
auto introducer = forceVar ? VarDecl::Introducer::Var : VarDecl::Introducer::Let;
13721371
auto *VD =
13731372
new (Ctx) VarDecl(/*isStatic==*/false, introducer, nameLoc, name, DC);
13741373

lib/AST/FeatureSet.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,15 @@ static bool usesFeatureExtensibleAttribute(Decl *decl) {
628628
return decl->getAttrs().hasAttribute<ExtensibleAttr>();
629629
}
630630

631+
static bool usesFeatureWeakLet(Decl *decl) {
632+
if (auto *VD = dyn_cast<VarDecl>(decl)) {
633+
if (auto *refAttr = VD->getAttrs().getAttribute<ReferenceOwnershipAttr>()) {
634+
return VD->isLet() && refAttr->get() == ReferenceOwnership::Weak;
635+
}
636+
}
637+
return false;
638+
}
639+
631640
// ----------------------------------------------------------------------------
632641
// MARK: - FeatureSet
633642
// ----------------------------------------------------------------------------

lib/Sema/TypeCheckAttr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5260,7 +5260,7 @@ Type TypeChecker::checkReferenceOwnershipAttr(VarDecl *var, Type type,
52605260
case ReferenceOwnershipOptionality::Allowed:
52615261
break;
52625262
case ReferenceOwnershipOptionality::Required:
5263-
if (var->isLet()) {
5263+
if (var->isLet() && !ctx.LangOpts.hasFeature(Feature::WeakLet)) {
52645264
var->diagnose(diag::invalid_ownership_is_let, ownershipKind);
52655265
attr->setInvalid();
52665266
}

0 commit comments

Comments
 (0)