Sign up ×
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other. Join them, it only takes a minute:

I've run into an interesting issue with the Swift compiler, which seems to be caused by a very simple generic function. I've got a workaround, but I'd really like to understand what the underlying issue is.

In my app I have a requirement to fade in some UICollectionViewCells in a given order, sequentially, with a slight overlap between the animations. I've implemented this using the methods below. The revealCells method takes an array of cells. If the collection is empty, it simply returns. Otherwise it animates the fade-in on the first cell in the array, and then waits a certain amount of time before making a recursive call to itself, passing all the cells except the one it just animated.

Code below:

func revealCells(cells:[UICollectionViewCell],animationTime:NSTimeInterval,overlap:Double) {
  if cells.count > 0 {
    let firstCell = cells.first
      UIView.animateWithDuration(0.3, animations: { () -> Void in
        firstCell?.alpha = 1.0
        let timeMinusOverlap = animationTime - overlap
        let delayTime = dispatch_time(DISPATCH_TIME_NOW,Int64(timeMinusOverlap * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue(), { () -> Void in
          self.revealCells(self.cdr(cells),animationTime: animationTime,overlap: overlap)
        })
      })
    }
  }
}

//Returns the collection passed into the function with its first element removed
//i.e the traditional LISP cdr function

func cdr<T>(input:[T]) -> [T] {
  var rVal = [T]()
  if input.count == 1 {
    rVal.append(input.first!)
  } else {
    rVal = [T](input[1...input.count-1])
  }
  return rVal
}

All this works fine in the simulator. But when I try to archive the build, the swift compiler crashes with the message Swift Compiler Error Command failed due to signal: Segmentation fault 11. My setup is Xcode 6.3.1 (iOSSDK 8.3), and my min deployment target is 8.3.

Fixing the problem is trivial - if I just replace the code inside the dispatch_after with:

 let newCells = [UICollectionViewCell](cells[1...cells.count-1])
 self.revealCells(newCells,animationTime: animationTime,overlap: overlap)

the problem goes away. So it seems to be something to do with the generic function, or possibly something block related.

Stack trace is:

0  swift                    0x000000010105ba18     llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x000000010105bef4 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff8725ef1a _sigtramp + 26
3  libsystem_platform.dylib 0x000000000000000f _sigtramp + 2027557135
4  swift                    0x00000001021a98cb llvm::AsmPrinter::EmitFunctionBody() + 4379
5  swift                    0x000000010116c84c llvm::ARMAsmPrinter::runOnMachineFunction(llvm::MachineFunction&) + 220
6  swift                    0x0000000100d81d13 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 99
7  swift                    0x00000001024d5edf llvm::FPPassManager::runOnFunction(llvm::Function&) + 495
8  swift                    0x00000001024d60cb llvm::FPPassManager::runOnModule(llvm::Module&) + 43
9  swift                    0x00000001024d658f llvm::legacy::PassManagerImpl::run(llvm::Module&) + 975
10 swift                    0x0000000100a09b41 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 4369
11 swift                    0x0000000100a09cb3 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
12 swift                    0x0000000100945687 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 6647
13 swift                    0x0000000100943ae6 main + 1814
14 libdyld.dylib            0x00007fff8a46b5c9 start + 1

(a long list of program arguments, which are mostly the names of file being compiled)

1.  Running pass 'Function Pass Manager' on module    '/Users/tolleyr/Library/Developer/Xcode/DerivedData/ParseTestQuiz-fgnfjkxxlyqfnrfrfntgtsjnrcfv/Build/Intermediates/ArchiveIntermediates/ParseTestQuiz/IntermediateBuildFilesPath/ParseTestQuiz.build/Release-iphoneos/ParseTestQuiz.build/Objects-normal/armv7/QuizQuestionViewController.o'.
2.  Running pass 'ARM Assembly / Object Emitter' on function '@_TFC13ParseTestQuiz26QuizQuestionViewController13viewDidAppearfS0_FSbT_'

(the last part enabled me to figure out what code was causing the problem). The command being run was CompileSwift normal armv7

I'm going to file a radar for this, since the compiler itself is crashing , but thought I'd post it here in case anyone has an idea of what might be going on, or has run into the same issue.

share|improve this question
2  
Make sure to test later versions of Xcode. Many, many compiler crashes have already been fixed. Any compiler crash is a bug in Swift. Often they mean you also have a syntax error in your code. Moving to a later version of the Swift compiler will often tell you the error, and then you can backport the solution to the older compiler if you need to. – Rob Napier Sep 9 at 16:22
    
Also getting a segmentation fault on my generics, was fine in Xcode 7 Beta 5, moved to Xcode 7 Beta 6, and can't compile. Our generics are much more woven throughout our parsing classes and so can't easily work around. @RobNapier it's actually might be a problem introduced in a newer version of LLVM/Xcode – Michael Sand Sep 9 at 23:03

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.