mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
as a failure to convert the individual operand, since the operator is likely conceptually generic in some way and the choice of any specific overload is probably arbitrary. Since we now fall back to a better-informed diagnostics point, take advantage of this to generate a specialized diagnostic when trying to compare values of function type with ===. Fixes rdar://25666129. This reverts commit073f427942, i.e. it reapplies35ba809fd0with a test fix to expect an extra note in one place.
137 lines
6.0 KiB
Plaintext
137 lines
6.0 KiB
Plaintext
// RUN: rm -rf %t && mkdir -p %t && %S/../../utils/gyb %s -o %t/main.swift
|
|
// RUN: %S/../../utils/line-directive %t/main.swift -- %target-swift-frontend -parse -verify %t/main.swift
|
|
|
|
func testUnaryMinusInUnsigned() {
|
|
var a: UInt8 = -(1) // expected-error {{}} expected-note * {{}}
|
|
|
|
var b: UInt16 = -(1) // expected-error {{}} expected-note * {{}}
|
|
|
|
var c: UInt32 = -(1) // expected-error {{}} expected-note * {{}}
|
|
|
|
var d: UInt64 = -(1) // expected-error {{}} expected-note * {{}}
|
|
}
|
|
|
|
// 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-error {{}} // ambiguous use of operator '+'
|
|
Stride(1) + ${T}(0) // expected-error {{}} // ambiguous use of operator '+'
|
|
${T}(1) - Stride(0) // expected-error {{}} // ambiguous use of operator '-'
|
|
var x: ${T} = 0
|
|
x += 1 // OK
|
|
x += Stride(1) // expected-error {{}} // ambiguous use of operator '+='
|
|
x -= Stride(1) // expected-error {{}} // ambiguous use of operator '-='
|
|
|
|
(x - x) as Stride // expected-error {{}} // 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 {{}} expected-note {{}} // not convertible to 'Stride'
|
|
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 : IntegerArithmetic>(_ 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)
|
|
|