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