@@ -200,7 +200,9 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
200
200
void visitMutationAttr(DeclAttribute *attr);
201
201
void visitMutatingAttr(MutatingAttr *attr) { visitMutationAttr(attr); }
202
202
void visitNonMutatingAttr(NonMutatingAttr *attr) { visitMutationAttr(attr); }
203
+ void visitBorrowingAttr(BorrowingAttr *attr) { visitMutationAttr(attr); }
203
204
void visitConsumingAttr(ConsumingAttr *attr) { visitMutationAttr(attr); }
205
+ void visitLegacyConsumingAttr(LegacyConsumingAttr *attr) { visitMutationAttr(attr); }
204
206
void visitDynamicAttr(DynamicAttr *attr);
205
207
206
208
void visitIndirectAttr(IndirectAttr *attr) {
@@ -443,15 +445,21 @@ void AttributeChecker::visitMutationAttr(DeclAttribute *attr) {
443
445
444
446
SelfAccessKind attrModifier;
445
447
switch (attr->getKind()) {
446
- case DeclAttrKind::DAK_Consuming :
447
- attrModifier = SelfAccessKind::Consuming ;
448
+ case DeclAttrKind::DAK_LegacyConsuming :
449
+ attrModifier = SelfAccessKind::LegacyConsuming ;
448
450
break;
449
451
case DeclAttrKind::DAK_Mutating:
450
452
attrModifier = SelfAccessKind::Mutating;
451
453
break;
452
454
case DeclAttrKind::DAK_NonMutating:
453
455
attrModifier = SelfAccessKind::NonMutating;
454
456
break;
457
+ case DeclAttrKind::DAK_Consuming:
458
+ attrModifier = SelfAccessKind::Consuming;
459
+ break;
460
+ case DeclAttrKind::DAK_Borrowing:
461
+ attrModifier = SelfAccessKind::Borrowing;
462
+ break;
455
463
default:
456
464
llvm_unreachable("unhandled attribute kind");
457
465
}
@@ -462,22 +470,33 @@ void AttributeChecker::visitMutationAttr(DeclAttribute *attr) {
462
470
// 'mutating' and 'nonmutating' are not valid on types
463
471
// with reference semantics.
464
472
if (contextTy->hasReferenceSemantics()) {
465
- if (attrModifier != SelfAccessKind::Consuming) {
473
+ switch (attrModifier) {
474
+ case SelfAccessKind::Consuming:
475
+ case SelfAccessKind::LegacyConsuming:
476
+ case SelfAccessKind::Borrowing:
477
+ // It's still OK to specify the ownership convention of methods in
478
+ // classes.
479
+ break;
480
+
481
+ case SelfAccessKind::Mutating:
482
+ case SelfAccessKind::NonMutating:
466
483
diagnoseAndRemoveAttr(attr, diag::mutating_invalid_classes,
467
484
attrModifier, FD->getDescriptiveKind(),
468
485
DC->getSelfProtocolDecl() != nullptr);
486
+ break;
469
487
}
470
488
}
471
489
} else {
472
490
diagnoseAndRemoveAttr(attr, diag::mutating_invalid_global_scope,
473
491
attrModifier);
474
492
}
475
493
476
- // Verify we don't have more than one of mutating, nonmutating,
477
- // and __consuming.
494
+ // Verify we don't have more than one ownership specifier.
478
495
if ((FD->getAttrs().hasAttribute<MutatingAttr>() +
479
496
FD->getAttrs().hasAttribute<NonMutatingAttr>() +
480
- FD->getAttrs().hasAttribute<ConsumingAttr>()) > 1) {
497
+ FD->getAttrs().hasAttribute<LegacyConsumingAttr>() +
498
+ FD->getAttrs().hasAttribute<ConsumingAttr>() +
499
+ FD->getAttrs().hasAttribute<BorrowingAttr>()) > 1) {
481
500
if (auto *NMA = FD->getAttrs().getAttribute<NonMutatingAttr>()) {
482
501
if (attrModifier != SelfAccessKind::NonMutating) {
483
502
diagnoseAndRemoveAttr(NMA, diag::functions_mutating_and_not,
@@ -492,12 +511,26 @@ void AttributeChecker::visitMutationAttr(DeclAttribute *attr) {
492
511
}
493
512
}
494
513
514
+ if (auto *CSA = FD->getAttrs().getAttribute<LegacyConsumingAttr>()) {
515
+ if (attrModifier != SelfAccessKind::LegacyConsuming) {
516
+ diagnoseAndRemoveAttr(CSA, diag::functions_mutating_and_not,
517
+ SelfAccessKind::LegacyConsuming, attrModifier);
518
+ }
519
+ }
520
+
495
521
if (auto *CSA = FD->getAttrs().getAttribute<ConsumingAttr>()) {
496
522
if (attrModifier != SelfAccessKind::Consuming) {
497
523
diagnoseAndRemoveAttr(CSA, diag::functions_mutating_and_not,
498
524
SelfAccessKind::Consuming, attrModifier);
499
525
}
500
526
}
527
+
528
+ if (auto *BSA = FD->getAttrs().getAttribute<BorrowingAttr>()) {
529
+ if (attrModifier != SelfAccessKind::Borrowing) {
530
+ diagnoseAndRemoveAttr(BSA, diag::functions_mutating_and_not,
531
+ SelfAccessKind::Borrowing, attrModifier);
532
+ }
533
+ }
501
534
}
502
535
503
536
// Verify that we don't have a static function.
0 commit comments