Быстрое утверждение не удалось - PullRequest
0 голосов
/ 20 апреля 2020

Я сломал Свифта. Можете ли вы сказать мне, если и тогда, что я делаю неправильно, или это ошибка в Swift? Кажется (из этой и моих предыдущих попыток), что Swift не нравится мое использование аргументов inout.

Вот мой код (он реализует быструю сортировку с логарифмической c сложностью памяти, выбирая, какую часть рекурсировать) :

func sort<T: Comparable>(
  _ arr: inout [T],
  _ start: inout Int = 0,
  _ end: inout Int = 0)
{
  if end == 0 { end = arr.count }
  while start < end {
    var i = start
    let pivot = arr[i]
    for j in i + 1 ..< end
    {
      let t = arr[j]
      if t < pivot {
        arr[j] = arr[i]
        arr[i] = t
        i += 1
      }
    }
    if i > start {
      let bounds = [start, i, i, end]
      var j = 2 * i > start + end ? 2 : 0
      (start, end) = (bounds[j], bounds[j + 1])
      sort(&arr, &start, &end)
      j = (j + 2) % 4
      (start, end) = (bounds[j], bounds[j + 1])
    }
    else { start += 1 }
  }
}

var a = [3, 1, 4, 1, 5, 9, 2, 6, 5]
sort(&a)
print(a)

А вот и вывод:

Swift version 5.0.1 (swift-5.0.1-RELEASE)
 swiftc -o main main.swift
swift: /home/buildnode/jenkins/workspace/oss-swift-5.0-package-linux-ubuntu-18_04/swift/lib/AST/ASTContext.cpp:3186: swift::TupleTypeElt::TupleTypeElt(swift::Type, swift::Identifier, swift::ParameterTypeFlags): Assertion `!ty->is<InOutType>() && "caller did not pass a base type"' failed.
Stack dump:
0.  Program arguments: /usr/bin/swift -frontend -c -primary-file main.swift -target x86_64-unknown-linux-gnu -disable-objc-interop -color-diagnostics -module-name main -o /tmp/main-c3dd3d.o 
1.  While type-checking statement at [main.swift:32:1 - line:32:8] RangeText="sort(&a"
2.  While type-checking expression at [main.swift:32:1 - line:32:8] RangeText="sort(&a"
/usr/bin/swift[0x423d3b4]
/usr/bin/swift[0x423b13e]
/usr/bin/swift[0x423d572]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x12890)[0x7fbbee94b890]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0xc7)[0x7fbbecdaee97]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x141)[0x7fbbecdb0801]
/lib/x86_64-linux-gnu/libc.so.6(+0x3039a)[0x7fbbecda039a]
/lib/x86_64-linux-gnu/libc.so.6(+0x30412)[0x7fbbecda0412]
/usr/bin/swift[0x1758aff]
/usr/bin/swift[0x1509882]
/usr/bin/swift[0x14f9942]
/usr/bin/swift[0x150d06a]
/usr/bin/swift[0x14fbbeb]
/usr/bin/swift[0x17d3117]
/usr/bin/swift[0x14f359b]
/usr/bin/swift[0x143c618]
/usr/bin/swift[0x143c162]
/usr/bin/swift[0x14d1c9d]
/usr/bin/swift[0x14d0e17]
/usr/bin/swift[0x14d0f22]
/usr/bin/swift[0x14f0647]
/usr/bin/swift[0xd3a10a]
/usr/bin/swift[0xd38eb0]
/usr/bin/swift[0xd38511]
/usr/bin/swift[0x4beb31]
/usr/bin/swift[0x4bd7c9]
/usr/bin/swift[0x46e630]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7fbbecd91b97]
/usr/bin/swift[0x46ca4a]
<unknown>:0: error: unable to execute command: Aborted
<unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation)
compiler exit status 254
...