about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-08-17 17:00:45 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-08-17 23:32:30 -0700
commit8a7b0fad531f2cbb40aace2bdfb5f03060a61d33 (patch)
tree99e9e41afaf66e95fcd789d1da50ef83de859b6e /src/test
parent47ea0cfb6bd250c970e3a61d62bfa1b1c7bb27d4 (diff)
downloadrust-8a7b0fad531f2cbb40aace2bdfb5f03060a61d33.tar.gz
rust-8a7b0fad531f2cbb40aace2bdfb5f03060a61d33.zip
trans: Call `fmod` manually for 32-bit float rem
Currently `f32 % f32` will generate a link error on 32-bit MSVC because LLVM
will lower the operation to a call to the nonexistent function `fmodf`. Work
around in this in the backend by lowering to a call to `fmod` instead with
necessary extension/truncation between floats/doubles.

Closes #27859
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/issue-27859.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-27859.rs b/src/test/run-pass/issue-27859.rs
new file mode 100644
index 00000000000..900614be612
--- /dev/null
+++ b/src/test/run-pass/issue-27859.rs
@@ -0,0 +1,27 @@
+// Copyright 2015 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#[inline(never)]
+fn foo(a: f32, b: f32) -> f32 {
+    a % b
+}
+
+#[inline(never)]
+fn bar(a: f32, b: f32) -> f32 {
+    ((a as f64) % (b as f64)) as f32
+}
+
+fn main() {
+    let unknown_float = std::env::args().len();
+    println!("{}", foo(4.0, unknown_float as f32));
+    println!("{}", foo(5.0, (unknown_float as f32) + 1.0));
+    println!("{}", bar(6.0, (unknown_float as f32) + 2.0));
+    println!("{}", bar(7.0, (unknown_float as f32) + 3.0));
+}