Files
swift-mirror/test/SILOptimizer/lifetime_dependence/rawpointer_span.swift
Erik Eckstein 3243f87204 tests: remove the lit feature swift_in_compiler
Tests require the compiler built with SwiftCompilerSources since a long time.
So this lit feature was redundant anyway. We can remove it.
2026-06-30 14:47:56 +02:00

93 lines
3.0 KiB
Swift

// RUN: %target-swift-frontend -primary-file %s -parse-as-library -emit-sil \
// RUN: -o /dev/null \
// RUN: -verify \
// RUN: -sil-verify-all \
// RUN: -module-name test \
// RUN: -define-availability "Span 0.1:macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999" \
// RUN: -strict-memory-safety \
// RUN: -enable-experimental-feature Lifetimes
// REQUIRES: swift_feature_Lifetimes
@safe
@_silgen_name("getRawPointer")
func getRawPointer() -> UnsafeRawPointer
@safe
@_silgen_name("getMutRawPointer")
func getMutRawPointer() -> UnsafeMutableRawPointer
func useSpan(_: RawSpan) {}
//===----------------------------------------------------------------------===//
// raw pointer .load()
//===----------------------------------------------------------------------===//
@available(Span 0.1, *)
@_lifetime(immortal)
func badLoad() -> RawSpan {
let p = getRawPointer()
return unsafe p.load(as: RawSpan.self) // expected-error{{lifetime-dependent value escapes its scope}}
// expected-note@-2{{it depends on the lifetime of variable 'p'}}
// expected-note@-2{{this use causes the lifetime-dependent value to escape}}
}
@available(Span 0.1, *)
@_lifetime(borrow p)
func goodLoad(p: UnsafeRawPointer) -> RawSpan {
unsafe useSpan(p.load(as: RawSpan.self))
return unsafe p.load(as: RawSpan.self)
}
//===----------------------------------------------------------------------===//
// raw pointer .loadUnaligned()
//
// TODO: test non-BitwiseCopyable loadUnaligned
//===----------------------------------------------------------------------===//
@available(Span 0.1, *)
@_lifetime(immortal)
func badBitwiseLoadUnaligned() -> RawSpan {
let p = getRawPointer()
return unsafe p.loadUnaligned(as: RawSpan.self) // expected-error{{lifetime-dependent value escapes its scope}}
// expected-note@-2{{it depends on the lifetime of variable 'p'}}
// expected-note@-2{{this use causes the lifetime-dependent value to escape}}
}
@available(Span 0.1, *)
@_lifetime(borrow p)
func goodBitwiseLoadUnaligned(p: UnsafeRawPointer) -> RawSpan {
unsafe useSpan(p.loadUnaligned(as: RawSpan.self))
return unsafe p.loadUnaligned(as: RawSpan.self)
}
/* TODO: support loadUnaligned<T: ~BitwiseCopyable>
@_lifetime(immortal)
func badGenericLoadUnaligned<T: ~Escapable>(p: UnsafeRawPointer, _: T.Type) -> T {
let p = getRawPointer()
return unsafe p.loadUnaligned(as: T.self) // ERROR
}
@_lifetime(borrow p)
func goodGenericLoadUnaligned<T: ~Escapable>(p: UnsafeRawPointer, _: T.Type) -> T {
return unsafe p.loadUnaligned(as: T.self) // OK
}
*/
//===----------------------------------------------------------------------===//
// raw pointer .storeBytes()
//===----------------------------------------------------------------------===//
@available(Span 0.1, *)
func storeSpan(span: RawSpan) {
let p = getMutRawPointer()
unsafe p.storeBytes(of: span, as: RawSpan.self)
}
/* TODO: support storeBytes<T: ~BitwiseCopyable>
func storeGeneric<T: ~Escapable>(value: T) {
let p = getMutRawPointer()
unsafe p.storeBytes(of: value, as: T.self)
}
*/