diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-01-25 12:48:55 -0600 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2018-01-25 13:49:47 -0800 |
| commit | 8dd36af9cb183200cd96eb87885dfcfa132f4c51 (patch) | |
| tree | d09180eca12a89b7169c7e9da5b78db32ae3988a | |
| parent | 4856f07bb5dd3e946247c92e27ef59db079f3dcf (diff) | |
| parent | 51fe2fe07fc81e177fe9b822bc4db91e51837e45 (diff) | |
| download | rust-8dd36af9cb183200cd96eb87885dfcfa132f4c51.tar.gz rust-8dd36af9cb183200cd96eb87885dfcfa132f4c51.zip | |
Rollup merge of #47626 - eddyb:one-less-unwrap, r=nagisa
rustc_trans: remove an unwrap by replacing a bool with Result. Prompted by @shepmaster. r? @nagisa
| -rw-r--r-- | src/librustc_trans/cabi_x86_64.rs | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/src/librustc_trans/cabi_x86_64.rs b/src/librustc_trans/cabi_x86_64.rs index 0dc72541b42..62bac8469ce 100644 --- a/src/librustc_trans/cabi_x86_64.rs +++ b/src/librustc_trans/cabi_x86_64.rs @@ -182,44 +182,48 @@ pub fn compute_abi_info<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, fty: &mut FnType<'tc let mut sse_regs = 8; // XMM0-7 let mut x86_64_ty = |arg: &mut ArgType<'tcx>, is_arg: bool| { - let cls = classify_arg(cx, arg); + let mut cls_or_mem = classify_arg(cx, arg); let mut needed_int = 0; let mut needed_sse = 0; - let in_mem = match cls { - Err(Memory) => true, - Ok(ref cls) if is_arg => { - for &c in cls { + if is_arg { + if let Ok(cls) = cls_or_mem { + for &c in &cls { match c { Some(Class::Int) => needed_int += 1, Some(Class::Sse) => needed_sse += 1, _ => {} } } - arg.layout.is_aggregate() && - (int_regs < needed_int || sse_regs < needed_sse) + if arg.layout.is_aggregate() { + if int_regs < needed_int || sse_regs < needed_sse { + cls_or_mem = Err(Memory); + } + } } - Ok(_) => false - }; + } - if in_mem { - if is_arg { - arg.make_indirect_byval(); - } else { - // `sret` parameter thus one less integer register available - arg.make_indirect(); - int_regs -= 1; + match cls_or_mem { + Err(Memory) => { + if is_arg { + arg.make_indirect_byval(); + } else { + // `sret` parameter thus one less integer register available + arg.make_indirect(); + int_regs -= 1; + } } - } else { - // split into sized chunks passed individually - int_regs -= needed_int; - sse_regs -= needed_sse; - - if arg.layout.is_aggregate() { - let size = arg.layout.size; - arg.cast_to(cast_target(cls.as_ref().unwrap(), size)) - } else { - arg.extend_integer_width_to(32); + Ok(ref cls) => { + // split into sized chunks passed individually + int_regs -= needed_int; + sse_regs -= needed_sse; + + if arg.layout.is_aggregate() { + let size = arg.layout.size; + arg.cast_to(cast_target(cls, size)) + } else { + arg.extend_integer_width_to(32); + } } } }; |
