| // RUN: %target-swift-frontend -emit-sil -primary-file %s -o /dev/null -verify |
| // |
| // REQUIRES: !(CPU=i386 || CPU=x86_64) |
| // |
| // These are tests for diagnostics produced by constant propagation pass |
| // on floating-point operations that are specific to non-x86 architectures, |
| // which do not support Float80. |
| |
| import StdlibUnittest |
| |
| func testFPToIntConversion() { |
| _blackHole(Int8(1E309)) // expected-error {{invalid conversion: '1E309' overflows 'Int8'}} |
| // expected-warning@-1 {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| |
| _blackHole(UInt8(-1E309)) // expected-error {{negative literal '-1E309' cannot be converted to 'UInt8'}} |
| // expected-warning@-1 {{'-1E309' overflows to -inf because its magnitude exceeds the limits of a float literal}} |
| |
| _blackHole(Int64(1E309)) // expected-error {{invalid conversion: '1E309' overflows 'Int64'}} |
| // expected-warning@-1 {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| |
| _blackHole(UInt64(-1E309)) // expected-error {{negative literal '-1E309' cannot be converted to 'UInt64'}} |
| // expected-warning@-1 {{'-1E309' overflows to -inf because its magnitude exceeds the limits of a float literal}} |
| } |
| |
| func testFloatConvertOverflow() { |
| let f1: Float = 1E309 // expected-warning {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(f1) |
| let f2: Float32 = -1.0E999 // expected-warning {{'-1.0E999' overflows to -inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(f2) |
| |
| let d4: Double = 1E309 // expected-warning {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(d4) |
| let d6: Float64 = -1.0E999 // expected-warning {{'-1.0E999' overflows to -inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(d6) |
| let d8: Float64 = -1.7976931348623159E+308 // expected-warning {{'-1.7976931348623159E+308' overflows to -inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(d8) |
| |
| // Warnings cannot be suppressed when a literal overflows MaxBuiltinFloatType. |
| _blackHole(Float(1E309)) // expected-warning {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| _blackHole(Double(1E309)) // expected-warning {{'1E309' overflows to inf because its magnitude exceeds the limits of a float literal}} |
| } |
| |
| func testFloatConvertUnderflow() { |
| // FIXME: False Negative: The literals that underflow MaxBuiltinFloatType |
| // are not detected. |
| let f1: Float = 1E-400 |
| _blackHole(f1) |
| let d2: Double = 1E-309 |
| _blackHole(d2) |
| let d4: Double = 5E-324 |
| _blackHole(d4) |
| |
| // All warnings are disabled during explict conversions. |
| _blackHole(Float(1E-400)) |
| _blackHole(Double(1E-309)) |
| _blackHole(Double(5E-324)) |
| } |
| |
| func testHexFloatImprecision() { |
| // FIXME: False Negative: literals that underflow MaxBuiltinFloatType are |
| // not detected. |
| let d3: Double = 0x1.0000000000001p-1023 |
| _blackHole(d3) |
| let d4: Double = 0x1.00000000000001p-1000 |
| _blackHole(d4) |
| |
| // All warnings are disabled during explict conversions. |
| _blackHole(Float(0x1.00000000000001p-127)) |
| _blackHole(Float(0x1.0000000000001p-1023)) |
| _blackHole(Double(0x1.0000000000001p-1023)) |
| _blackHole(Double(0x1.00000000000001p-1000)) |
| } |