Point to local place span on "type too big" error

This commit is contained in:
Esteban Küber 2019-08-03 15:59:25 -07:00
parent 2c5684208c
commit db099fb491
14 changed files with 65 additions and 9 deletions

View File

@ -901,6 +901,9 @@ impl<'a, 'tcx> LayoutOf for LateContext<'a, 'tcx> {
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
self.tcx.layout_of(self.param_env.and(ty)) self.tcx.layout_of(self.param_env.and(ty))
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> LateContextAndPass<'a, 'tcx, T> { impl<'a, 'tcx, T: LateLintPass<'a, 'tcx>> LateContextAndPass<'a, 'tcx, T> {

View File

@ -3,7 +3,7 @@ use crate::ty::{self, Ty, TyCtxt, TypeFoldable, ReprOptions};
use syntax::ast::{self, Ident, IntTy, UintTy}; use syntax::ast::{self, Ident, IntTy, UintTy};
use syntax::attr; use syntax::attr;
use syntax_pos::DUMMY_SP; use syntax_pos::{DUMMY_SP, Span};
use std::cmp; use std::cmp;
use std::fmt; use std::fmt;
@ -1943,6 +1943,9 @@ impl<'tcx> LayoutOf for LayoutCx<'tcx, TyCtxt<'tcx>> {
Ok(layout) Ok(layout)
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
impl LayoutOf for LayoutCx<'tcx, ty::query::TyCtxtAt<'tcx>> { impl LayoutOf for LayoutCx<'tcx, ty::query::TyCtxtAt<'tcx>> {
@ -1974,6 +1977,9 @@ impl LayoutOf for LayoutCx<'tcx, ty::query::TyCtxtAt<'tcx>> {
Ok(layout) Ok(layout)
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
// Helper (inherent) `layout_of` methods to avoid pushing `LayoutCx` to users. // Helper (inherent) `layout_of` methods to avoid pushing `LayoutCx` to users.

View File

@ -6,6 +6,7 @@ use crate::type_::Type;
use crate::type_of::LayoutLlvmExt; use crate::type_of::LayoutLlvmExt;
use crate::value::Value; use crate::value::Value;
use syntax::symbol::LocalInternedString; use syntax::symbol::LocalInternedString;
use syntax::source_map::Span;
use rustc_codegen_ssa::common::{IntPredicate, TypeKind, RealPredicate}; use rustc_codegen_ssa::common::{IntPredicate, TypeKind, RealPredicate};
use rustc_codegen_ssa::MemFlags; use rustc_codegen_ssa::MemFlags;
use libc::{c_uint, c_char}; use libc::{c_uint, c_char};
@ -90,6 +91,9 @@ impl ty::layout::LayoutOf for Builder<'_, '_, 'tcx> {
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
self.cx.layout_of(ty) self.cx.layout_of(ty)
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.cx.layout_of(ty)
}
} }
impl Deref for Builder<'_, 'll, 'tcx> { impl Deref for Builder<'_, 'll, 'tcx> {

View File

@ -30,6 +30,7 @@ use std::iter;
use std::str; use std::str;
use std::sync::Arc; use std::sync::Arc;
use syntax::symbol::LocalInternedString; use syntax::symbol::LocalInternedString;
use syntax::source_map::Span;
use crate::abi::Abi; use crate::abi::Abi;
/// There is one `CodegenCx` per compilation unit. Each one has its own LLVM /// There is one `CodegenCx` per compilation unit. Each one has its own LLVM
@ -860,9 +861,16 @@ impl LayoutOf for CodegenCx<'ll, 'tcx> {
type TyLayout = TyLayout<'tcx>; type TyLayout = TyLayout<'tcx>;
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
self.spanned_layout_of(ty, None)
}
fn spanned_layout_of(&self, ty: Ty<'tcx>, span: Option<Span>) -> Self::TyLayout {
self.tcx.layout_of(ty::ParamEnv::reveal_all().and(ty)) self.tcx.layout_of(ty::ParamEnv::reveal_all().and(ty))
.unwrap_or_else(|e| if let LayoutError::SizeOverflow(_) = e { .unwrap_or_else(|e| if let LayoutError::SizeOverflow(_) = e {
self.sess().fatal(&e.to_string()) match span {
Some(span) => self.sess().span_fatal(span, &e.to_string()),
None => self.sess().fatal(&e.to_string()),
}
} else { } else {
bug!("failed to get layout for `{}`: {}", ty, e) bug!("failed to get layout for `{}`: {}", ty, e)
}) })

View File

@ -182,13 +182,19 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx>
rvalue: &mir::Rvalue<'tcx>, rvalue: &mir::Rvalue<'tcx>,
location: Location) { location: Location) {
debug!("visit_assign(place={:?}, rvalue={:?})", place, rvalue); debug!("visit_assign(place={:?}, rvalue={:?})", place, rvalue);
let mut decl_span = None;
if let mir::PlaceBase::Local(local) = &place.base {
if let Some(decl) = self.fx.mir.local_decls.get(*local) {
decl_span = Some(decl.source_info.span);
}
}
if let mir::Place { if let mir::Place {
base: mir::PlaceBase::Local(index), base: mir::PlaceBase::Local(index),
projection: None, projection: None,
} = *place { } = *place {
self.assign(index, location); self.assign(index, location);
if !self.fx.rvalue_creates_operand(rvalue) { if !self.fx.rvalue_creates_operand(rvalue, decl_span) {
self.not_ssa(index); self.not_ssa(index);
} }
} else { } else {

View File

@ -6,6 +6,7 @@ use rustc::middle::lang_items::ExchangeMallocFnLangItem;
use rustc_apfloat::{ieee, Float, Status, Round}; use rustc_apfloat::{ieee, Float, Status, Round};
use std::{u128, i128}; use std::{u128, i128};
use syntax::symbol::sym; use syntax::symbol::sym;
use syntax::source_map::Span;
use crate::base; use crate::base;
use crate::MemFlags; use crate::MemFlags;
@ -136,7 +137,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
} }
_ => { _ => {
assert!(self.rvalue_creates_operand(rvalue)); assert!(self.rvalue_creates_operand(rvalue, None));
let (mut bx, temp) = self.codegen_rvalue_operand(bx, rvalue); let (mut bx, temp) = self.codegen_rvalue_operand(bx, rvalue);
temp.val.store(&mut bx, dest); temp.val.store(&mut bx, dest);
bx bx
@ -169,7 +170,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
mut bx: Bx, mut bx: Bx,
rvalue: &mir::Rvalue<'tcx> rvalue: &mir::Rvalue<'tcx>
) -> (Bx, OperandRef<'tcx, Bx::Value>) { ) -> (Bx, OperandRef<'tcx, Bx::Value>) {
assert!(self.rvalue_creates_operand(rvalue), "cannot codegen {:?} to operand", rvalue); assert!(
self.rvalue_creates_operand(rvalue, None),
"cannot codegen {:?} to operand",
rvalue,
);
match *rvalue { match *rvalue {
mir::Rvalue::Cast(ref kind, ref source, mir_cast_ty) => { mir::Rvalue::Cast(ref kind, ref source, mir_cast_ty) => {
@ -691,7 +696,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
} }
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
pub fn rvalue_creates_operand(&self, rvalue: &mir::Rvalue<'tcx>) -> bool { pub fn rvalue_creates_operand(&self, rvalue: &mir::Rvalue<'tcx>, span: Option<Span>) -> bool {
match *rvalue { match *rvalue {
mir::Rvalue::Ref(..) | mir::Rvalue::Ref(..) |
mir::Rvalue::Len(..) | mir::Rvalue::Len(..) |
@ -707,7 +712,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
mir::Rvalue::Aggregate(..) => { mir::Rvalue::Aggregate(..) => {
let ty = rvalue.ty(self.mir, self.cx.tcx()); let ty = rvalue.ty(self.mir, self.cx.tcx());
let ty = self.monomorphize(&ty); let ty = self.monomorphize(&ty);
self.cx.layout_of(ty).is_zst() self.cx.spanned_layout_of(ty, span).is_zst()
// self.cx.layout_of(ty).is_zst()
} }
} }

View File

@ -193,6 +193,9 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> LayoutOf for InterpCx<'mir, 'tcx, M> {
.layout_of(self.param_env.and(ty)) .layout_of(self.param_env.and(ty))
.map_err(|layout| err_inval!(Layout(layout)).into()) .map_err(|layout| err_inval!(Layout(layout)).into())
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {

View File

@ -134,6 +134,9 @@ impl<'mir, 'tcx> LayoutOf for ConstPropagator<'mir, 'tcx> {
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
self.tcx.layout_of(self.param_env.and(ty)) self.tcx.layout_of(self.param_env.and(ty))
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
impl<'mir, 'tcx> HasDataLayout for ConstPropagator<'mir, 'tcx> { impl<'mir, 'tcx> HasDataLayout for ConstPropagator<'mir, 'tcx> {

View File

@ -13,6 +13,7 @@ use rustc::ty::Ty;
use rustc::ty::TyCtxt; use rustc::ty::TyCtxt;
use syntax::ast::Attribute; use syntax::ast::Attribute;
use syntax::symbol::sym; use syntax::symbol::sym;
use syntax::source_map::Span;
pub fn test_layout(tcx: TyCtxt<'_>) { pub fn test_layout(tcx: TyCtxt<'_>) {
if tcx.features().rustc_attrs { if tcx.features().rustc_attrs {
@ -116,6 +117,9 @@ impl LayoutOf for UnwrapLayoutCx<'tcx> {
fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout { fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
self.tcx.layout_of(self.param_env.and(ty)).unwrap() self.tcx.layout_of(self.param_env.and(ty)).unwrap()
} }
fn spanned_layout_of(&self, ty: Ty<'tcx>, _: Option<Span>) -> Self::TyLayout {
self.layout_of(ty)
}
} }
impl HasTyCtxt<'tcx> for UnwrapLayoutCx<'tcx> { impl HasTyCtxt<'tcx> for UnwrapLayoutCx<'tcx> {

View File

@ -9,6 +9,7 @@ use std::ops::{Add, Deref, Sub, Mul, AddAssign, Range, RangeInclusive};
use rustc_data_structures::newtype_index; use rustc_data_structures::newtype_index;
use rustc_data_structures::indexed_vec::{Idx, IndexVec}; use rustc_data_structures::indexed_vec::{Idx, IndexVec};
use syntax_pos::symbol::{sym, Symbol}; use syntax_pos::symbol::{sym, Symbol};
use syntax_pos::Span;
pub mod call; pub mod call;
@ -1012,6 +1013,7 @@ pub trait LayoutOf {
type TyLayout; type TyLayout;
fn layout_of(&self, ty: Self::Ty) -> Self::TyLayout; fn layout_of(&self, ty: Self::Ty) -> Self::TyLayout;
fn spanned_layout_of(&self, ty: Self::Ty, span: Option<Span>) -> Self::TyLayout;
} }
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]

View File

@ -1,4 +1,8 @@
error: the type `[u8; N]` is too big for the current architecture error: the type `[u8; N]` is too big for the current architecture
--> $DIR/huge-array-simple.rs:12:9
|
LL | let _fat : [u8; (1<<61)+(1<<31)] =
| ^^^^
error: aborting due to previous error error: aborting due to previous error

View File

@ -1,11 +1,10 @@
// error-pattern:; 1518600000
// FIXME https://github.com/rust-lang/rust/issues/59774 // FIXME https://github.com/rust-lang/rust/issues/59774
// normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> "" // normalize-stderr-test "thread.*panicked.*Metadata module not compiled.*\n" -> ""
// normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> "" // normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> ""
fn generic<T: Copy>(t: T) { fn generic<T: Copy>(t: T) {
let s: [T; 1518600000] = [t; 1518600000]; let s: [T; 1518600000] = [t; 1518600000];
//~^ ERROR the type `[[u8; 1518599999]; 1518600000]` is too big for the current architecture
} }
fn main() { fn main() {

View File

@ -1,4 +1,8 @@
error: the type `[[u8; 1518599999]; 1518600000]` is too big for the current architecture error: the type `[[u8; 1518599999]; 1518600000]` is too big for the current architecture
--> $DIR/huge-array.rs:6:9
|
LL | let s: [T; 1518600000] = [t; 1518600000];
| ^
error: aborting due to previous error error: aborting due to previous error

View File

@ -1,4 +1,8 @@
error: the type `[usize; N]` is too big for the current architecture error: the type `[usize; N]` is too big for the current architecture
--> $DIR/issue-15919.rs:15:9
|
LL | let x = [0usize; 0xffff_ffff_ffff_ffff];
| ^
error: aborting due to previous error error: aborting due to previous error