Skip to content

error: internal compiler error: ../src/librustc_typeck/check/dropck.rs:644 #38868

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wyklq opened this issue Jan 6, 2017 · 1 comment
Closed
Labels
I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@wyklq
Copy link

wyklq commented Jan 6, 2017

I tried this code:

pub struct List<T> {
    head: Link<T>,
}

type Link<T> = Option<Box<Node<T>>>;

struct Node<T> {
    elem: T,
    next: Link<T>,
}

impl<i32> List<i32> {
    pub fn new() -> Self {
        List { head: None }
    }

    pub fn push(&mut self, elem: i32) {
        let new_node = Box::new(Node {
            elem: elem,
            next: self.head.take(),
        });

        self.head = Some(new_node);
    }
    pub fn pop(&mut self) -> Option<i32> {
        self.head.take().map(|node| {
            let node = *node;
            self.head = node.next;
            node.elem
        })
    }
}

impl Drop for List<i32> {
    fn drop(&mut self) {
        let mut cur_link = self.head.take();
        while let Some(mut boxed_node) = cur_link {
            cur_link = boxed_node.next.take();
        }
    }
}


#[cfg(test)]
mod test {
    use super::List;

    #[test]
    fn basics() {
        let mut list = List::new();

        // Check empty list behaves right
        assert_eq!(list.pop(), None);

        // Populate list
        list.push(1);
        list.push(2);
        list.push(3);

        // Check normal removal
        assert_eq!(list.pop(), Some(3));
        assert_eq!(list.pop(), Some(2));

        // Push some more just to make sure nothing's corrupted
        list.push(4);
        list.push(5);

        // Check normal removal
        assert_eq!(list.pop(), Some(5));
        assert_eq!(list.pop(), Some(4));

        // Check exhaustion
        assert_eq!(list.pop(), Some(1));
        assert_eq!(list.pop(), None);
    }
}

I'd like to see if this works or not - just implement a specific type of a generic.
However, the following compilation error happened, which brings me here:

error: internal compiler error: ../src/librustc_typeck/check/dropck.rs:644: substs for an impl must map types to TyParam
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: run with RUST_BACKTRACE=1 for a backtrace

thread 'rustc' panicked at 'Box', ../src/librustc_errors/lib.rs:424
stack backtrace:
1: 0x7fb5b6e327aa - std::sys::imp::backtrace::tracing::imp::write::h917062bce4ff48c3
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:42
2: 0x7fb5b6e4494f - std::panicking::default_hook::{{closure}}::h0bacac31b5ed1870
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:247
3: 0x7fb5b6e411a5 - std::panicking::default_hook::h5897799da33ece67
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:257
4: 0x7fb5b6e418b7 - std::panicking::rust_panic_with_hook::h109e116a3a861224
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:451
5: 0x7fb5b327b3ba - std::panicking::begin_panic::h7ee1a5d23402297a
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:413
6: 0x7fb5b328c64d - rustc_errors::Handler::bug::hcb152875f06770ca
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_errors/lib.rs:424
7: 0x7fb5b42ceec1 - rustc::session::opt_span_bug_fmt::{{closure}}::hac6e8f2df662620f
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/session/mod.rs:770
8: 0x7fb5b420762e - rustc::session::opt_span_bug_fmt::he7e61f6adc55e29d
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1057
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/session/mod.rs:766
9: 0x7fb5b4207292 - rustc::session::bug_fmt::h995c6792d8929834
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/session/mod.rs:750
10: 0x7fb5b67b23c7 - rustc_typeck::check::dropck::revise_self_ty::{{closure}}::h6e990da16bfc798b
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/dropck.rs:644
11: 0x7fb5b66c483a - rustc::ty::subst::<impl rustc::ty::Slice<rustc::ty::subst::Kind<'tcx>>>::fill_item::h8c0c6b3650a643fa
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/subst.rs:215
12: 0x7fb5b66f98df - rustc_typeck::check::dropck::iterate_over_potentially_unsafe_regions_in_type::hf27b94c5cbeb9fef
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/subst.rs:182
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/dropck.rs:615
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/dropck.rs:558
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/dropck.rs:415
13: 0x7fb5b66f8e33 - rustc_typeck::check::dropck::check_safety_of_destructor_if_necessary::h16dcd6dd761b7c2c
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/dropck.rs:287
14: 0x7fb5b670c00c - rustc_typeck::check::regionck::RegionCtxt::check_safety_of_rvalue_destructor_if_necessary::hf4c077992bb4034d
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/regionck.rs:1002
15: 0x7fb5b670aaff - <rustc_typeck::check::regionck::RegionCtxt<'a, 'gcx, 'tcx> as rustc::hir::intravisit::Visitor<'v>>::visit_expr::hbc45bb71eeb408fd
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/regionck.rs:596
16: 0x7fb5b67093df - rustc_typeck::check::regionck::RegionCtxt::visit_fn_body::h694b854703d3b296
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/:2
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/hir/intravisit.rs:113
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/regionck.rs:308
17: 0x7fb5b6708a72 - rustc_typeck::check::regionck::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::regionck_fn::h4c3bf45fc5b0b67f
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/regionck.rs:151
18: 0x7fb5b674be2e - rustc_typeck::check::check_bare_fn::hcf6cfb2ab5a6420e
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:566
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:410
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/infer/mod.rs:523
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1028
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/thread/local.rs:245
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1025
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:862
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/infer/mod.rs:523
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:410
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:548
19: 0x7fb5b674ec57 - rustc_typeck::check::check_item_body::he3880201f44aba3c
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:834
20: 0x7fb5b6749c15 - rustc_typeck::check::check_item_bodies::h60f6e46e6083a923
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:469
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/dep_graph/visit.rs:46
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/hir/mod.rs:445
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/dep_graph/visit.rs:57
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/mod.rs:2844
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:490
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/session/mod.rs:222
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/check/mod.rs:488
21: 0x7fb5b67aef5f - rustc_typeck::check_crate::h49660caa41b9699c
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/lib.rs:366
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/util/common.rs:38
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_typeck/lib.rs:366
22: 0x7fb5b71f7d9e - rustc_driver::driver::phase_3_run_analysis_passes::{{closure}}::h5a9a7c8e1b6dbe3a
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/driver.rs:891
23: 0x7fb5b71d5d10 - rustc_driver::driver::phase_3_run_analysis_passes::h823704ee01fd0a1e
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1028
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/thread/local.rs:245
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1025
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1012
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/thread/local.rs:245
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:1009
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc/ty/context.rs:797
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/driver.rs:869
24: 0x7fb5b71be974 - rustc_driver::driver::compile_input::h66a0adaf05fab85d
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/driver.rs:173
25: 0x7fb5b71e8d30 - rustc_driver::run_compiler::hafe7bbfedf95a825
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/lib.rs:222
26: 0x7fb5b711db48 - std::panicking::try::do_call::h5ff5e568cb9cce51
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/lib.rs:1138
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/lib.rs:138
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/librustc_driver/lib.rs:1072
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panic.rs:295
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:356
27: 0x7fb5b6e4c85a - __rust_maybe_catch_panic
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libpanic_unwind/lib.rs:97
28: 0x7fb5b713d7a8 - <F as alloc::boxed::FnBox>::call_box::h92e2f4ed0df1d5b6
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panicking.rs:332
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/panic.rs:351
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/thread/mod.rs:287
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/liballoc/boxed.rs:595
29: 0x7fb5b6e40474 - std::sys::imp::thread::Thread::new::thread_start::ha102a6120fc52763
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/liballoc/boxed.rs:605
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/sys_common/thread.rs:21
at /buildslave/rust-buildbot/slave/stable-dist-rustc-linux/build/obj/../src/libstd/sys/unix/thread.rs:84
30: 0x7fb5afda9183 - start_thread
31: 0x7fb5b6af337c - clone
32: 0x0 -

@arielb1 arielb1 added the I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ label Jan 6, 2017
@arielb1
Copy link
Contributor

arielb1 commented Jan 6, 2017

Minified:

pub struct List<T> {
    head: T,
}

impl Drop for List<i32> {
    fn drop(&mut self) {
        panic!()
    }
}

fn main() {
    List { head: 0 };
}

@brson brson added the T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. label Jan 11, 2017
arielb1 added a commit to arielb1/rust that referenced this issue Mar 1, 2017
This removes the Cell from AdtDef. Also, moving destructor validity
checking to on-demand (forced during item-type checking) ensures that
invalid destructors can't cause ICEs.

Fixes rust-lang#38868.
Fixes rust-lang#40132.
bors added a commit that referenced this issue Mar 3, 2017
convert AdtDef::destructor to on-demand

This removes the `Cell` from `AdtDef`. Also, moving destructor validity
checking to on-demand (forced during item-type checking) ensures that
invalid destructors can't cause ICEs.

Fixes #38868.
Fixes #40132.

r? @eddyb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

3 participants