blob: c60d008c3bb799cc2058b473e917d17b428cc417 [file] [log] [blame]
// 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()