Skip to content

Commit

Permalink
Don't ICE when missing owned_box lang item
Browse files Browse the repository at this point in the history
Closes #20549
  • Loading branch information
nrc committed Jul 12, 2015
1 parent 05d8767 commit 7fb8208
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
6 changes: 4 additions & 2 deletions src/librustc/middle/fast_reject.rs
Expand Up @@ -71,8 +71,10 @@ pub fn simplify_type(tcx: &ty::ctxt,
}
ty::TyBox(_) => {
// treat like we would treat `Box`
let def_id = tcx.lang_items.owned_box().unwrap();
Some(StructSimplifiedType(def_id))
match tcx.lang_items.require_owned_box() {
Ok(def_id) => Some(StructSimplifiedType(def_id)),
Err(msg) => tcx.sess.fatal(&msg),
}
}
ty::TyClosure(def_id, _) => {
Some(ClosureSimplifiedType(def_id))
Expand Down
4 changes: 4 additions & 0 deletions src/librustc/middle/lang_items.rs
Expand Up @@ -90,6 +90,10 @@ impl LanguageItems {
}
}

pub fn require_owned_box(&self) -> Result<ast::DefId, String> {
self.require(OwnedBoxLangItem)
}

pub fn from_builtin_kind(&self, bound: ty::BuiltinBound)
-> Result<ast::DefId, String>
{
Expand Down
5 changes: 4 additions & 1 deletion src/librustc_typeck/coherence/orphan.rs
Expand Up @@ -77,7 +77,10 @@ impl<'cx, 'tcx> OrphanChecker<'cx, 'tcx> {
self.check_def_id(item, data.principal_def_id());
}
ty::TyBox(..) => {
self.check_def_id(item, self.tcx.lang_items.owned_box().unwrap());
match self.tcx.lang_items.require_owned_box() {
Ok(trait_id) => self.check_def_id(item, trait_id),
Err(msg) => self.tcx.sess.span_fatal(item.span, &msg),
}
}
ty::TyChar => {
self.check_primitive_impl(def_id,
Expand Down
26 changes: 26 additions & 0 deletions src/test/compile-fail/no_owned_box_lang_item.rs
@@ -0,0 +1,26 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// Test that we don't ICE when we are missing the owned_box lang item.

// error-pattern: requires `owned_box` lang_item

#![no_std]
#![feature(lang_items, no_std, box_syntax)]

extern crate core;

fn main() {
let x = box 1i32;
}

#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }

0 comments on commit 7fb8208

Please sign in to comment.