about summary refs log tree commit diff
path: root/tests/ui-fulldeps/rustc_public/compilation-result.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui-fulldeps/rustc_public/compilation-result.rs')
-rw-r--r--tests/ui-fulldeps/rustc_public/compilation-result.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/tests/ui-fulldeps/rustc_public/compilation-result.rs b/tests/ui-fulldeps/rustc_public/compilation-result.rs
new file mode 100644
index 00000000000..d33e602e819
--- /dev/null
+++ b/tests/ui-fulldeps/rustc_public/compilation-result.rs
@@ -0,0 +1,86 @@
+//@ run-pass
+// Test StableMIR behavior when different results are given
+
+//@ ignore-stage1
+//@ ignore-cross-compile
+//@ ignore-remote
+//@ edition: 2021
+
+#![feature(rustc_private)]
+#![feature(assert_matches)]
+
+extern crate rustc_middle;
+
+extern crate rustc_driver;
+extern crate rustc_interface;
+#[macro_use]
+extern crate rustc_public;
+
+use std::io::Write;
+
+/// This test will generate and analyze a dummy crate using the stable mir.
+/// For that, it will first write the dummy crate into a file.
+/// Then it will create a `RustcPublic` using custom arguments and then
+/// it will run the compiler.
+fn main() {
+    let path = "input_compilation_result_test.rs";
+    generate_input(&path).unwrap();
+    let args = &["rustc".to_string(), path.to_string()];
+    test_continue(args);
+    test_break(args);
+    test_failed(args);
+    test_skipped(args);
+    test_captured(args)
+}
+
+fn test_continue(args: &[String]) {
+    let result = run!(args, || ControlFlow::Continue::<(), bool>(true));
+    assert_eq!(result, Ok(true));
+}
+
+fn test_break(args: &[String]) {
+    let result = run!(args, || ControlFlow::Break::<bool, i32>(false));
+    assert_eq!(result, Err(rustc_public::CompilerError::Interrupted(false)));
+}
+
+#[allow(unreachable_code)]
+fn test_skipped(args: &[String]) {
+    let mut args = args.to_vec();
+    args.push("--version".to_string());
+    let result = run!(&args, || unreachable!() as ControlFlow<()>);
+    assert_eq!(result, Err(rustc_public::CompilerError::Skipped));
+}
+
+#[allow(unreachable_code)]
+fn test_failed(args: &[String]) {
+    let mut args = args.to_vec();
+    args.push("--cfg=broken".to_string());
+    let result = run!(&args, || unreachable!() as ControlFlow<()>);
+    assert_eq!(result, Err(rustc_public::CompilerError::Failed));
+}
+
+/// Test that we are able to pass a closure and set the return according to the captured value.
+fn test_captured(args: &[String]) {
+    let captured = "10".to_string();
+    let result = run!(args, || ControlFlow::Continue::<(), usize>(captured.len()));
+    assert_eq!(result, Ok(captured.len()));
+}
+
+fn generate_input(path: &str) -> std::io::Result<()> {
+    let mut file = std::fs::File::create(path)?;
+    write!(
+        file,
+        r#"
+    // This should trigger a compilation failure when enabled.
+    #[cfg(broken)]
+    mod broken_mod {{
+        fn call_invalid() {{
+            invalid_fn();
+        }}
+    }}
+
+    fn main() {{}}
+    "#
+    )?;
+    Ok(())
+}