[SR-774] Array of Range can cause an infinite loop while compiling Created: 19 Feb 2016  Updated: 29 Apr 2016

Status: Open
Project: Swift
Component/s: Compiler

Type: Bug Priority: Medium
Reporter: Alex Manzella Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: TypeChecker

OSX 10.11.3 (15D21), (Swift master/f560f3caac06723, llvm stable/0d07a5d3d55078) also tested with Xcode 7.2.1


I experienced an infinite loop in the compiler while working with `Range`s. I tried to checkout the current version (Swift master/f560f3caac06723, llvm stable/0d07a5d3d55078) and tried to understand more about it.

Disclaimer: It's the first time I try to go deeper in this land, I'm just trying to be a bit more helpful than just reporting the bug but I might be completely wrong

Looks like the infinite loop happens at `CSSolver.cpp:1310`and `CSSolver.cpp:1739` where `ConstraintSystem::solveRec` is calling `ConstraintSystem::solveSimplified`that again calls `ConstraintSystem::solveRec`.

I will try to understand more but ATM I'm not experienced enough with this codebase to have proper fixes.

Comment by Alex Manzella [ 19 Feb 2016 ]

Looks like array of Range(s) cause the type checking to be very slow, the more you add Ranges to the array the more it slow down... 1 range okay, 2 ranges slower, .... 8 ranges VERY slow, 9 ranges infinite loop (? or just extremely slow ?).
Still investigating but looks like happening only for literal Ranges, also trying an array of ClosedInterval ranges (let c = [1...2,1...2,1...2,1...2,1...2,1...2,1...2,1...2,1...2,1...2,1...2,1...2] ) is slow but works, replacing the last entry with `1..<2` breaks it.
I'm wondering if all this is just something that should fall into *expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions* because I actually got that result also for this kind of expression

Comment by Alex Manzella [ 29 Apr 2016 ]

I saw SR-305 and this is actually the same issue. Using type annotation `let someRanges: [Range<Int>] = [1..<4, 1..<8, 1..<16, 1..<32, 1..<64, 1..<128, 1..<256, 1..<512, 1..<1024]` compiles immediately. I will check if [this commit ](https://github.com/apple/swift/commit/2cdd7d64e1e2add7bcfd5452d36e7f5fc6c86a03) also fixes this issue

Generated at Wed Feb 21 08:41:18 CST 2018 using JIRA 7.3.4#73015-sha1:a262b3457b3605f12635df4b0a0c3dc71d631a1e.