Skip to content

Commit c29abfb

Browse files
authored
Merge pull request #63430 from gottesmm/pr-5d989a63a1de483a30457a09002cfa58c29fe7f8
[move-only] Ban move only enums from being indirect or having indirect fields.
2 parents e0e7468 + 6f13f86 commit c29abfb

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6679,6 +6679,8 @@ ERROR(noimplicitcopy_attr_invalid_in_generic_context,
66796679
ERROR(moveonly_generics, none, "move-only type %0 cannot be used with generics yet", (Type))
66806680
ERROR(noimplicitcopy_attr_not_allowed_on_moveonlytype,none,
66816681
"'@_noImplicitCopy' has no effect when applied to a move only type", ())
6682+
ERROR(moveonly_enums_do_not_support_indirect,none,
6683+
"move-only enum %0 cannot be marked indirect or have indirect cases yet", (Identifier))
66826684

66836685
//------------------------------------------------------------------------------
66846686
// MARK: Type inference from default expressions

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2586,6 +2586,20 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
25862586
TypeChecker::checkDeclCircularity(ED);
25872587

25882588
TypeChecker::checkConformancesInContext(ED);
2589+
2590+
// If our enum is marked as move only, it cannot be indirect or have any
2591+
// indirect cases.
2592+
if (ED->getAttrs().hasAttribute<MoveOnlyAttr>()) {
2593+
if (ED->isIndirect())
2594+
ED->diagnose(diag::moveonly_enums_do_not_support_indirect,
2595+
ED->getBaseIdentifier());
2596+
for (auto *elt : ED->getAllElements()) {
2597+
if (elt->isIndirect()) {
2598+
elt->diagnose(diag::moveonly_enums_do_not_support_indirect,
2599+
ED->getBaseIdentifier());
2600+
}
2601+
}
2602+
}
25892603
}
25902604

25912605
void visitStructDecl(StructDecl *SD) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-move-only
2+
3+
// This test validates that move only enums cannot be marked indirect or have
4+
// indirect cases.
5+
6+
@_moveOnly
7+
struct S {
8+
var i = 5
9+
}
10+
11+
@_moveOnly enum E { }
12+
13+
@_moveOnly
14+
enum E1 {
15+
case first
16+
case second(S)
17+
}
18+
19+
@_moveOnly
20+
indirect enum E2 { // expected-error {{move-only enum 'E2' cannot be marked indirect or have indirect cases yet}}
21+
case first
22+
case second(S)
23+
}
24+
25+
@_moveOnly
26+
enum E3 {
27+
case first
28+
indirect case second(S) // expected-error {{move-only enum 'E3' cannot be marked indirect or have indirect cases yet}}
29+
}

0 commit comments

Comments
 (0)