swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.58k stars 10.35k forks source link

failed to produce diagnostic for ... a range expression #72533

Open shin-ckane opened 7 months ago

shin-ckane commented 7 months ago

Description

% swift coord.swift 
coord.swift:8:9: error: failed to produce diagnostic for expression; please submit a bug report (https://swift.org/contributing/#reporting-bugs)
        for b in Int(minB) ..< ValueType.max {
        ^

when the left-hand side of the range operator was changed from 0 to Int(minB).

Reproduction

struct Coord {

    private typealias ValueType = Int16

    init<T>(clamping value: T) where T : BinaryInteger {
        let minB = (Double(value - T(ValueType.max)) / 3.0).rounded(.down)
        for b in Int(minB) ..< ValueType.max {

        }
        fatalError("TODO")
    }

}

Stack dump

none

Expected behavior

The rhs to the range operator is of type Int16. If that is changed to Int(ValueType.max), to match the type of the lhs, problem goes away. Is "failed to produce diagnostic" the best diagnostic the compiler can produce to explain what is wrong with the source code?

Environment

% swift -version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) Target: arm64-apple-macosx14.0

Additional information

No response

AnthonyLatsis commented 7 months ago

Reduction:

func test() {
  let int: Int
  let int16: Int16
  // error: type of expression is ambiguous without a type annotation
  _ = Int(int) ..< int16
  // Expected error:
  // error: conflicting arguments to generic parameter 'Self' ('Int' vs. 'Int16') [conflicting_arguments_for_generic_parameter]
  _ = int ..< int16
}
Androp0v commented 2 months ago

Can I get this assigned? 👀