//===--- RangeDiagnostics.swift -------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // RUN: %target-typecheck-verify-swift import StdlibUnittest func typeInference_Comparable(v: C) { do { var range = v...self, &range) } do { var range = v...v expectType(ClosedRange.self, &range) } do { var range = v... expectType(PartialRangeFrom.self, &range) } do { var range = ...self, &range) } do { var range = ...v expectType(PartialRangeThrough.self, &range) } do { let r1: Range = v...v // expected-error {{cannot convert value of type 'ClosedRange' to specified type 'Range'}} let r2: ClosedRange = v..' to specified type 'ClosedRange'}} let r3: CountableRange = v.. = v...v // expected-error {{type 'C' does not conform to protocol 'Strideable'}} let r5: CountableRange = v...v // expected-error {{type 'C' does not conform to protocol 'Strideable'}} let r6: CountableClosedRange = v..(v: S) { do { var range = v...self, &range) } do { var range = v...v expectType(ClosedRange.self, &range) } do { let r1: Range = v...v // expected-error {{cannot convert value of type 'ClosedRange' to specified type 'Range'}} let r2: ClosedRange = v..' to specified type 'ClosedRange'}} let r3: CountableRange = v.. = v...v // expected-error {{type 'S.Stride' does not conform to protocol 'SignedInteger'}} let r5: CountableRange = v...v // expected-error {{type 'S.Stride' does not conform to protocol 'SignedInteger'}} let r6: CountableClosedRange = v.. = v... // expected-error {{cannot convert value of type 'PartialRangeFrom' to specified type 'PartialRangeUpTo'}} let r8: PartialRangeUpTo = v... // expected-error {{cannot convert value of type 'PartialRangeFrom' to specified type 'PartialRangeUpTo'}} let r9: Range = v..< // expected-error {{'..<' is not a postfix unary operator}} } } func typeInference_StrideableWithSignedIntegerStride(v: S) where S.Stride : SignedInteger { do { var range = v...self, &range) } do { var range = v...v expectType(CountableClosedRange.self, &range) } do { var range = v... expectType(CountablePartialRangeFrom.self, &range) } do { let _: Range = v.. = v...v } do { let _: Range = v...v // expected-error {{cannot convert value of type 'CountableClosedRange' to specified type 'Range'}} let _: ClosedRange = v..' to specified type 'ClosedRange'}} let _: CountableRange = v...v // expected-error {{cannot convert value of type 'CountableClosedRange' to specified type 'CountableRange'}} let _: CountableClosedRange = v..' to specified type 'CountableClosedRange'}} let _: CountableClosedRange = v... // expected-error {{cannot convert value of type 'CountablePartialRangeFrom' to specified type 'CountableClosedRange'}} } } // Check how type inference works with a few commonly used types. func typeInference_commonTypes() { // --------------------------------------------- // operator '..<' // --------------------------------------------- do { var range = 1..<10 expectType(CountableRange.self, &range) } do { var range = 1..< // expected-error {{'..<' is not a postfix unary operator}} } do { var range = ..<10 expectType(PartialRangeUpTo.self, &range) } do { var range = ...self, &range) } do { var range = UInt(1)..<10 expectType(CountableRange.self, &range) } do { var range = Int8(1)..<10 expectType(CountableRange.self, &range) } do { var range = UInt8(1)..<10 expectType(CountableRange.self, &range) } do { var range = 1.0..<10.0 expectType(Range.self, &range) } do { var range = ..<10.0 expectType(PartialRangeUpTo.self, &range) } do { var range = Float(1.0)..<10.0 expectType(Range.self, &range) } do { var range = "a"..<"z" expectType(Range.self, &range) } do { var range = ..<"z" expectType(PartialRangeUpTo.self, &range) } do { var range = Character("a")..<"z" expectType(Range.self, &range) } do { var range = UnicodeScalar("a")..<"z" expectType(Range.self, &range) } do { let s = "" var range = s.startIndex...self, &range) } // --------------------------------------------- // operator '...' // --------------------------------------------- do { var range = 1...10 expectType(CountableClosedRange.self, &range) } do { var range = 1... expectType(CountablePartialRangeFrom.self, &range) } do { var range = ...10 expectType(PartialRangeThrough.self, &range) } do { var range = UInt(1)...10 expectType(CountableClosedRange.self, &range) } do { var range = UInt(1)... expectType(CountablePartialRangeFrom.self, &range) } do { var range = ...UInt(10) expectType(PartialRangeThrough.self, &range) } do { var range = Int8(1)...10 expectType(CountableClosedRange.self, &range) } do { var range = UInt8(1)...10 expectType(CountableClosedRange.self, &range) } do { var range = UInt8(1)... expectType(CountablePartialRangeFrom.self, &range) } do { var range = 1.0...10.0 expectType(ClosedRange.self, &range) } do { var range = 1.0... expectType(PartialRangeFrom.self, &range) } do { var range = ...10.0 expectType(PartialRangeThrough.self, &range) } do { var range = Float(1.0)...10.0 expectType(ClosedRange.self, &range) } do { var range = "a"..."z" expectType(ClosedRange.self, &range) } do { var range = "a"... expectType(PartialRangeFrom.self, &range) } do { var range = "a"... expectType(PartialRangeFrom.self, &range) } do { var range = Character("a")..."z" expectType(ClosedRange.self, &range) } do { var range = UnicodeScalar("a")..."z" expectType(ClosedRange.self, &range) } do { let s = "" var range = s.startIndex...s.endIndex expectType(ClosedRange.self, &range) } do { let s = "" var range = s.startIndex... expectType(PartialRangeFrom.self, &range) } do { let s = "" var range = ...s.endIndex expectType(PartialRangeThrough.self, &range) } } func disallowSubscriptingOnIntegers() { // FIXME: swift-3-indexing-model: decide what to do with the following QoI. // The previous implementation was imposing an ABI burden. // The point of this test is to check that we don't allow indexing // Range et al with Int outside a generic context, to prevent the // problem that r[0] will be invalid when 0 is not contained int he // range. // Many of these error messages are terrible. If the test starts // failing because the error message improves, obviously, update the // test! do { var r0 = 10..<100 var r1 = UInt(10)..<100 var r2 = 10...100 var r3 = UInt(10)...100 expectType(CountableRange.self, &r0) expectType(CountableRange.self, &r1) expectType(CountableClosedRange.self, &r2) expectType(CountableClosedRange.self, &r3) r0[0] // expected-error {{ambiguous use of 'subscript'}} r1[0] // expected-error {{ambiguous use of 'subscript'}} r2[0] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'Int'}} // expected-note@-1 {{overloads for 'subscript'}} r3[0] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'Int'}} // expected-note@-1 {{overloads for 'subscript'}} r0[UInt(0)] // expected-error {{cannot subscript a value of type 'CountableRange' with an index of type 'UInt'}} r1[UInt(0)] // expected-error {{ambiguous use of 'subscript'}} r2[UInt(0)] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'UInt'}} // expected-note@-1 {{overloads for 'subscript' exist}} r3[UInt(0)] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'UInt'}} // expected-note@-1 {{overloads for 'subscript' exist}} r0[0..<4] // expected-error {{ambiguous use of 'subscript'}} r1[0..<4] // expected-error {{ambiguous use of 'subscript'}} r2[0..<4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r3[0..<4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} (10..<100)[0] // expected-error {{ambiguous use of 'subscript'}} (UInt(10)...100)[0..<4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r0[0...4] // expected-error {{ambiguous use of 'subscript'}} r1[0...4] // expected-error {{ambiguous use of 'subscript'}} r2[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r3[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} (10...100)[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} (UInt(10)...100)[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r0[r0] // expected-error {{ambiguous use of 'subscript'}} r0[r1] // expected-error {{ambiguous subscript with base type 'CountableRange' and index type 'CountableRange'}} r0[r2] // expected-error {{ambiguous use of 'subscript'}} r0[r3] // expected-error {{ambiguous subscript with base type 'CountableRange' and index type 'CountableClosedRange'}} r1[r0] // expected-error {{ambiguous subscript with base type 'CountableRange' and index type 'CountableRange'}} r1[r1] // expected-error {{ambiguous use of 'subscript'}} r1[r2] // expected-error {{ambiguous subscript with base type 'CountableRange' and index type 'CountableClosedRange'}} r1[r3] // expected-error {{ambiguous use of 'subscript'}} r2[r0] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r2[r1] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r2[r2] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r2[r3] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r3[r0] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r3[r1] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r3[r2] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r3[r3] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} } do { let r0: Range = 10..<100 let r1: Range = UInt(10)..<100 let r2: ClosedRange = 10...100 let r3: ClosedRange = UInt(10)...100 r0[0] // expected-error {{type 'Range' has no subscript members}} r1[0] // expected-error {{type 'Range' has no subscript members}} r2[0] // expected-error {{type 'ClosedRange' has no subscript members}} r3[0] // expected-error {{type 'ClosedRange' has no subscript members}} r0[UInt(0)] // expected-error {{type 'Range' has no subscript members}} r1[UInt(0)] // expected-error {{type 'Range' has no subscript members}} r2[UInt(0)] // expected-error {{type 'ClosedRange' has no subscript members}} r3[UInt(0)] // expected-error {{type 'ClosedRange' has no subscript members}} r0[0..<4] // expected-error {{type 'Range' has no subscript members}} r1[0..<4] // expected-error {{type 'Range' has no subscript members}} r2[0..<4] // expected-error {{type 'ClosedRange' has no subscript members}} r3[0..<4] // expected-error {{type 'ClosedRange' has no subscript members}} (10..<100)[0] // expected-error {{ambiguous use of 'subscript'}} (UInt(10)...100)[0..<4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableRange'}} r0[0...4] // expected-error {{type 'Range' has no subscript members}} r1[0...4] // expected-error {{type 'Range' has no subscript members}} r2[0...4] // expected-error {{type 'ClosedRange' has no subscript members}} r3[0...4] // expected-error {{type 'ClosedRange' has no subscript members}} (10...100)[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} (UInt(10)...100)[0...4] // expected-error {{cannot subscript a value of type 'CountableClosedRange' with an index of type 'CountableClosedRange'}} r0[r0] // expected-error {{type 'Range' has no subscript members}} r0[r1] // expected-error {{type 'Range' has no subscript members}} r0[r2] // expected-error {{type 'Range' has no subscript members}} r0[r3] // expected-error {{type 'Range' has no subscript members}} r1[r0] // expected-error {{type 'Range' has no subscript members}} r1[r1] // expected-error {{type 'Range' has no subscript members}} r1[r2] // expected-error {{type 'Range' has no subscript members}} r1[r3] // expected-error {{type 'Range' has no subscript members}} r2[r0] // expected-error {{type 'ClosedRange' has no subscript members}} r2[r1] // expected-error {{type 'ClosedRange' has no subscript members}} r2[r2] // expected-error {{type 'ClosedRange' has no subscript members}} r2[r3] // expected-error {{type 'ClosedRange' has no subscript members}} r3[r0] // expected-error {{type 'ClosedRange' has no subscript members}} r3[r1] // expected-error {{type 'ClosedRange' has no subscript members}} r3[r2] // expected-error {{type 'ClosedRange' has no subscript members}} r3[r3] // expected-error {{type 'ClosedRange' has no subscript members}} } }