mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
%utils => ${SWIFT_SOURCE_DIR}/utils
%line-directive => ${SWIFT_SOURCE_DIR}/utils/line-directive
117 lines
3.1 KiB
Plaintext
117 lines
3.1 KiB
Plaintext
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: %gyb %s -o %t/FloatingPointConversionTraps.swift
|
|
// RUN: %line-directive %t/FloatingPointConversionTraps.swift -- %target-build-swift %t/FloatingPointConversionTraps.swift -Xfrontend -disable-access-control -o %t/a.out_Debug
|
|
// RUN: %line-directive %t/FloatingPointConversionTraps.swift -- %target-build-swift %t/FloatingPointConversionTraps.swift -Xfrontend -disable-access-control -o %t/a.out_Release -O
|
|
//
|
|
// RUN: %line-directive %t/FloatingPointConversionTraps.swift -- %target-run %t/a.out_Debug
|
|
// RUN: %line-directive %t/FloatingPointConversionTraps.swift -- %target-run %t/a.out_Release
|
|
// REQUIRES: executable_test
|
|
|
|
import StdlibUnittest
|
|
|
|
|
|
%{
|
|
|
|
from SwiftIntTypes import all_integer_types
|
|
|
|
# Test cases are written in a way that they don't depend on the word size.
|
|
word_bits = 4
|
|
|
|
}%
|
|
|
|
func getInfiniteOrNaNMessage(_ floatType: String) -> String {
|
|
if _isDebugAssertConfiguration() {
|
|
return "either infinite or NaN"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func getTooSmallMessage() -> String {
|
|
if _isDebugAssertConfiguration() {
|
|
return "would be less than"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func getTooLargeMessage() -> String {
|
|
if _isDebugAssertConfiguration() {
|
|
return "would be greater than"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
var FloatingPointConversion = TestSuite("FloatingPointConversion")
|
|
|
|
% for FloatSelf in ['Float32', 'Float64', 'Float80']:
|
|
% for int_ty in all_integer_types(word_bits):
|
|
% IntSelf = int_ty.stdlib_name
|
|
|
|
% if FloatSelf == 'Float80':
|
|
#if arch(i386) || arch(x86_64)
|
|
% end
|
|
|
|
FloatingPointConversion.test("${FloatSelf}/${IntSelf}/+inf")
|
|
.crashOutputMatches(getInfiniteOrNaNMessage("${FloatSelf}")).code {
|
|
do {
|
|
var a = get${IntSelf}(${IntSelf}(get${FloatSelf}(0.0)))
|
|
expectEqual(0, a)
|
|
}
|
|
do {
|
|
var a = get${IntSelf}(${IntSelf}(get${FloatSelf}(123.0)))
|
|
expectEqual(123, a)
|
|
}
|
|
|
|
expectCrashLater()
|
|
get${IntSelf}(${IntSelf}(get${FloatSelf}(+${FloatSelf}.infinity)))
|
|
}
|
|
|
|
% if int_ty.is_signed:
|
|
|
|
FloatingPointConversion.test("${FloatSelf}/${IntSelf}/-inf")
|
|
.crashOutputMatches(getInfiniteOrNaNMessage("${FloatSelf}")).code {
|
|
do {
|
|
var a = get${IntSelf}(${IntSelf}(get${FloatSelf}(-0.0)))
|
|
expectEqual(0, a)
|
|
}
|
|
do {
|
|
var a = get${IntSelf}(${IntSelf}(get${FloatSelf}(-123.0)))
|
|
expectEqual(-123, a)
|
|
}
|
|
|
|
expectCrashLater()
|
|
get${IntSelf}(${IntSelf}(get${FloatSelf}(-${FloatSelf}.infinity)))
|
|
}
|
|
|
|
% else:
|
|
|
|
FloatingPointConversion.test("${FloatSelf}/${IntSelf}/negative")
|
|
.crashOutputMatches(getTooSmallMessage()).code {
|
|
expectCrashLater()
|
|
get${IntSelf}(${IntSelf}(get${FloatSelf}(-123.0)))
|
|
}
|
|
|
|
FloatingPointConversion.test("${FloatSelf}/${IntSelf}/-inf")
|
|
.crashOutputMatches(getInfiniteOrNaNMessage("${FloatSelf}")).code {
|
|
expectCrashLater()
|
|
get${IntSelf}(${IntSelf}(get${FloatSelf}(-${FloatSelf}.infinity)))
|
|
}
|
|
|
|
% end
|
|
|
|
FloatingPointConversion.test("${FloatSelf}/${IntSelf}/NaN")
|
|
.crashOutputMatches(getInfiniteOrNaNMessage("${FloatSelf}")).code {
|
|
expectCrashLater()
|
|
get${IntSelf}(${IntSelf}(get${FloatSelf}(${FloatSelf}.nan)))
|
|
}
|
|
|
|
% if FloatSelf == 'Float80':
|
|
#endif
|
|
% end
|
|
|
|
% end
|
|
% end
|
|
|
|
runAllTests()
|
|
|