Skip to content

Commit 94287a6

Browse files
committed
Test UnsafeRawPointer load of ~Escapable
1 parent 2d2a181 commit 94287a6

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

stdlib/public/core/UnsafeRawPointer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ extension UnsafeRawPointer {
442442
/// `offset`. The returned instance is memory-managed and unassociated
443443
/// with the value in the memory referenced by this pointer.
444444
@inlinable
445+
@_preInverseGenerics
445446
@lifetime(borrow self)
446447
public func load<T: ~Escapable>(
447448
fromByteOffset offset: Int = 0,
@@ -489,6 +490,7 @@ extension UnsafeRawPointer {
489490
/// with the value in the range of memory referenced by this pointer.
490491
@inlinable
491492
@_alwaysEmitIntoClient
493+
@_preInverseGenerics
492494
@lifetime(borrow self)
493495
public func loadUnaligned<T: BitwiseCopyable & ~Escapable>(
494496
fromByteOffset offset: Int = 0,
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: %target-swift-frontend -primary-file %s -parse-as-library -emit-sil \
2+
// RUN: -o /dev/null \
3+
// RUN: -verify \
4+
// RUN: -sil-verify-all \
5+
// RUN: -module-name test \
6+
// RUN: -define-availability "Span 0.1:macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999" \
7+
// RUN: -strict-memory-safety \
8+
// RUN: -enable-experimental-feature Lifetimes
9+
10+
// REQUIRES: swift_in_compiler
11+
// REQUIRES: swift_feature_Lifetimes
12+
13+
@safe
14+
@_silgen_name("getRawPointer")
15+
func getRawPointer() -> UnsafeRawPointer
16+
17+
@safe
18+
@_silgen_name("getMutRawPointer")
19+
func getMutRawPointer() -> UnsafeMutableRawPointer
20+
21+
func useSpan(_: RawSpan) {}
22+
23+
//===----------------------------------------------------------------------===//
24+
// raw pointer .load()
25+
//===----------------------------------------------------------------------===//
26+
27+
@available(Span 0.1, *)
28+
@_lifetime(immortal)
29+
func badLoad() -> RawSpan {
30+
let p = getRawPointer()
31+
return unsafe p.load(as: RawSpan.self) // expected-error{{lifetime-dependent value escapes its scope}}
32+
// expected-note@-2{{it depends on the lifetime of variable 'p'}}
33+
// expected-note@-2{{this use causes the lifetime-dependent value to escape}}
34+
}
35+
36+
@available(Span 0.1, *)
37+
@_lifetime(borrow p)
38+
func goodLoad(p: UnsafeRawPointer) -> RawSpan {
39+
unsafe useSpan(p.load(as: RawSpan.self))
40+
return unsafe p.load(as: RawSpan.self)
41+
}
42+
43+
//===----------------------------------------------------------------------===//
44+
// raw pointer .loadUnaligned()
45+
//
46+
// TODO: test non-BitwiseCopyable loadUnaligned
47+
//===----------------------------------------------------------------------===//
48+
49+
@available(Span 0.1, *)
50+
@_lifetime(immortal)
51+
func badBitwiseLoadUnaligned() -> RawSpan {
52+
let p = getRawPointer()
53+
return unsafe p.loadUnaligned(as: RawSpan.self) // expected-error{{lifetime-dependent value escapes its scope}}
54+
// expected-note@-2{{it depends on the lifetime of variable 'p'}}
55+
// expected-note@-2{{this use causes the lifetime-dependent value to escape}}
56+
}
57+
58+
@available(Span 0.1, *)
59+
@_lifetime(borrow p)
60+
func goodBitwiseLoadUnaligned(p: UnsafeRawPointer) -> RawSpan {
61+
unsafe useSpan(p.loadUnaligned(as: RawSpan.self))
62+
return unsafe p.loadUnaligned(as: RawSpan.self)
63+
}
64+
65+
/* TODO: support loadUnaligned<T: ~BitwiseCopyable>
66+
@_lifetime(immortal)
67+
func badGenericLoadUnaligned<T: ~Escapable>(p: UnsafeRawPointer, _: T.Type) -> T {
68+
let p = getRawPointer()
69+
return unsafe p.loadUnaligned(as: T.self) // ERROR
70+
}
71+
72+
@_lifetime(borrow p)
73+
func goodGenericLoadUnaligned<T: ~Escapable>(p: UnsafeRawPointer, _: T.Type) -> T {
74+
return unsafe p.loadUnaligned(as: T.self) // OK
75+
}
76+
*/

0 commit comments

Comments
 (0)