diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-01-25 12:48:46 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-25 12:48:46 -0600 |
| commit | 6eb14305473e4afa393ea49ee49d7a70853eaf37 (patch) | |
| tree | 0978b59ffb918e04793c27cfd79a0c23015f3eb8 | |
| parent | fe2fb24228dfdebf9626ceb8422d6c21c4e354cd (diff) | |
| parent | 9b95e914a1f6537563b885c2ffbdb069e64cc14c (diff) | |
| download | rust-6eb14305473e4afa393ea49ee49d7a70853eaf37.tar.gz rust-6eb14305473e4afa393ea49ee49d7a70853eaf37.zip | |
Rollup merge of #47439 - eddyb:issue-45662, r=nagisa
rustc_trans: ignore trailing padding larger than 8 bytes. Fixes #45662 by ignoring a missing second register component, as it could be entirely padding.
| -rw-r--r-- | src/librustc_trans/cabi_x86_64.rs | 12 | ||||
| -rw-r--r-- | src/test/run-pass/align-with-extern-c-fn.rs | 8 |
2 files changed, 10 insertions, 10 deletions
diff --git a/src/librustc_trans/cabi_x86_64.rs b/src/librustc_trans/cabi_x86_64.rs index 630762602d0..0dc72541b42 100644 --- a/src/librustc_trans/cabi_x86_64.rs +++ b/src/librustc_trans/cabi_x86_64.rs @@ -167,12 +167,12 @@ fn cast_target(cls: &[Option<Class>], size: Size) -> CastTarget { let mut i = 0; let lo = reg_component(cls, &mut i, size).unwrap(); let offset = Size::from_bytes(8) * (i as u64); - let target = if size <= offset { - CastTarget::from(lo) - } else { - let hi = reg_component(cls, &mut i, size - offset).unwrap(); - CastTarget::Pair(lo, hi) - }; + let mut target = CastTarget::from(lo); + if size > offset { + if let Some(hi) = reg_component(cls, &mut i, size - offset) { + target = CastTarget::Pair(lo, hi); + } + } assert_eq!(reg_component(cls, &mut i, Size::from_bytes(0)), None); target } diff --git a/src/test/run-pass/align-with-extern-c-fn.rs b/src/test/run-pass/align-with-extern-c-fn.rs index db25960df4c..15e3b4b03eb 100644 --- a/src/test/run-pass/align-with-extern-c-fn.rs +++ b/src/test/run-pass/align-with-extern-c-fn.rs @@ -14,10 +14,10 @@ #![feature(attr_literals)] #[repr(align(16))] -pub struct A { - y: i64, -} +pub struct A(i64); pub extern "C" fn foo(x: A) {} -fn main() {} +fn main() { + foo(A(0)); +} |
