From e93de9556a63a4743bd286cda73e4b505916c599 Mon Sep 17 00:00:00 2001 From: varkor Date: Thu, 12 Jul 2018 09:10:39 -0700 Subject: [PATCH] Fix ICE when using a pointer cast as array size --- src/librustc/ty/relate.rs | 7 ++++++- src/test/ui/issue-52023-array-size-pointer-cast.rs | 13 +++++++++++++ .../ui/issue-52023-array-size-pointer-cast.stderr | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issue-52023-array-size-pointer-cast.rs create mode 100644 src/test/ui/issue-52023-array-size-pointer-cast.stderr diff --git a/src/librustc/ty/relate.rs b/src/librustc/ty/relate.rs index 265c6aee39726..4e8f33d6a4a03 100644 --- a/src/librustc/ty/relate.rs +++ b/src/librustc/ty/relate.rs @@ -20,6 +20,7 @@ use ty::{self, Ty, TyCtxt, TypeFoldable}; use ty::error::{ExpectedFound, TypeError}; use mir::interpret::GlobalId; use util::common::ErrorReported; +use syntax_pos::DUMMY_SP; use std::rc::Rc; use std::iter; use rustc_target::spec::abi; @@ -503,7 +504,11 @@ pub fn super_relate_tys<'a, 'gcx, 'tcx, R>(relation: &mut R, "array length could not be evaluated"); Err(ErrorReported) } - _ => bug!("arrays should not have {:?} as length", x) + _ => { + tcx.sess.delay_span_bug(DUMMY_SP, + &format!("arrays should not have {:?} as length", x)); + Err(ErrorReported) + } } }; match (to_u64(sz_a), to_u64(sz_b)) { diff --git a/src/test/ui/issue-52023-array-size-pointer-cast.rs b/src/test/ui/issue-52023-array-size-pointer-cast.rs new file mode 100644 index 0000000000000..f3bee1a631580 --- /dev/null +++ b/src/test/ui/issue-52023-array-size-pointer-cast.rs @@ -0,0 +1,13 @@ +// Copyright 2018 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let _ = [0; (&0 as *const i32) as usize]; //~ ERROR raw pointers cannot be cast +} diff --git a/src/test/ui/issue-52023-array-size-pointer-cast.stderr b/src/test/ui/issue-52023-array-size-pointer-cast.stderr new file mode 100644 index 0000000000000..888de82e379c8 --- /dev/null +++ b/src/test/ui/issue-52023-array-size-pointer-cast.stderr @@ -0,0 +1,9 @@ +error[E0018]: raw pointers cannot be cast to integers in constants + --> $DIR/issue-52023-array-size-pointer-cast.rs:12:17 + | +LL | let _ = [0; (&0 as *const i32) as usize]; //~ ERROR raw pointers cannot be cast + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0018`.