Skip to content

Commit 3b06d87

Browse files
authored
Merge pull request swiftlang#83179 from xedin/rdar-128109889
[ASTVerifier] Allow `inout` and `Array` to pointer conversion in vari…
2 parents d7bdbcb + 27c8e27 commit 3b06d87

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

lib/AST/ASTVerifier.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,18 @@ class Verifier : public ASTWalker {
18971897
continue;
18981898
}
18991899

1900+
// If the argument is a concrete variadic expansion, let's check its
1901+
// every element.
1902+
if (auto *variadicExpansion = dyn_cast<VarargExpansionExpr>(subExpr)) {
1903+
if (auto *implicitArray =
1904+
dyn_cast<ArrayExpr>(variadicExpansion->getSubExpr())) {
1905+
for (auto *element : implicitArray->getElements()) {
1906+
maybeRecordValidPointerConversionForArg(element);
1907+
}
1908+
return;
1909+
}
1910+
}
1911+
19001912
break;
19011913
}
19021914

test/SILGen/pointer_conversion.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,21 @@ public struct RefObj {
481481
public func objectFieldToPointer(rc: RefObj) {
482482
takeObjectPointer(&rc.o.object)
483483
}
484+
485+
// CHECK-LABEL: sil [ossa] @$s18pointer_conversion21testVariadicParameter1aySaySiGz_tF : $@convention(thin) (@inout Array<Int>) -> ()
486+
// CHECK: [[ARRAY_REF:%.*]] = begin_access [modify] [unknown] %0 : $*Array<Int>
487+
// CHECK: [[CONVERT_ARRAY_TO_POINTER:%.*]] = function_ref @$ss37_convertMutableArrayToPointerArgumentyyXlSg_q_tSayxGzs01_E0R_r0_lF
488+
// CHECK: apply [[CONVERT_ARRAY_TO_POINTER]]<Int, UnsafeMutableRawPointer>({{.*}}, [[ARRAY_REF]])
489+
// CHECK: [[V_REF:%.*]] = begin_access [modify] [unknown] %28 : $*Double
490+
// CHECK: [[DOUBLE_AS_PTR:%.*]] = address_to_pointer [stack_protection] [[V_REF]] : $*Double to $Builtin.RawPointer
491+
// CHECK: [[INOUT_TO_PTR:%.*]] = function_ref @$ss30_convertInOutToPointerArgumentyxBps01_E0RzlF
492+
// CHECK: apply [[INOUT_TO_PTR]]<UnsafeMutableRawPointer>(%39, [[DOUBLE_AS_PTR]])
493+
// CHECK: } // end sil function '$s18pointer_conversion21testVariadicParameter1aySaySiGz_tF'
494+
public func testVariadicParameter(a: inout [Int]) {
495+
func test(_ : UnsafeMutableRawPointer?...) {}
496+
497+
test(&a)
498+
499+
var v: Double
500+
test(&v)
501+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
// https://github.com/apple/swift/issues/73454
4+
5+
func object_method_bind_ptrcall_v(
6+
_: UnsafeMutableRawPointer?...
7+
) {
8+
}
9+
10+
func setDensity(_ density: Double, ptr: UnsafeMutableRawPointer) {
11+
var copy_density = density
12+
var arr: [Int] = []
13+
14+
object_method_bind_ptrcall_v(&copy_density)
15+
object_method_bind_ptrcall_v(&arr)
16+
17+
object_method_bind_ptrcall_v(&arr, &copy_density)
18+
19+
object_method_bind_ptrcall_v(ptr, &copy_density, &arr)
20+
object_method_bind_ptrcall_v(&copy_density, ptr, &arr)
21+
}

validation-test/compiler_crashers_2/2ae771dc466f1acc.swift renamed to validation-test/compiler_crashers_2_fixed/2ae771dc466f1acc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// {"kind":"typecheck","original":"f0cca09d","signature":"swift::ASTWalker::PostWalkResult<swift::ArrayToPointerExpr*> (anonymous namespace)::Verifier::dispatchVisitPost<swift::ArrayToPointerExpr*>(swift::ArrayToPointerExpr*)"}
2-
// RUN: not --crash %target-swift-frontend -typecheck %s
2+
// RUN: %target-typecheck-verify-swift
33
struct a {
44
var b: String
55
}

0 commit comments

Comments
 (0)