Skip to content

Commit 2668022

Browse files
committed
SR-12802: Disambiguate functions with lvalue and rvalue reference parameters in the same overload set
1 parent db7d1e7 commit 2668022

File tree

10 files changed

+34
-31
lines changed

10 files changed

+34
-31
lines changed

lib/ClangImporter/ImportType.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2313,8 +2313,10 @@ ParameterList *ClangImporter::Implementation::importFunctionParameterList(
23132313
}
23142314

23152315
paramTy = refType->getPointeeType();
2316-
if (!paramTy.isConstQualified())
2316+
if (isa<clang::LValueReferenceType>(paramTy) &&
2317+
!paramTy.isConstQualified()) {
23172318
isInOut = true;
2319+
}
23182320
}
23192321

23202322
if (!swiftParamTy) {

lib/SIL/IR/SILFunctionType.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,9 +1328,13 @@ static bool isClangTypeMoreIndirectThanSubstType(TypeConverter &TC,
13281328
// Pass C++ const reference types indirectly. Right now there's no way to
13291329
// express immutable borrowed params, so we have to have this hack.
13301330
// Eventually, we should just express these correctly: rdar://89647503
1331-
if (clangTy->isReferenceType() &&
1332-
clangTy->getPointeeType().isConstQualified())
1333-
return true;
1331+
if (clangTy->isReferenceType()) {
1332+
if (clangTy->getPointeeType().isConstQualified() ||
1333+
clangTy->isRValueReferenceType()) {
1334+
1335+
return true;
1336+
}
1337+
}
13341338

13351339
return false;
13361340
}

test/Interop/Cxx/class/method/ambiguous-methods-module-interface.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
// CHECK: func increment(_ a: Int32) -> Int32
44
// CHECK: mutating func incrementMutating(_ a: Int32) -> Int32
55

6-
// CHECK: mutating func incrementMutating(_ a: Int32, _ b: Int32, _ c: inout Int32)
7-
// CHECK: func increment(_ a: Int32, _ b: Int32, _ c: inout Int32)
6+
// CHECK: mutating func incrementMutating(_ a: Int32, _ b: Int32, _ c: Int32)
7+
// CHECK: func increment(_ a: Int32, _ b: Int32, _ c: Int32)
88

9-
// CHECK: mutating func incrementMutating(_ a: inout Int32, _ b: Int32)
10-
// CHECK: func increment(_ a: inout Int32, _ b: Int32)
9+
// CHECK: mutating func incrementMutating(_ a: Int32, _ b: Int32)
10+
// CHECK: func increment(_ a: Int32, _ b: Int32)
1111

1212
// CHECK: func numberOfMutableMethodsCalled() -> Int32
1313
// CHECK: mutating func numberOfMutableMethodsCalledMutating() -> Int32

test/Interop/Cxx/class/method/ambiguous-methods.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ CxxAmbiguousMethodTestSuite.test("Out Param Increment: (Int, Int, inout Int) ->
5959
expectEqual(0, instance.numberOfMutableMethodsCalled())
6060

6161
// Non mutable version should NOT change count
62-
instance.increment(0, 1, &out);
62+
instance.increment(0, 1, out);
6363
expectEqual(1, out)
6464
expectEqual(0, instance.numberOfMutableMethodsCalled())
6565

66-
instance.incrementMutating(5, 2, &out);
66+
instance.incrementMutating(5, 2, out);
6767
expectEqual(7, out)
6868
expectEqual(1, instance.numberOfMutableMethodsCalled())
6969
}
@@ -76,11 +76,11 @@ CxxAmbiguousMethodTestSuite.test("Inout Param Increment: (inout Int, Int) -> Voi
7676
expectEqual(0, instance.numberOfMutableMethodsCalled())
7777

7878
// Non mutable version should NOT change count
79-
instance.increment(&inoutVal, 1);
79+
instance.increment(inoutVal, 1);
8080
expectEqual(1, inoutVal)
8181
expectEqual(0, instance.numberOfMutableMethodsCalled())
8282

83-
instance.incrementMutating(&inoutVal, 2);
83+
instance.incrementMutating(inoutVal, 2);
8484
expectEqual(3, inoutVal)
8585
expectEqual(1, instance.numberOfMutableMethodsCalled())
8686
}

test/Interop/Cxx/reference/reference-irgen.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public func getConstCxxRvalueRef() -> UnsafePointer<CInt> {
3232

3333
public func setCxxRef() {
3434
var val: CInt = 21
35-
setStaticIntRef(&val)
35+
setStaticIntRef(val)
3636
}
3737

3838
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main9setCxxRefyyF"()
@@ -48,7 +48,7 @@ public func setCxxConstRef() {
4848

4949
public func setCxxRvalueRef() {
5050
var val: CInt = 21
51-
setStaticIntRvalueRef(&val)
51+
setStaticIntRvalueRef(val)
5252
}
5353

5454
// CHECK: define {{(protected |dllexport )?}}swiftcc void @"$s4main15setCxxRvalueRefyyF"()

test/Interop/Cxx/reference/reference-module-interface.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
// CHECK: func getConstStaticIntRef() -> UnsafePointer<Int32>
77
// CHECK: func getConstStaticIntRvalueRef() -> UnsafePointer<Int32>
88
// CHECK: func setStaticInt(_: Int32)
9-
// CHECK: func setStaticIntRef(_: inout Int32)
10-
// CHECK: func setStaticIntRvalueRef(_: inout Int32)
9+
// CHECK: func setStaticIntRef(_: Int32)
10+
// CHECK: func setStaticIntRvalueRef(_: Int32)
1111
// CHECK: func setConstStaticIntRef(_: Int32)
1212
// CHECK: func setConstStaticIntRvalueRef(_: Int32)
1313
// CHECK: func getFuncRef() -> @convention(c) () -> Int32

test/Interop/Cxx/reference/reference-silgen.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ func getConstCxxRvalueRef() -> UnsafePointer<CInt> {
3636

3737
func setCxxRef() {
3838
var val: CInt = 21
39-
setStaticIntRef(&val)
39+
setStaticIntRef(val)
4040
}
4141

4242
// CHECK: sil hidden @$s4main9setCxxRefyyF : $@convention(thin) () -> ()
43-
// CHECK: [[REF:%.*]] = function_ref @{{_Z15setStaticIntRefRi|\?setStaticIntRef@@YAXAEAH@Z}} : $@convention(c) (@inout Int32) -> ()
44-
// CHECK: apply [[REF]](%{{[0-9]+}}) : $@convention(c) (@inout Int32) -> ()
43+
// CHECK: [[REF:%.*]] = function_ref @{{_Z15setStaticIntRefRi|\?setStaticIntRef@@YAXAEAH@Z}} : $@convention(c) (Int32) -> ()
44+
// CHECK: apply [[REF]](%{{[0-9]+}}) : $@convention(c) (Int32) -> ()
4545

4646
func setCxxConstRef() {
4747
let val: CInt = 21
@@ -54,12 +54,12 @@ func setCxxConstRef() {
5454

5555
func setCxxRvalueRef() {
5656
var val: CInt = 21
57-
setStaticIntRvalueRef(&val)
57+
setStaticIntRvalueRef(val)
5858
}
5959

6060
// CHECK: sil hidden @$s4main15setCxxRvalueRefyyF : $@convention(thin) () -> ()
61-
// CHECK: [[REF:%.*]] = function_ref @{{_Z21setStaticIntRvalueRefOi|\?setStaticIntRvalueRef@@YAX\$\$QEAH@Z}} : $@convention(c) (@inout Int32) -> ()
62-
// CHECK: apply [[REF]](%{{[0-9]+}}) : $@convention(c) (@inout Int32) -> ()
61+
// CHECK: [[REF:%.*]] = function_ref @{{_Z21setStaticIntRvalueRefOi|\?setStaticIntRvalueRef@@YAX\$\$QEAH@Z}} : $@convention(c) (@in Int32) -> ()
62+
// CHECK: apply [[REF]](%{{[0-9]+}}) : $@convention(c) (@in Int32) -> ()
6363

6464
func setCxxConstRvalueRef() {
6565
let val: CInt = 21

test/Interop/Cxx/reference/reference.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ ReferenceTestSuite.test("write-rvalue-reference") {
4040
ReferenceTestSuite.test("pass-lvalue-reference") {
4141
expectNotEqual(21, getStaticInt())
4242
var val: CInt = 21
43-
setStaticIntRef(&val)
43+
setStaticIntRef(val)
4444
expectEqual(21, getStaticInt())
4545
}
4646

@@ -54,7 +54,7 @@ ReferenceTestSuite.test("pass-const-lvalue-reference") {
5454
ReferenceTestSuite.test("pass-rvalue-reference") {
5555
expectNotEqual(52, getStaticInt())
5656
var val: CInt = 52
57-
setStaticIntRvalueRef(&val)
57+
setStaticIntRvalueRef(val)
5858
expectEqual(52, getStaticInt())
5959
}
6060

test/Interop/Cxx/stdlib/use-std-vector.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,16 @@ StdVectorTestSuite.test("init") {
2424

2525
StdVectorTestSuite.test("push back") {
2626
var v = Vector()
27-
var _42: CInt = 42
28-
v.push_back(&_42)
27+
v.push_back(42)
2928
expectEqual(v.size(), 1)
3029
expectFalse(v.empty())
3130
expectEqual(v[0], 42)
3231
}
3332

3433
func fill(vector v: inout Vector) {
35-
var _1: CInt = 1, _2: CInt = 2, _3: CInt = 3
36-
v.push_back(&_1)
37-
v.push_back(&_2)
38-
v.push_back(&_3)
34+
v.push_back(1)
35+
v.push_back(2)
36+
v.push_back(3)
3937
}
4038

4139
// TODO: in some configurations the stdlib emits a "initializeWithCopy" where the arguments

test/Interop/Cxx/templates/dependent-types.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ DependentTypesTestSuite.test("Complex different dependent return type inferrd.")
8888
expectEqual(m.getValue(), 42)
8989
}
9090

91-
// TODO: Currently still failing: Could not cast value of type '__C.__CxxTemplateInst1MIlE' to 'Swift.Int'
9291
DependentTypesTestSuite.test("Complex different dependent argument and return type") {
9392
let m = complexDifferentDependentArgAndRet(42, T: Int.self, U: Int.self) as! Int
9493
expectEqual(m, 42)

0 commit comments

Comments
 (0)