From ecce274e56e1da80dff66f9d8886c7645f129244 Mon Sep 17 00:00:00 2001 From: cjkenn Date: Wed, 16 May 2018 20:02:01 -0700 Subject: [PATCH 1/2] use if let to avoid potential div by zero remove semicolon -_- Add rem_bytes to conditional to avoid error when performing mod by 0 Add test file to confirm compilation passes. Ensure we don't divide or mod by zero in llvm_type. Include test file from issue. --- src/librustc_codegen_llvm/abi.rs | 8 ++++++-- src/test/ui/issue-50761.rs | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/issue-50761.rs diff --git a/src/librustc_codegen_llvm/abi.rs b/src/librustc_codegen_llvm/abi.rs index 25c598c532c..221012903d9 100644 --- a/src/librustc_codegen_llvm/abi.rs +++ b/src/librustc_codegen_llvm/abi.rs @@ -127,8 +127,12 @@ impl LlvmType for Reg { impl LlvmType for CastTarget { fn llvm_type(&self, cx: &CodegenCx) -> Type { let rest_ll_unit = self.rest.unit.llvm_type(cx); - let rest_count = self.rest.total.bytes() / self.rest.unit.size.bytes(); - let rem_bytes = self.rest.total.bytes() % self.rest.unit.size.bytes(); + let (rest_count, rem_bytes) = if self.rest.unit.size.bytes() == 0 { + (0, 0) + } else { + (self.rest.total.bytes() / self.rest.unit.size.bytes(), + self.rest.total.bytes() % self.rest.unit.size.bytes()) + }; if self.prefix.iter().all(|x| x.is_none()) { // Simplify to a single unit when there is no prefix and size <= unit size diff --git a/src/test/ui/issue-50761.rs b/src/test/ui/issue-50761.rs new file mode 100644 index 00000000000..534d483dc42 --- /dev/null +++ b/src/test/ui/issue-50761.rs @@ -0,0 +1,35 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Confirm that we don't accidently divide or mod by zero in llvm_type + +// compile-pass + +#![feature(test)] + +mod a { + pub trait A {} +} + +mod b { + pub struct Builder {} + + pub fn new() -> Builder { + Builder {} + } + + impl Builder { + pub fn with_a(&mut self, _a: fn() -> ::a::A) {} + } +} + +pub use self::b::new; + +fn main() {} From 8d9a87c14d9c5abe433444a641282ae1afb0577d Mon Sep 17 00:00:00 2001 From: cjkenn Date: Sat, 19 May 2018 13:01:28 -0700 Subject: [PATCH 2/2] remove feature line from test --- src/test/ui/issue-50761.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/ui/issue-50761.rs b/src/test/ui/issue-50761.rs index 534d483dc42..b8a7a089c23 100644 --- a/src/test/ui/issue-50761.rs +++ b/src/test/ui/issue-50761.rs @@ -12,8 +12,6 @@ // compile-pass -#![feature(test)] - mod a { pub trait A {} }