diff options
| author | Michael Goulet <michael@errs.io> | 2024-01-07 18:59:20 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-01-07 19:28:00 +0000 |
| commit | 68bb76634d916a5ea692f0a6bfae359e7ff556ab (patch) | |
| tree | 18398c36575c84fea0a163db6c86b2b0e9e256cb | |
| parent | fde0e98247dd4dd13af6cfe21f9eab2e54d50f12 (diff) | |
| download | rust-68bb76634d916a5ea692f0a6bfae359e7ff556ab.tar.gz rust-68bb76634d916a5ea692f0a6bfae359e7ff556ab.zip | |
Unions are not PointerLike
| -rw-r--r-- | compiler/rustc_target/src/abi/mod.rs | 4 | ||||
| -rw-r--r-- | tests/ui/dyn-star/union.rs | 16 | ||||
| -rw-r--r-- | tests/ui/dyn-star/union.stderr | 20 |
3 files changed, 38 insertions, 2 deletions
diff --git a/compiler/rustc_target/src/abi/mod.rs b/compiler/rustc_target/src/abi/mod.rs index a274790bffc..24e49ff648f 100644 --- a/compiler/rustc_target/src/abi/mod.rs +++ b/compiler/rustc_target/src/abi/mod.rs @@ -120,11 +120,11 @@ impl<'a> Layout<'a> { /// Whether the layout is from a type that implements [`std::marker::PointerLike`]. /// /// Currently, that means that the type is pointer-sized, pointer-aligned, - /// and has a scalar ABI. + /// and has a initialized (non-union), scalar ABI. pub fn is_pointer_like(self, data_layout: &TargetDataLayout) -> bool { self.size() == data_layout.pointer_size && self.align().abi == data_layout.pointer_align.abi - && matches!(self.abi(), Abi::Scalar(..)) + && matches!(self.abi(), Abi::Scalar(Scalar::Initialized { .. })) } } diff --git a/tests/ui/dyn-star/union.rs b/tests/ui/dyn-star/union.rs new file mode 100644 index 00000000000..ad3a85a937a --- /dev/null +++ b/tests/ui/dyn-star/union.rs @@ -0,0 +1,16 @@ +#![feature(dyn_star)] +//~^ WARN the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes + +union Union { + x: usize, +} + +trait Trait {} +impl Trait for Union {} + +fn bar(_: dyn* Trait) {} + +fn main() { + bar(Union { x: 0usize }); + //~^ ERROR `Union` needs to have the same ABI as a pointer +} diff --git a/tests/ui/dyn-star/union.stderr b/tests/ui/dyn-star/union.stderr new file mode 100644 index 00000000000..906eb4f5163 --- /dev/null +++ b/tests/ui/dyn-star/union.stderr @@ -0,0 +1,20 @@ +warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/union.rs:1:12 + | +LL | #![feature(dyn_star)] + | ^^^^^^^^ + | + = note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information + = note: `#[warn(incomplete_features)]` on by default + +error[E0277]: `Union` needs to have the same ABI as a pointer + --> $DIR/union.rs:14:9 + | +LL | bar(Union { x: 0usize }); + | ^^^^^^^^^^^^^^^^^^^ `Union` needs to be a pointer-like type + | + = help: the trait `PointerLike` is not implemented for `Union` + +error: aborting due to 1 previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. |
