Skip to content

Signal listener example code causes rustc LLVM compiler abort #13352

Closed
@nathantypanski

Description

@nathantypanski

Updated report

This code trips an LLVM assertion:

fn foo(_: proc()) {}

fn main() {
    foo(loop {})
}
$ rustc foo.rs
Assertion failed: ((i >= FTy->getNumParams() || FTy->getParamType(i) == Args[i]->getType()) && "Calling a function with a bad signature!"), function init, file /Users/rustbuild/src/rust-buildbot/slave/nightly-mac/build/src/llvm/lib/IR/Instructions.cpp, line 281.

Original report

Signal listener example code causes rustc LLVM compiler abort

In the 0.10 docs there is an example snippet for writing listeners. But if we wrap it in fn main() and try to run, rustc will crash and burn:

$ RUST_BACKTRACE=1 rustc procbad.rs
procbad.rs:6:5: 6:33 warning: unused result which must be used, #[warn(unused_must_use)] on by default
procbad.rs:6     listener.register(Interrupt);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
rustc: /home/nathan/devel/rust/rust/src/llvm/lib/IR/Instructions.cpp:549: 
void llvm::InvokeInst::init(llvm::Value*, llvm::BasicBlock*, llvm::BasicBlock*, llvm::ArrayRef<llvm::Value*>, const llvm::Twine&):
Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i) ==
Args[i]->getType())
&& "Invoking a function with a bad signature!"' failed.
zsh: abort      RUST_BACKTRACE=1 rustc procbad.rs

Here is the code which you can copy-paste directly to reproduce this bug:

use std::io::signal::{Listener, Interrupt};

fn main() {
    let mut listener = Listener::new();
    listener.register(Interrupt);

    spawn({
        loop {
            match listener.rx.recv() {
                Interrupt => println!("Got Interrupt'ed"),
                _ => (),
            }
        }
    });
}

System information:

$ rustc -v
rustc 0.10 (46867cc 2014-04-02 16:59:39 -0700)
host: x86_64-unknown-linux-gnu
$ uname -a
Linux dionysus 3.13.0-rc8-dio-00005-ga6da83f #4 SMP PREEMPT Wed Feb 5 19:43:54 EST 2014 x86_64 GNU/Linux
$ cat /etc/issue
Debian GNU/Linux jessie/sid

Program version information used in compiling rustc:

configure: CFG_PERL             := /usr/bin/perl 
configure: CFG_CURLORWGET       := /usr/bin/curl (7.36.0)
configure: CFG_PYTHON           := /usr/bin/python2.7 
configure: CFG_GIT              := /usr/bin/git (1.9.1)
configure: CFG_CLANG            :=  
configure: CFG_CCACHE           := /usr/bin/ccache (3.1.9)
configure: CFG_GCC              := /home/nathan/bin/gcc (4.8.2-16)) [not custom; just a wrapper script for using ccache]
configure: CFG_LD               := /usr/bin/ld (2.24)
configure: CFG_VALGRIND         := /usr/bin/valgrind (3.9.0)
configure: CFG_PERF             := /usr/bin/perf (3.13.6)
configure: CFG_ISCC             :=  
configure: CFG_LLNEXTGEN        :=  
configure: CFG_PANDOC           := /home/nathan/.cabal/bin/pandoc (1.12.3.3)
configure: CFG_PDFLATEX         := /usr/bin/pdflatex (3.1415926-2.5-1.40.14)
configure: CFG_XELATEX          :=  
configure: CFG_LUALATEX         := /usr/bin/lualatex (0.76.0-2013070106)
configure: CFG_GDB              := /usr/bin/gdb (7.6.2)
configure: CFG_PAXCTL           :=  
configure: CFG_ZCAT             := /bin/zcat (1.6)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions