about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryvt <i@yvt.jp>2022-04-25 21:19:42 +0900
committeryvt <i@yvt.jp>2022-04-30 09:53:06 +0900
commit63ffdfdd1776afa2e82bbd3d2ff8ff7b7f0d5b67 (patch)
tree12a50fb5d959adc1716ea9e0946df77387c8c1f6
parent5d25b8fc45f66cdd1b19c87cce38eda86141dcf8 (diff)
downloadrust-63ffdfdd1776afa2e82bbd3d2ff8ff7b7f0d5b67.tar.gz
rust-63ffdfdd1776afa2e82bbd3d2ff8ff7b7f0d5b67.zip
Add compilation tests with optimization enabled
Introduces a new variant of `tests/lib.rs` that compiles the source
files in `tests/run` with `-Copt-level=3`.
-rw-r--r--Cargo.toml8
-rw-r--r--tests/lang_tests_common.rs (renamed from tests/lib.rs)20
-rw-r--r--tests/lang_tests_debug.rs5
-rw-r--r--tests/lang_tests_release.rs5
-rw-r--r--tests/run/int_overflow.rs17
5 files changed, 49 insertions, 6 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 86278b46983..211d19a8dc8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,8 +9,12 @@ license = "MIT OR Apache-2.0"
 crate-type = ["dylib"]
 
 [[test]]
-name = "lang_tests"
-path = "tests/lib.rs"
+name = "lang_tests_debug"
+path = "tests/lang_tests_debug.rs"
+harness = false
+[[test]]
+name = "lang_tests_release"
+path = "tests/lang_tests_release.rs"
 harness = false
 
 [features]
diff --git a/tests/lib.rs b/tests/lang_tests_common.rs
index 8ee35b30bc8..8e378177e24 100644
--- a/tests/lib.rs
+++ b/tests/lang_tests_common.rs
@@ -1,3 +1,4 @@
+//! The common code for `tests/lang_tests_*.rs`
 use std::{
     env::{self, current_dir},
     path::PathBuf,
@@ -7,7 +8,15 @@ use std::{
 use lang_tester::LangTester;
 use tempfile::TempDir;
 
-fn main() {
+/// Controls the compile options (e.g., optimization level) used to compile
+/// test code.
+#[allow(dead_code)] // Each test crate picks one variant
+pub enum Profile {
+    Debug,
+    Release,
+}
+
+pub fn main_inner(profile: Profile) {
     let tempdir = TempDir::new().expect("temp dir");
     let current_dir = current_dir().expect("current dir");
     let current_dir = current_dir.to_str().expect("current dir").to_string();
@@ -42,6 +51,15 @@ fn main() {
                 "-o", exe.to_str().expect("to_str"),
                 path.to_str().expect("to_str"),
             ]);
+            match profile {
+                Profile::Debug => {}
+                Profile::Release => {
+                    compiler.args(&[
+                        "-C", "opt-level=3",
+                        "-C", "lto=no",
+                    ]);
+                }
+            }
             // Test command 2: run `tempdir/x`.
             let runtime = Command::new(exe);
             vec![("Compiler", compiler), ("Run-time", runtime)]
diff --git a/tests/lang_tests_debug.rs b/tests/lang_tests_debug.rs
new file mode 100644
index 00000000000..96bd74883ff
--- /dev/null
+++ b/tests/lang_tests_debug.rs
@@ -0,0 +1,5 @@
+mod lang_tests_common;
+
+fn main() {
+    lang_tests_common::main_inner(lang_tests_common::Profile::Debug);
+}
diff --git a/tests/lang_tests_release.rs b/tests/lang_tests_release.rs
new file mode 100644
index 00000000000..35d5d60c33e
--- /dev/null
+++ b/tests/lang_tests_release.rs
@@ -0,0 +1,5 @@
+mod lang_tests_common;
+
+fn main() {
+    lang_tests_common::main_inner(lang_tests_common::Profile::Release);
+}
diff --git a/tests/run/int_overflow.rs b/tests/run/int_overflow.rs
index 6477b839828..ea2c5add962 100644
--- a/tests/run/int_overflow.rs
+++ b/tests/run/int_overflow.rs
@@ -1,7 +1,7 @@
 // Compiler:
 //
 // Run-time:
-//   stdout: Panicking
+//   stdout: Success
 //   status: signal
 
 #![allow(unused_attributes)]
@@ -64,7 +64,9 @@ mod intrinsics {
 #[no_mangle]
 pub fn panic(_msg: &str) -> ! {
     unsafe {
-        libc::puts("Panicking\0" as *const str as *const u8);
+        // Panicking is expected iff overflow checking is enabled.
+        #[cfg(debug_assertions)]
+        libc::puts("Success\0" as *const str as *const u8);
         libc::fflush(libc::stdout);
         intrinsics::abort();
     }
@@ -124,6 +126,15 @@ impl Add for isize {
 #[start]
 fn main(mut argc: isize, _argv: *const *const u8) -> isize {
     let int = 9223372036854775807isize;
-    let int = int + argc;
+    let int = int + argc;  // overflow
+
+    // If overflow checking is disabled, we should reach here.
+    #[cfg(not(debug_assertions))]
+    unsafe {
+        libc::puts("Success\0" as *const str as *const u8);
+        libc::fflush(libc::stdout);
+        intrinsics::abort();
+    }
+
     int
 }