| // RUN: %empty-directory(%t) |
| // RUN: %gyb %s -o %t/main.swift |
| // RUN: %line-directive %t/main.swift -- %target-swift-frontend -typecheck -verify -swift-version 3 %t/main.swift |
| |
| func testUnaryMinusInUnsigned() { |
| var a: UInt8 = -(1) // expected-error {{cannot convert value of type 'Int' to specified type 'UInt8'}} expected-note * {{}} expected-warning * {{}} |
| |
| var b: UInt16 = -(1) // expected-error {{cannot convert value of type 'Int' to specified type 'UInt16'}} expected-note * {{}} expected-warning * {{}} |
| |
| var c: UInt32 = -(1) // expected-error {{cannot convert value of type 'Int' to specified type 'UInt32'}} expected-note * {{}} expected-warning * {{}} |
| |
| var d: UInt64 = -(1) // expected-error {{cannot convert value of type 'Int' to specified type 'UInt64'}} expected-note * {{}} expected-warning * {{}} |
| } |
| |
| // Int and UInt are not identical to any fixed-size integer type |
| var i : Int = 0 |
| var i64 : Int64 = i // expected-error {{}} |
| var i32 : Int32 = i // expected-error {{}} |
| var i16 : Int16 = i // expected-error {{}} |
| var i8 : Int8 = i // expected-error {{}} |
| |
| var u : UInt = 0 |
| var u64 : UInt64 = u // expected-error {{}} |
| var u32 : UInt32 = u // expected-error {{}} |
| var u16 : UInt16 = u // expected-error {{}} |
| var u8 : UInt8 = u // expected-error {{}} |
| |
| func expectSameType<T>(_: T.Type, _: T.Type) {} |
| |
| func test_truncatingBitPatternAPIIsStableAcrossPlatforms() { |
| // Audit and update this test when adding new integer types. |
| expectSameType(Int64.self, IntMax.self) |
| expectSameType(UInt64.self, UIntMax.self) |
| |
| _ = UInt8(truncatingBitPattern: UInt(0)) |
| _ = UInt16(truncatingBitPattern: UInt(0)) |
| _ = UInt32(truncatingBitPattern: UInt(0)) |
| UInt64(truncatingBitPattern: UInt(0)) // expected-error {{argument labels '(truncatingBitPattern:)' do not match any available overloads}} |
| // expected-note @-1 {{overloads for 'UInt64' exist with these partially matching parameter lists}} |
| UInt(truncatingBitPattern: UInt(0)) // expected-error {{}} expected-note * {{}} |
| |
| _ = Int8(truncatingBitPattern: UInt(0)) |
| _ = Int16(truncatingBitPattern: UInt(0)) |
| _ = Int32(truncatingBitPattern: UInt(0)) |
| Int64(truncatingBitPattern: UInt(0)) // expected-error {{argument labels '(truncatingBitPattern:)' do not match any available overloads}} |
| // expected-note @-1 {{overloads for 'Int64' exist with}} |
| Int(truncatingBitPattern: UInt(0)) // expected-error {{}} expected-note * {{}} |
| |
| _ = UInt8(truncatingBitPattern: Int(0)) |
| _ = UInt16(truncatingBitPattern: Int(0)) |
| _ = UInt32(truncatingBitPattern: Int(0)) |
| UInt64(truncatingBitPattern: Int(0)) // expected-error {{argument labels '(truncatingBitPattern:)' do not match any available overloads}} |
| // expected-note @-1 {{overloads for 'UInt64' exist with these partially matching parameter lists}} |
| UInt(truncatingBitPattern: Int(0)) // expected-error {{}} expected-note * {{}} |
| |
| _ = Int8(truncatingBitPattern: Int(0)) |
| _ = Int16(truncatingBitPattern: Int(0)) |
| _ = Int32(truncatingBitPattern: Int(0)) |
| Int64(truncatingBitPattern: Int(0)) // expected-error {{}} expected-note * {{}} |
| Int(truncatingBitPattern: Int(0)) // expected-error {{}} expected-note * {{}} |
| |
| UInt(truncatingBitPattern: UInt8(0)) // expected-error {{}} expected-note * {{}} |
| UInt(truncatingBitPattern: UInt16(0)) // expected-error {{}} expected-note * {{}} |
| UInt(truncatingBitPattern: UInt32(0)) // expected-error {{}} expected-note * {{}} |
| _ = UInt(truncatingBitPattern: UInt64(0)) |
| |
| Int(truncatingBitPattern: UInt8(0)) // expected-error {{}} expected-note * {{}} |
| Int(truncatingBitPattern: UInt16(0)) // expected-error {{}} expected-note * {{}} |
| Int(truncatingBitPattern: UInt32(0)) // expected-error {{}} expected-note * {{}} |
| _ = Int(truncatingBitPattern: UInt64(0)) |
| |
| UInt(truncatingBitPattern: Int8(0)) // expected-error {{}} expected-note * {{}} |
| UInt(truncatingBitPattern: Int16(0)) // expected-error {{}} expected-note * {{}} |
| UInt(truncatingBitPattern: Int32(0)) // expected-error {{}} expected-note * {{}} |
| _ = UInt(truncatingBitPattern: Int64(0)) |
| |
| Int(truncatingBitPattern: Int8(0)) // expected-error {{}} expected-note * {{}} |
| Int(truncatingBitPattern: Int16(0)) // expected-error {{}} expected-note * {{}} |
| Int(truncatingBitPattern: Int32(0)) // expected-error {{}} expected-note * {{}} |
| _ = Int(truncatingBitPattern: Int64(0)) |
| } |
| |
| func testMixedSignArithmetic() { |
| // Ensure that the generic arithmetic operators for Strideable don't |
| // allow mixed-sign arithmetic to compile. We create a deliberate |
| // ambiguity in these cases. |
| % for T in "UInt UInt64 UInt32 UInt16 UInt8".split(): |
| do { |
| typealias Stride = ${T}.Stride |
| _ = ${T}(1) + 0 // OK |
| _ = 0 + ${T}(1) // OK |
| _ = ${T}(1) + Stride(0) // expected-warning {{}} // mixed-type arithmetics |
| _ = Stride(1) + ${T}(0) // expected-warning {{}} // mixed-type arithmetics |
| _ = ${T}(1) - Stride(0) // expected-warning {{}} // mixed-type arithmetics |
| var x: ${T} = 0 |
| x += 1 // OK |
| x += Stride(1) // expected-warning {{}} // mixed-type arithmetics |
| x -= Stride(1) // expected-warning {{}} // mixed-type arithmetics |
| |
| _ = (x - x) as Stride // expected-warning {{}} // ambiguous use of operator '-' |
| |
| //===------------------------------------------------------------------===// |
| // The following errors are different because they're not being |
| // disabled by the ambiguity trick. |
| //===------------------------------------------------------------------===// |
| |
| (x + x) as Stride // expected-error {{cannot convert value of type '${T}' to type 'Stride' (aka 'Int') in coercion}} |
| Stride(1) - ${T}(0) // expected-error {{}} expected-note {{}} |
| |
| // These tests are expected to start failing when we get improved diagnostics. |
| var y: Stride = 0 |
| y += ${T}(1) // expected-error {{}} expected-note {{}} |
| y -= ${T}(1) // expected-error {{}} expected-note {{}} |
| } |
| % end |
| } |
| |
| func testOps<T : FixedWidthInteger>(_ x: T, _ y: T) -> T { |
| let a = x + y |
| let s = x - y |
| let m = x * y |
| let d = x / y |
| let r = x % y |
| return a + s + m + d + r |
| } |
| |
| let s_ops: Int = testOps(5, 2) |
| let u_ops: UInt = testOps(5, 2) |
| let s8_ops: Int8 = testOps(5, 2) |
| let u8_ops: UInt8 = testOps(5, 2) |
| let s16_ops: Int16 = testOps(5, 2) |
| let u16_ops: UInt16 = testOps(5, 2) |
| let s32_ops: Int32 = testOps(5, 2) |
| let u32_ops: UInt32 = testOps(5, 2) |
| let s64_ops: Int64 = testOps(5, 2) |
| let u64_ops: UInt64 = testOps(5, 2) |
| |