//===--- 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 _: Range = v...v // expected-error {{cannot convert value of type 'ClosedRange' to specified type 'Range'}} let _: ClosedRange = v..' to specified type 'ClosedRange'}} } } func typeInference_Strideable(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: PartialRangeUpTo = v... // expected-error {{cannot convert value of type 'PartialRangeFrom' to specified type 'PartialRangeUpTo'}} let r4: PartialRangeUpTo = v... // expected-error {{cannot convert value of type 'PartialRangeFrom' to specified type 'PartialRangeUpTo'}} let r5: 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(ClosedRange.self, &range) } do { var range = v... expectType(PartialRangeFrom.self, &range) } do { let _: Range = v.. = v...v } do { let _: Range = v...v // expected-error {{cannot convert value of type 'ClosedRange' to specified type 'Range'}} let _: ClosedRange = v..' to specified type 'ClosedRange'}} let _: Range = v...v // expected-error {{cannot convert value of type 'ClosedRange' to specified type 'Range'}} let _: ClosedRange = v..' to specified type 'ClosedRange'}} let _: ClosedRange = v... // expected-error {{cannot convert value of type 'PartialRangeFrom' to specified type 'ClosedRange'}} } } // Check how type inference works with a few commonly used types. func typeInference_commonTypes() { // --------------------------------------------- // operator '..<' // --------------------------------------------- do { var range = 1..<10 expectType(Range.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(Range.self, &range) } do { var range = Int8(1)..<10 expectType(Range.self, &range) } do { var range = UInt8(1)..<10 expectType(Range.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(ClosedRange.self, &range) } do { var range = 1... expectType(PartialRangeFrom.self, &range) } do { var range = ...10 expectType(PartialRangeThrough.self, &range) } do { var range = UInt(1)...10 expectType(ClosedRange.self, &range) } do { var range = UInt(1)... expectType(PartialRangeFrom.self, &range) } do { var range = ...UInt(10) expectType(PartialRangeThrough.self, &range) } do { var range = Int8(1)...10 expectType(ClosedRange.self, &range) } do { var range = UInt8(1)...10 expectType(ClosedRange.self, &range) } do { var range = UInt8(1)... expectType(PartialRangeFrom.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) } }