Crystal: Compiler crash enumerable

Created on 22 Oct 2015  路  10Comments  路  Source: crystal-lang/crystal

Ran in to this bug. I'm having a hard time actually pin pointing what code causes this crash

Bug: `yield e` at /usr/local/Cellar/crystal-lang/HEAD/src/enumerable.cr:796:28 has no type
[4404476555] *raise<String>:NoReturn +139
[4404887422] *Crystal::ASTNode+@Crystal::ASTNode#type<Crystal::ASTNode+>:Crystal::Type+ +510
[4408016851] *Crystal::CodeGenVisitor#codegen_cond<Crystal::CodeGenVisitor, Crystal::ASTNode+>:LLVM::Value +35
[4407937580] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +12092
[4407935767] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +10279
[4407935767] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +10279
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4407938151] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +12663
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4408036563] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +3059
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4408036563] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +3059
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4408036563] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +3059
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4408052755] *Crystal::CodeGenVisitor#prepare_call_args_non_external<Crystal::CodeGenVisitor, Crystal::Call, Crystal::Def+, Crystal::Type+>:{Array(LLVM::Value), Bool} +211
[4408033981] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +477
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4408052755] *Crystal::CodeGenVisitor#prepare_call_args_non_external<Crystal::CodeGenVisitor, Crystal::Call, Crystal::Def+, Crystal::Type+>:{Array(LLVM::Value), Bool} +211
[4408033981] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +477
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4408014728] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Assign>:(Nil | Bool) +344
[4407927721] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +2233
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4408036563] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +3059
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4408003730] *Crystal::CodeGenVisitor#codegen_fun<Crystal::CodeGenVisitor, String, Crystal::Def+, Crystal::Type+, Bool, LLVM::Module, Bool, Bool>:LLVM::Function +3346
[4407993665] *Crystal::CodeGenVisitor#target_def_fun<Crystal::CodeGenVisitor, Crystal::Def+, Crystal::Type+>:LLVM::Function +4705
[4408036669] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +3165
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4407979709] *Crystal::CodeGenVisitor#codegen_fun<Crystal::CodeGenVisitor, String, Crystal::Def, Crystal::Type+, Bool, LLVM::Module, Bool, Bool>:LLVM::Function +2989
[4407929041] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +3553
[4408053239] *Crystal::CodeGenVisitor#prepare_call_args_non_external<Crystal::CodeGenVisitor, Crystal::Call, Crystal::Def+, Crystal::Type+>:{Array(LLVM::Value), Bool} +695
[4408033981] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +477
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4408053239] *Crystal::CodeGenVisitor#prepare_call_args_non_external<Crystal::CodeGenVisitor, Crystal::Call, Crystal::Def+, Crystal::Type+>:{Array(LLVM::Value), Bool} +695
[4408033981] *Crystal::CodeGenVisitor#visit<Crystal::CodeGenVisitor, Crystal::Call>:Bool +477
[4407926590] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1102
[4407926893] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +1405
[4407927958] *Crystal::ASTNode+@Crystal::ASTNode#accept<Crystal::ASTNode+, Crystal::CodeGenVisitor>:Nil +2470
[4406893965] *Crystal::Compiler#compile<Crystal::Compiler, Array(Crystal::Compiler::Source), String>:Crystal::Compiler::Result +4429
[4410852801] *Crystal::Command#run<Crystal::Command>:(Nil | Bool | Process::Status | Array(String) | IO::FileDescriptor+ | Crystal::Compiler::Result | Array(Crystal::ImplementationTrace) | Array(Crystal::Init::View+:Class)) +1121
[4410850649] main +19065
bug compiler

All 10 comments

I'm afraid without at least some code to reproduce this will be impossible to fix.

Fair enough, I'll keep digging and hopefully come with an update

Could reduce it quite a bit, I'll leave the two arrays and Enumerable methods to @asterite

class CarbonSupport::Callbacks::Callback
  def initialize
    @method = nil
  end

  def method
    @method
  end
end

class CarbonController::Metal
  def dispatch(block)
    run_callbacks do
    end
  end

  def run_callbacks
    yield

    ([] of CarbonSupport::Callbacks::Callback).all? do |after|
      ([] of CarbonSupport::Callbacks::Callback).includes?(after.method)
    end
  end
end

class ApplicationController < CarbonController::Metal
  def index
  end
end

class WelcomeController < ApplicationController
  def index
    1
  end
end

proc = ->(controller : ApplicationController) { controller.index }
ApplicationController.new.dispatch(proc)

With #2443 in place the above snippet no longer compiles, and adding explicitly specifying the type of @method makes it compile fine.

Nice!! Thank you. Looking forward to the release! Would it be an idea to ask volunteers to checkout the master branch to test some shards before the next release?

@benoist Sounds like a good idea. I don't know how many know how to compile the compiler and use it, but I'll drop a message on our Google Groups to ask volunteers to try to migrate their code to work with master.

I don't know how many know how to compile the compiler

True, there's always the option of creating an RC. As this release would probably require most shards to be updated, it might be worth it. I know it's just about naming a version and there is not much difference between 0.16.0.rc1 and 0.16.1 but at least you'd have to specifically request the RC to be installed. This might make sure newcomers to the language aren't scared off by all the failing shards with the latest release. I know that's what put me off to continue with rust (not saying I will do the same with crystal, cause I already love it :)).

Sounds really good and wise. I will include a ".rc" in the version and also announce it as a release candidate.

:+1:

Was this page helpful?
0 / 5 - 0 ratings