Check both align and size in PointerSized
This commit is contained in:
parent
da3c5397a6
commit
b3da04aa52
4 changed files with 50 additions and 1 deletions
|
@ -1069,7 +1069,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
let usize_layout =
|
||||
self.tcx().layout_of(ty::ParamEnv::empty().and(self.tcx().types.usize)).unwrap().layout;
|
||||
if let Ok(layout) = self.tcx().layout_of(obligation.param_env.and(self_ty))
|
||||
&& layout.layout.size().bytes() == usize_layout.size().bytes()
|
||||
&& layout.layout.size() == usize_layout.size()
|
||||
&& layout.layout.align() == usize_layout.align()
|
||||
{
|
||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||
}
|
||||
|
|
11
src/test/ui/dyn-star/align.normal.stderr
Normal file
11
src/test/ui/dyn-star/align.normal.stderr
Normal file
|
@ -0,0 +1,11 @@
|
|||
warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/align.rs:4:12
|
||||
|
|
||||
LL | #![feature(dyn_star)]
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
20
src/test/ui/dyn-star/align.over_aligned.stderr
Normal file
20
src/test/ui/dyn-star/align.over_aligned.stderr
Normal file
|
@ -0,0 +1,20 @@
|
|||
warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/align.rs:4:12
|
||||
|
|
||||
LL | #![feature(dyn_star)]
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error[E0277]: `AlignedUsize` needs to be a pointer-sized type
|
||||
--> $DIR/align.rs:15:13
|
||||
|
|
||||
LL | let x = AlignedUsize(12) as dyn* Debug;
|
||||
| ^^^^^^^^^^^^^^^^ `AlignedUsize` needs to be a pointer-sized type
|
||||
|
|
||||
= help: the trait `PointerSized` is not implemented for `AlignedUsize`
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
17
src/test/ui/dyn-star/align.rs
Normal file
17
src/test/ui/dyn-star/align.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
// revisions: normal over_aligned
|
||||
//[normal] check-pass
|
||||
|
||||
#![feature(dyn_star)]
|
||||
//~^ WARN the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
|
||||
use std::fmt::Debug;
|
||||
|
||||
#[cfg_attr(over_aligned, repr(C, align(1024)))]
|
||||
#[cfg_attr(not(over_aligned), repr(C))]
|
||||
#[derive(Debug)]
|
||||
struct AlignedUsize(usize);
|
||||
|
||||
fn main() {
|
||||
let x = AlignedUsize(12) as dyn* Debug;
|
||||
//[over_aligned]~^ ERROR `AlignedUsize` needs to be a pointer-sized type
|
||||
}
|
Loading…
Add table
Reference in a new issue