Skip to content

Commit d536ffa

Browse files
authored
Merge pull request #74082 from gottesmm/pr-47232695c9268171a965e55879f4105d48a5698a
[sending] Do not allow for sending to be used together with borrowing.
2 parents b2808d1 + 46be608 commit d536ffa

File tree

9 files changed

+35
-13
lines changed

9 files changed

+35
-13
lines changed

include/swift/AST/DiagnosticsParse.def

+2-1
Original file line numberDiff line numberDiff line change
@@ -2211,7 +2211,8 @@ ERROR(sending_and_transferring_used_together,none,
22112211
WARNING(transferring_is_now_sendable,none,
22122212
"'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly",
22132213
())
2214-
2214+
ERROR(sending_cannot_be_used_with_borrowing,none,
2215+
"'%0' cannot be used together with 'borrowing'", (StringRef))
22152216

22162217
#define UNDEFINE_DIAGNOSTIC_MACROS
22172218
#include "DefineDiagnosticMacros.h"

lib/Parse/ParseDecl.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -5515,6 +5515,14 @@ ParserStatus Parser::ParsedTypeAttributeList::slowParse(Parser &P) {
55155515
.fixItRemove(TransferringLoc);
55165516
}
55175517

5518+
// If we already saw a specifier, check if we have borrowing. In such a
5519+
// case, emit an error.
5520+
if (SpecifierLoc.isValid() &&
5521+
Specifier == ParamDecl::Specifier::Borrowing) {
5522+
P.diagnose(Tok, diag::sending_cannot_be_used_with_borrowing,
5523+
"sending");
5524+
}
5525+
55185526
SendingLoc = P.consumeToken();
55195527
continue;
55205528
}
@@ -5553,6 +5561,13 @@ ParserStatus Parser::ParsedTypeAttributeList::slowParse(Parser &P) {
55535561
P.diagnose(Tok, diag::sending_before_parameter_specifier,
55545562
getNameForParamSpecifier(Specifier));
55555563
}
5564+
5565+
// We cannot use transferring with borrowing.
5566+
if (TransferringLoc.isValid() &&
5567+
Specifier == ParamDecl::Specifier::Borrowing) {
5568+
P.diagnose(TransferringLoc, diag::sending_cannot_be_used_with_borrowing,
5569+
"transferring");
5570+
}
55565571
}
55575572
Tok.setKind(tok::contextual_keyword);
55585573
SpecifierLoc = P.consumeToken();

test/Parse/sending.swift

+3
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,6 @@ func testArgWithConsumingWrongOrder(_ x: sending consuming String, _ y: sending
2828
func testArgWithConsumingWrongOrderType(_ x: (sending consuming String, sending inout String) -> ()) {}
2929
// expected-error @-1 {{'sending' must be placed after specifier 'consuming'}}
3030
// expected-error @-2 {{'sending' must be placed after specifier 'inout'}}
31+
32+
func testBorrowSending(_ x: borrowing sending String) {}
33+
// expected-error @-1 {{'sending' cannot be used together with 'borrowing'}}

test/Parse/transferring.swift

+4
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,7 @@ func testVarDeclTuple2(_ x: (transferring String)) {}
2727
// expected-warning @-1 {{'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly}}
2828
func testVarDeclTuple2(_ x: (transferring String, String)) {} // expected-error {{'transferring' cannot be applied to tuple elements}}
2929
// expected-warning @-1 {{'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly}}
30+
31+
func testBorrowSending(_ x: transferring borrowing String) {}
32+
// expected-warning @-1 {{'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly}}
33+
// expected-error @-2 {{'transferring' cannot be used together with 'borrowing'}}

test/SIL/Parser/sending.sil

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ sil_stage raw
55

66
// CHECK-LABEL: func transferValueDefault<T>(_ t: sending T)
77
func transferValueDefault<T>(_ t: sending T)
8-
// CHECK-LABEL: func transferValueBorrowing<T>(_ t: borrowing sending T)
9-
func transferValueBorrowing<T>(_ t: borrowing sending T)
8+
// CHECK-LABEL: func transferValueBorrowing<T>(_ t: __shared sending T)
9+
func transferValueBorrowing<T>(_ t: __shared sending T)
1010
// CHECK-LABEL: func transferValueConsuming<T>(_ t: consuming sending T)
1111
func transferValueConsuming<T>(_ t: consuming sending T)
1212

test/SIL/Parser/transferring.sil

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ sil_stage raw
44

55
// CHECK-LABEL: func transferValueDefault<T>(_ t: sending T)
66
func transferValueDefault<T>(_ t: transferring T)
7-
// CHECK-LABEL: func transferValueBorrowing<T>(_ t: borrowing sending T)
8-
func transferValueBorrowing<T>(_ t: transferring borrowing T)
7+
// CHECK-LABEL: func transferValueBorrowing<T>(_ t: __shared sending T)
8+
func transferValueBorrowing<T>(_ t: transferring __shared T)
99
// CHECK-LABEL: func transferValueConsuming<T>(_ t: consuming sending T)
1010
func transferValueConsuming<T>(_ t: transferring consuming T)
1111

test/SIL/Serialization/sending.sil

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ sil_stage raw
99

1010
// CHECK-LABEL: func transferValueDefault<T>(_ t: sending T)
1111
func transferValueDefault<T>(_ t: transferring T)
12-
// CHECK-LABEL: func transferValueBorrowing<T>(_ t: borrowing sending T)
13-
func transferValueBorrowing<T>(_ t: transferring borrowing T)
12+
// CHECK-LABEL: func transferValue__shared<T>(_ t: __shared sending T)
13+
func transferValue__shared<T>(_ t: transferring __shared T)
1414
// CHECK-LABEL: func transferValueConsuming<T>(_ t: consuming sending T)
1515
func transferValueConsuming<T>(_ t: transferring consuming T)
1616

1717
// CHECK-LABEL: func sendingValueDefault<T>(_ t: sending T)
1818
func sendingValueDefault<T>(_ t: sending T)
19-
// CHECK-LABEL: func sendingValueBorrowing<T>(_ t: borrowing sending T)
20-
func sendingValueBorrowing<T>(_ t: borrowing sending T)
19+
// CHECK-LABEL: func sendingValue__shared<T>(_ t: __shared sending T)
20+
func sendingValue__shared<T>(_ t: __shared sending T)
2121
// CHECK-LABEL: func sendingValueConsuming<T>(_ t: consuming sending T)
2222
func sendingValueConsuming<T>(_ t: consuming sending T)
2323

test/Sema/sending.swift

+2-4
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@ func test_good(_ x: sending Int) {}
1010

1111
func test_consuming_after_sending(_ x: sending consuming Int) {} // expected-error {{'sending' must be placed after specifier 'consuming'}}
1212

13-
func test_borrowing_after_sending(_ x: sending borrowing Int) {} // expected-error {{'sending' must be placed after specifier 'borrowing'}}
14-
1513
func test_inout_after_sending(_ x: sending inout Int) {} // expected-error {{'sending' must be placed after specifier 'inout'}}
1614

1715
func test_repeated_sending(_ x: sending sending Int) {} // expected-error {{parameter may have at most one 'sending' specifier}}
1816

19-
func test_repeated_sending_mixed(_ x: sending borrowing sending inout Int) {}
20-
// expected-error @-1 {{'sending' must be placed after specifier 'borrowing'}}
17+
func test_repeated_sending_mixed(_ x: sending consuming sending inout Int) {}
18+
// expected-error @-1 {{'sending' must be placed after specifier 'consuming'}}
2119
// expected-error @-2 {{parameter may have at most one 'sending' specifier}}
2220
// expected-error @-3 {{parameter may have at most one of the 'inout', 'borrowing', or 'consuming' specifiers}}
2321

test/Sema/transferring.swift

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func test_repeated_transferring_mixed(_ x: transferring borrowing transferring i
2828
// expected-error @-3 {{parameter may have at most one of the 'inout', 'borrowing', or 'consuming' specifiers}}
2929
// expected-warning @-4 {{'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly}}
3030
// expected-warning @-5 {{'transferring' has been renamed to 'sending' and the 'transferring' spelling will be removed shortly}}
31+
// expected-error @-6 {{'transferring' cannot be used together with 'borrowing'}}
3132

3233
// Just until we get the results setup.
3334
func test_transferring_result_in_tuple() -> (transferring Int, Int) {}

0 commit comments

Comments
 (0)