diff options
| author | Tim Diekmann <tim.diekmann@3dvision.de> | 2019-04-30 14:38:17 +0200 |
|---|---|---|
| committer | Tim Diekmann <tim.diekmann@3dvision.de> | 2019-04-30 14:38:17 +0200 |
| commit | 1b679e74f050bc3ff40452e4d4c82d3fc4b03cf4 (patch) | |
| tree | b9a7c1a5ccbbb548fbe9bb10e5ccbf70ec321446 | |
| parent | abf73a6aebbe505694392736e543502c240841db (diff) | |
| download | rust-1b679e74f050bc3ff40452e4d4c82d3fc4b03cf4.tar.gz rust-1b679e74f050bc3ff40452e4d4c82d3fc4b03cf4.zip | |
Only allow ZSTs with 1 byte alignment
| -rw-r--r-- | src/librustc_typeck/coherence/builtin.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/invalid_dispatch_from_dyn_impls.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/invalid_dispatch_from_dyn_impls.stderr | 15 |
3 files changed, 25 insertions, 5 deletions
diff --git a/src/librustc_typeck/coherence/builtin.rs b/src/librustc_typeck/coherence/builtin.rs index dc5b461ac14..1be0248727d 100644 --- a/src/librustc_typeck/coherence/builtin.rs +++ b/src/librustc_typeck/coherence/builtin.rs @@ -227,8 +227,8 @@ fn visit_implementation_of_dispatch_from_dyn<'a, 'tcx>( let ty_b = field.ty(tcx, substs_b); if let Ok(layout) = tcx.layout_of(param_env.and(ty_a)) { - if layout.is_zst() { - // ignore ZST fields + if layout.is_zst() && layout.details.align.abi.bytes() == 1 { + // ignore ZST fields with alignment of 1 byte return None; } } @@ -238,7 +238,7 @@ fn visit_implementation_of_dispatch_from_dyn<'a, 'tcx>( create_err( "the trait `DispatchFromDyn` may only be implemented \ for structs containing the field being coerced, \ - ZST fields, and nothing else" + ZST fields with 1 byte alignment, and nothing else" ).note( &format!( "extra field `{}` of type `{}` is not allowed", diff --git a/src/test/ui/invalid_dispatch_from_dyn_impls.rs b/src/test/ui/invalid_dispatch_from_dyn_impls.rs index c4716893fbc..b7bc766fbe0 100644 --- a/src/test/ui/invalid_dispatch_from_dyn_impls.rs +++ b/src/test/ui/invalid_dispatch_from_dyn_impls.rs @@ -39,4 +39,13 @@ where T: Unsize<U>, {} //~^^^ ERROR [E0378] +#[repr(align(64))] +struct OverAlignedZst; +struct OverAligned<T: ?Sized>(Box<T>, OverAlignedZst); + +impl<T: ?Sized, U: ?Sized> DispatchFromDyn<OverAligned<U>> for OverAligned<T> + where + T: Unsize<U>, +{} //~^^^ ERROR [E0378] + fn main() {} diff --git a/src/test/ui/invalid_dispatch_from_dyn_impls.stderr b/src/test/ui/invalid_dispatch_from_dyn_impls.stderr index 624f35d062c..6d62d4fd071 100644 --- a/src/test/ui/invalid_dispatch_from_dyn_impls.stderr +++ b/src/test/ui/invalid_dispatch_from_dyn_impls.stderr @@ -1,4 +1,4 @@ -error[E0378]: the trait `DispatchFromDyn` may only be implemented for structs containing the field being coerced, ZST fields, and nothing else +error[E0378]: the trait `DispatchFromDyn` may only be implemented for structs containing the field being coerced, ZST fields with 1 byte alignment, and nothing else --> $DIR/invalid_dispatch_from_dyn_impls.rs:10:1 | LL | / impl<T, U> DispatchFromDyn<WrapperWithExtraField<U>> for WrapperWithExtraField<T> @@ -36,6 +36,17 @@ LL | | T: Unsize<U>, LL | | {} | |__^ -error: aborting due to 4 previous errors +error[E0378]: the trait `DispatchFromDyn` may only be implemented for structs containing the field being coerced, ZST fields with 1 byte alignment, and nothing else + --> $DIR/invalid_dispatch_from_dyn_impls.rs:46:1 + | +LL | / impl<T: ?Sized, U: ?Sized> DispatchFromDyn<OverAligned<U>> for OverAligned<T> +LL | | where +LL | | T: Unsize<U>, +LL | | {} + | |__^ + | + = note: extra field `1` of type `OverAlignedZst` is not allowed + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0378`. |
