Skip to content

Commit 95602a7

Browse files
committed
Add trivial cast lints.
This permits all coercions to be performed in casts, but adds lints to warn in those cases. Part of this patch moves cast checking to a later stage of type checking. We acquire obligations to check casts as part of type checking where we previously checked them. Once we have type checked a function or module, then we check any cast obligations which have been acquired. That means we have more type information available to check casts (this was crucial to making coercions work properly in place of some casts), but it means that casts cannot feed input into type inference. [breaking change] * Adds two new lints for trivial casts and trivial numeric casts, these are warn by default, but can cause errors if you build with warnings as errors. Previously, trivial numeric casts and casts to trait objects were allowed. * The unused casts lint has gone. * Interactions between casting and type inference have changed in subtle ways. Two ways this might manifest are: - You may need to 'direct' casts more with extra type information, for example, in some cases where `foo as _ as T` succeeded, you may now need to specify the type for `_` - Casts do not influence inference of integer types. E.g., the following used to type check: ``` let x = 42; let y = &x as *const u32; ``` Because the cast would inform inference that `x` must have type `u32`. This no longer applies and the compiler will fallback to `i32` for `x` and thus there will be a type error in the cast. The solution is to add more type information: ``` let x: u32 = 42; let y = &x as *const u32; ```
1 parent ed81038 commit 95602a7

File tree

90 files changed

+287
-449
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+287
-449
lines changed

src/libarena/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,8 @@ impl<T> TypedArenaChunk<T> {
429429
// Destroy the next chunk.
430430
let next = self.next;
431431
let size = calculate_size::<T>(self.capacity);
432-
deallocate(self as *mut TypedArenaChunk<T> as *mut u8, size,
432+
let self_ptr: *mut TypedArenaChunk<T> = self;
433+
deallocate(self_ptr as *mut u8, size,
433434
mem::min_align_of::<TypedArenaChunk<T>>());
434435
if !next.is_null() {
435436
let capacity = (*next).capacity;

src/libcollections/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
html_playground_url = "http://play.rust-lang.org/")]
2525
#![doc(test(no_crate_inject))]
2626

27+
#![allow(trivial_cast)]
28+
#![allow(trivial_numeric_cast)]
2729
#![feature(alloc)]
2830
#![feature(box_syntax)]
2931
#![feature(box_patterns)]

src/libcollections/vec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,8 +1199,8 @@ impl<T: PartialEq> Vec<T> {
11991199

12001200
// Avoid bounds checks by using unsafe pointers.
12011201
let p = self.as_mut_ptr();
1202-
let mut r = 1;
1203-
let mut w = 1;
1202+
let mut r: usize = 1;
1203+
let mut w: usize = 1;
12041204

12051205
while r < ln {
12061206
let p_r = p.offset(r as isize);

src/libcore/cell.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,11 @@ impl<T> UnsafeCell<T> {
713713
/// ```
714714
#[inline]
715715
#[stable(feature = "rust1", since = "1.0.0")]
716-
pub fn get(&self) -> *mut T { &self.value as *const T as *mut T }
716+
pub fn get(&self) -> *mut T {
717+
// FIXME(#23542) Replace with type ascription.
718+
#![allow(trivial_cast)]
719+
&self.value as *const T as *mut T
720+
}
717721

718722
/// Unwraps the value
719723
///

src/libcore/fmt/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,20 +833,26 @@ impl<T> Pointer for *const T {
833833
#[stable(feature = "rust1", since = "1.0.0")]
834834
impl<T> Pointer for *mut T {
835835
fn fmt(&self, f: &mut Formatter) -> Result {
836+
// FIXME(#23542) Replace with type ascription.
837+
#![allow(trivial_cast)]
836838
Pointer::fmt(&(*self as *const T), f)
837839
}
838840
}
839841

840842
#[stable(feature = "rust1", since = "1.0.0")]
841843
impl<'a, T> Pointer for &'a T {
842844
fn fmt(&self, f: &mut Formatter) -> Result {
845+
// FIXME(#23542) Replace with type ascription.
846+
#![allow(trivial_cast)]
843847
Pointer::fmt(&(*self as *const T), f)
844848
}
845849
}
846850

847851
#[stable(feature = "rust1", since = "1.0.0")]
848852
impl<'a, T> Pointer for &'a mut T {
849853
fn fmt(&self, f: &mut Formatter) -> Result {
854+
// FIXME(#23542) Replace with type ascription.
855+
#![allow(trivial_cast)]
850856
Pointer::fmt(&(&**self as *const T), f)
851857
}
852858
}

src/libcore/fmt/num.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// FIXME: #6220 Implement floating point formatting
1414

1515
#![allow(unsigned_negation)]
16+
#![allow(trivial_numeric_cast)]
1617

1718
use fmt;
1819
use iter::IteratorExt;

src/libcore/hash/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ mod impls {
182182
}
183183

184184
fn hash_slice<H: Hasher>(data: &[$ty], state: &mut H) {
185+
// FIXME(#23542) Replace with type ascription.
186+
#![allow(trivial_cast)]
185187
let newlen = data.len() * ::$ty::BYTES as usize;
186188
let ptr = data.as_ptr() as *const u8;
187189
state.write(unsafe { slice::from_raw_parts(ptr, newlen) })

src/libcore/mem.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ pub fn drop<T>(_x: T) { }
313313
#[inline]
314314
#[stable(feature = "rust1", since = "1.0.0")]
315315
pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
316+
// FIXME(#23542) Replace with type ascription.
317+
#![allow(trivial_cast)]
316318
ptr::read(src as *const T as *const U)
317319
}
318320

src/libcore/num/i16.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
1313
#![stable(feature = "rust1", since = "1.0.0")]
1414
#![doc(primitive = "i16")]
15+
#![allow(trivial_numeric_cast)]
1516

1617
int_module! { i16, 16 }

src/libcore/num/i32.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
1313
#![stable(feature = "rust1", since = "1.0.0")]
1414
#![doc(primitive = "i32")]
15+
#![allow(trivial_numeric_cast)]
1516

1617
int_module! { i32, 32 }

0 commit comments

Comments
 (0)