Module validation failed: Function return type does not match operand type of return inst!
ret %"(Array(AnyHash::JSONTypes::Value) | Bool | Float32 | Float64 | Hash(String | Symbol, AnyHash::JSONTypes::Value)+ | Int128 | Int16 | Int32 | Int64 | Int8 | JSON::Any | Set(AnyHash::JSONTypes::Value) | String | Symbol | Time | UInt128 | UInt16 | UInt32 | UInt64 | UInt8 | Nil)" %1, !dbg !28
%"(Array(AnyHash::JSONTypes::Value) | Bool | Float32 | Float64 | Hash(String | Symbol, AnyHash::JSONTypes::Value) | Int128 | Int16 | Int32 | Int64 | Int8 | JSON::Any | Set(AnyHash::JSONTypes::Value) | String | Symbol | Time | UInt128 | UInt16 | UInt32 | UInt64 | UInt8 | Nil)" = type { i32, [3 x i64] } (Exception)
from Crystal::CodeGenVisitor#finish:Nil
from Crystal::Compiler#codegen<Crystal::Program, Crystal::ASTNode+, Array(Crystal::Compiler::Source), String>:(Tuple(Array(Crystal::Compiler::CompilationUnit), Array(String)) | Nil)
from Crystal::Compiler#compile<Array(Crystal::Compiler::Source), String>:Crystal::Compiler::Result
from Crystal::Command#run:(Bool | Crystal::Compiler::Result | Nil)
from main
Error: you've found a bug in the Crystal compiler. Please open an issue, including source code that will allow us to reproduce the bug: https://github.com/crystal-lang/crystal/issues
I have a hard time isolating the code responsible for the issue.
Happens with Crystal 0.26.0, Amber 0.8 and raven.cr (develop branch) on macOS.
@Sija Interesting, Does this error show any specific file/line?
@faustinoaq none I can find, with --debug flag it fails with:
$ shards build --debug
Dependencies are satisfied
Building: pet-tracker
Error target pet-tracker failed to compile:
Module validation failed: conflicting debug info for argument
call void @llvm.dbg.declare(metadata i32 %__temp_1797, metadata !1566, metadata !366), !dbg !1528
!1529 = !DILocalVariable(name: "self", arg: 1, scope: !1513, file: !322, line: 61, type: !1530)
!1566 = !DILocalVariable(name: "__temp_1797", arg: 1, scope: !1513, file: !322, line: 61, type: !14)
Crystal::CodeGenVisitor#finish:Nil
Crystal::Compiler#codegen<Crystal::Program, Crystal::ASTNode+, Array(Crystal::Compiler::Source), String>:(Tuple(Array(Crystal::Compiler::CompilationUnit), Array(String)) | Nil)
Crystal::Compiler#compile<Array(Crystal::Compiler::Source), String>:Crystal::Compiler::Result
Crystal::Command#run:(Bool | Crystal::Compiler::Result | Nil)
main
Error: you've found a bug in the Crystal compiler. Please open an issue, including source code that will allow us to reproduce the bug: https://github.com/crystal-lang/crystal/issues
Ahh, finally with master (props to @RX14 for #6261!) we have some proper backtrace:
$ ../crystal/bin/crystal build src/pet-tracker.cr --debug
Using compiled compiler at `.build/crystal'
Module validation failed: conflicting debug info for argument
call void @llvm.dbg.declare(metadata i32 %__temp_1797, metadata !1566, metadata !366), !dbg !1528
!1529 = !DILocalVariable(name: "self", arg: 1, scope: !1513, file: !322, line: 61, type: !1530)
!1566 = !DILocalVariable(name: "__temp_1797", arg: 1, scope: !1513, file: !322, line: 61, type: !14)
/Users/sija/Code/crystal/src/llvm/module.cr:78:9 in 'verify'
/Users/sija/Code/crystal/src/compiler/crystal/codegen/codegen.cr:343:9 in 'finish'
/Users/sija/Code/crystal/src/compiler/crystal/codegen/codegen.cr:67:7 in 'codegen'
/Users/sija/Code/crystal/src/compiler/crystal/codegen/codegen.cr:63:5 in 'codegen:debug:single_module'
/Users/sija/Code/crystal/src/compiler/crystal/compiler.cr:22:7 in 'codegen'
/Users/sija/Code/crystal/src/compiler/crystal/compiler.cr:145:16 in 'compile'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:264:7 in 'compile'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:262:5 in 'compile'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:164:5 in 'build'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:69:7 in 'run'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:48:5 in 'run'
/Users/sija/Code/crystal/src/compiler/crystal/command.cr:47:3 in 'run'
/Users/sija/Code/crystal/src/compiler/crystal.cr:8:1 in '__crystal_main'
/Users/sija/Code/crystal/src/crystal/main.cr:104:5 in 'main_user_code'
/Users/sija/Code/crystal/src/crystal/main.cr:93:7 in 'main'
/Users/sija/Code/crystal/src/crystal/main.cr:133:3 in 'main'
Error: you've found a bug in the Crystal compiler. Please open an issue, including source code that will allow us to reproduce the bug: https://github.com/crystal-lang/crystal/issues
Funny, here is another undocumented thing to debug this kind of error:
https://github.com/crystal-lang/crystal/blob/master/src/compiler/crystal/codegen/codegen.cr#L324-L338
One can do DUMP=1 crystal build <file> to dump the llvm-ir before the ir validation (that triggers a module validation error as OP).
You can also do DUMP=some_regex crystal build <file> to dump only the llvm module that matches some_regex.
@bew Nice find! I'll dig into that and report back.
Interestingly, the latter exception relates to https://github.com/amberframework/amber/blob/v0.8.0/src/amber/server/server.cr#L63, if I comment that line we're back to square/exception one.
Mentioned self is of a type Amber::Server and __temp_1797 is Signal.
Seems like the second error has been fixed by #6346 and/or possibly others.
Interestingly now it fails with:
Using compiled compiler at `.build/crystal'
Error in src/pet-tracker.cr:3: instantiating 'Amber::Server:Class#start()'
Amber::Server.start
^~~~~
in lib/amber/src/amber/server/server.cr:17: instantiating 'Amber::Server#run()'
instance.run
^~~
in lib/amber/src/amber/server/server.cr:47: instantiating 'Amber::Cluster:Class#fork()'
thread_count.times { Cluster.fork }
^~~~
in lib/amber/src/amber/server/cluster.cr:15: instantiating 'Process:Class#fork()'
Process.fork { Process.run(PROGRAM_NAME, nil, env_hash, true, false, input: Process::Redirect::Inherit, output: Process::Redirect::Inherit, error: Process::Redirect::Inherit) }
^~~~
in /Users/sija/Code/crystal/src/process.cr:80: instantiating 'fork_internal()'
pid = fork_internal do
^~~~~~~~~~~~~
in /Users/sija/Code/crystal/src/process.cr:80: instantiating 'fork_internal()'
pid = fork_internal do
^~~~~~~~~~~~~
in lib/amber/src/amber/server/cluster.cr:15: instantiating 'Process:Class#fork()'
Process.fork { Process.run(PROGRAM_NAME, nil, env_hash, true, false, input: Process::Redirect::Inherit, output: Process::Redirect::Inherit, error: Process::Redirect::Inherit) }
^~~~
in lib/amber/src/amber/server/cluster.cr:15: instantiating 'env_hash()'
Process.fork { Process.run(PROGRAM_NAME, nil, env_hash, true, false, input: Process::Redirect::Inherit, output: Process::Redirect::Inherit, error: Process::Redirect::Inherit) }
^~~~~~~~
in lib/amber/src/amber/server/cluster.cr:8: no overload matches 'Hash(Char, Char)#[]=' with types String, String
Overloads are:
- Hash(K, V)#[]=(key : K, value : V)
env["FORKED"] = "1"
^
Edit: fixed in #6499
@Sija I think it might have something to do with https://github.com/crystal-lang/crystal/pull/6333
I boiled it down to a simple example:
puts typeof(ENV.to_h)
Running on 0.25.1, we get Hash(String, String) https://carc.in/#/r/4onf
Here's a console with old vs new, showing the output change.
$ crystal --version
Crystal 0.25.1 (2018-06-30)
LLVM: 5.0.2
Default target: x86_64-apple-macosx
$ crystal eval 'puts typeof(ENV.to_h)'
Hash(String, String)
$ ~/workspace/miketheman/crystal/bin/crystal --version
Using compiled compiler at `.build/crystal'
Crystal 0.25.1+109 [ff3225fad] (2018-08-06)
LLVM: 6.0.1
Default target: x86_64-apple-macosx
$ ~/workspace/miketheman/crystal/bin/crystal eval 'puts typeof(ENV.to_h)'
Using compiled compiler at `.build/crystal'
Hash(Char, Char)
The signature has between 0.25.1 and ff3225fad - and I used git bisect to try and narrow it down - but there's been a variety of toolchain changes that I can't seem to nail down to bisect from 0.25.1 onwards.
Tagging @straight-shoota and @RX14 who committed that changeset - maybe they can shed some light on this?
Yeah, this seems to be caused by ENV.each yielding String, String instead of {String, String}. That messes up Enumerable#first which is used by Enumerable#to_h.
I doubt the original error has been fixed - just masked by a compile error which has now been solved.
I've just managed to narrow it down to extending Hash.
I've just managed to narrow it down to extending
Hash.
My example from https://github.com/crystal-lang/crystal/issues/6997#issuecomment-529147055 also includes subclasses of Hash (Shards::Dependency and Shards::Target). So it seems plausible that this is somehow causing this.
Maybe crystal-lang/shards#230 should be reconsidered?
@straight-shoota Well, guess what, there _was_ a PR fixing it, but @ysbaddaden decided it was a _nitpicking_... Perhaps it's not after all? :P
Edit: you've beat me by a minute, 馃帺 for the good memory :)
All in all it's still avoiding the issue instead of fixing it, but I guess it's better that way until someone (@asterite - thinking of you!) will be brave enough to tackle the root cause of it.
Most helpful comment
I doubt the original error has been fixed - just masked by a compile error which has now been solved.