Skip to content

Commit b5aa817

Browse files
committed
[ASTVerifier] Allow inout and Array to pointer conversion in variadic parameter positions
Fixes a verifier crash that prevented use of valid conversions. Resolves: swiftlang#73454 Resolves: rdar://128109889
1 parent 2e8f74f commit b5aa817

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-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

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)