summaryrefslogtreecommitdiffstats
path: root/tests/ui-fulldeps
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 18:31:44 +0000
commitc23a457e72abe608715ac76f076f47dc42af07a5 (patch)
tree2772049aaf84b5c9d0ed12ec8d86812f7a7904b6 /tests/ui-fulldeps
parentReleasing progress-linux version 1.73.0+dfsg1-1~progress7.99u1. (diff)
downloadrustc-c23a457e72abe608715ac76f076f47dc42af07a5.tar.xz
rustc-c23a457e72abe608715ac76f076f47dc42af07a5.zip
Merging upstream version 1.74.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui-fulldeps')
-rw-r--r--tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs2
-rw-r--r--tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs1
-rw-r--r--tests/ui-fulldeps/internal-lints/ty_tykind_usage.stderr32
-rw-r--r--tests/ui-fulldeps/lint-pass-macros.rs2
-rw-r--r--tests/ui-fulldeps/plugin/auxiliary/lint-group-plugin-test.rs3
-rw-r--r--tests/ui-fulldeps/plugin/auxiliary/lint-plugin-test.rs6
-rw-r--r--tests/ui-fulldeps/plugin/auxiliary/lint-tool-test.rs6
-rw-r--r--tests/ui-fulldeps/plugin/lint-group-plugin-deny-cmdline.stderr2
-rw-r--r--tests/ui-fulldeps/plugin/lint-tool-cmdline-allow.stderr10
-rw-r--r--tests/ui-fulldeps/pprust-expr-roundtrip.rs20
-rw-r--r--tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.rs2
-rw-r--r--tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.stderr2
-rw-r--r--tests/ui-fulldeps/stable-mir/compilation-result.rs78
-rw-r--r--tests/ui-fulldeps/stable-mir/crate-info.rs117
14 files changed, 199 insertions, 84 deletions
diff --git a/tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs b/tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs
index f6f0c0385..fa6734b6c 100644
--- a/tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs
+++ b/tests/ui-fulldeps/internal-lints/lint_pass_impl_without_macro.rs
@@ -6,7 +6,7 @@
extern crate rustc_middle;
extern crate rustc_session;
-use rustc_session::lint::{LintArray, LintPass};
+use rustc_session::lint::{LintPass, LintVec};
use rustc_session::{declare_lint, declare_lint_pass, impl_lint_pass};
declare_lint! {
diff --git a/tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs b/tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs
index bf655510a..3f7429a5f 100644
--- a/tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs
+++ b/tests/ui-fulldeps/internal-lints/ty_tykind_usage.rs
@@ -31,7 +31,6 @@ fn main() {
TyKind::Closure(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
TyKind::Generator(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
TyKind::GeneratorWitness(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
- TyKind::GeneratorWitnessMIR(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
TyKind::Never => (), //~ ERROR usage of `ty::TyKind::<kind>`
TyKind::Tuple(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
TyKind::Alias(..) => (), //~ ERROR usage of `ty::TyKind::<kind>`
diff --git a/tests/ui-fulldeps/internal-lints/ty_tykind_usage.stderr b/tests/ui-fulldeps/internal-lints/ty_tykind_usage.stderr
index 9f8c0bea0..1f49d6b64 100644
--- a/tests/ui-fulldeps/internal-lints/ty_tykind_usage.stderr
+++ b/tests/ui-fulldeps/internal-lints/ty_tykind_usage.stderr
@@ -121,65 +121,59 @@ LL | TyKind::GeneratorWitness(..) => (),
error: usage of `ty::TyKind::<kind>`
--> $DIR/ty_tykind_usage.rs:34:9
|
-LL | TyKind::GeneratorWitnessMIR(..) => (),
- | ^^^^^^ help: try using `ty::<kind>` directly: `ty`
-
-error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:35:9
- |
LL | TyKind::Never => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:36:9
+ --> $DIR/ty_tykind_usage.rs:35:9
|
LL | TyKind::Tuple(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:37:9
+ --> $DIR/ty_tykind_usage.rs:36:9
|
LL | TyKind::Alias(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:38:9
+ --> $DIR/ty_tykind_usage.rs:37:9
|
LL | TyKind::Param(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:39:9
+ --> $DIR/ty_tykind_usage.rs:38:9
|
LL | TyKind::Bound(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:40:9
+ --> $DIR/ty_tykind_usage.rs:39:9
|
LL | TyKind::Placeholder(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:41:9
+ --> $DIR/ty_tykind_usage.rs:40:9
|
LL | TyKind::Infer(..) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:42:9
+ --> $DIR/ty_tykind_usage.rs:41:9
|
LL | TyKind::Error(_) => (),
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:47:12
+ --> $DIR/ty_tykind_usage.rs:46:12
|
LL | if let TyKind::Int(int_ty) = kind {}
| ^^^^^^ help: try using `ty::<kind>` directly: `ty`
error: usage of `ty::TyKind`
- --> $DIR/ty_tykind_usage.rs:49:24
+ --> $DIR/ty_tykind_usage.rs:48:24
|
LL | fn ty_kind(ty_bad: TyKind<'_>, ty_good: Ty<'_>) {}
| ^^^^^^^^^^
@@ -187,7 +181,7 @@ LL | fn ty_kind(ty_bad: TyKind<'_>, ty_good: Ty<'_>) {}
= help: try using `Ty` instead
error: usage of `ty::TyKind`
- --> $DIR/ty_tykind_usage.rs:51:37
+ --> $DIR/ty_tykind_usage.rs:50:37
|
LL | fn ir_ty_kind<I: Interner>(bad: IrTyKind<I>) -> IrTyKind<I> {
| ^^^^^^^^^^^
@@ -195,7 +189,7 @@ LL | fn ir_ty_kind<I: Interner>(bad: IrTyKind<I>) -> IrTyKind<I> {
= help: try using `Ty` instead
error: usage of `ty::TyKind`
- --> $DIR/ty_tykind_usage.rs:51:53
+ --> $DIR/ty_tykind_usage.rs:50:53
|
LL | fn ir_ty_kind<I: Interner>(bad: IrTyKind<I>) -> IrTyKind<I> {
| ^^^^^^^^^^^
@@ -203,12 +197,12 @@ LL | fn ir_ty_kind<I: Interner>(bad: IrTyKind<I>) -> IrTyKind<I> {
= help: try using `Ty` instead
error: usage of `ty::TyKind::<kind>`
- --> $DIR/ty_tykind_usage.rs:54:9
+ --> $DIR/ty_tykind_usage.rs:53:9
|
LL | IrTyKind::Bool
| --------^^^^^^
| |
| help: try using `ty::<kind>` directly: `ty`
-error: aborting due to 33 previous errors
+error: aborting due to 32 previous errors
diff --git a/tests/ui-fulldeps/lint-pass-macros.rs b/tests/ui-fulldeps/lint-pass-macros.rs
index b3c2a5427..4c6178341 100644
--- a/tests/ui-fulldeps/lint-pass-macros.rs
+++ b/tests/ui-fulldeps/lint-pass-macros.rs
@@ -5,7 +5,7 @@
extern crate rustc_session;
-use rustc_session::lint::{LintArray, LintPass};
+use rustc_session::lint::{LintPass, LintVec};
use rustc_session::{declare_lint, declare_lint_pass, impl_lint_pass};
declare_lint! {
diff --git a/tests/ui-fulldeps/plugin/auxiliary/lint-group-plugin-test.rs b/tests/ui-fulldeps/plugin/auxiliary/lint-group-plugin-test.rs
index 4a41e7fbb..150f0c6b9 100644
--- a/tests/ui-fulldeps/plugin/auxiliary/lint-group-plugin-test.rs
+++ b/tests/ui-fulldeps/plugin/auxiliary/lint-group-plugin-test.rs
@@ -5,13 +5,12 @@
// Load rustc as a plugin to get macros.
extern crate rustc_driver;
extern crate rustc_hir;
-#[macro_use]
extern crate rustc_lint;
#[macro_use]
extern crate rustc_session;
use rustc_driver::plugin::Registry;
-use rustc_lint::{LateContext, LateLintPass, LintArray, LintContext, LintId, LintPass};
+use rustc_lint::{LateContext, LateLintPass, LintContext, LintId};
declare_lint!(TEST_LINT, Warn, "Warn about items named 'lintme'");
diff --git a/tests/ui-fulldeps/plugin/auxiliary/lint-plugin-test.rs b/tests/ui-fulldeps/plugin/auxiliary/lint-plugin-test.rs
index 30956deb7..acc5fe760 100644
--- a/tests/ui-fulldeps/plugin/auxiliary/lint-plugin-test.rs
+++ b/tests/ui-fulldeps/plugin/auxiliary/lint-plugin-test.rs
@@ -6,14 +6,14 @@ extern crate rustc_ast;
// Load rustc as a plugin to get macros
extern crate rustc_driver;
-#[macro_use]
extern crate rustc_lint;
#[macro_use]
extern crate rustc_session;
+use rustc_ast::ast;
use rustc_driver::plugin::Registry;
-use rustc_lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass};
-use rustc_ast as ast;
+use rustc_lint::{EarlyContext, EarlyLintPass, LintContext};
+
declare_lint!(TEST_LINT, Warn, "Warn about items named 'lintme'");
declare_lint_pass!(Pass => [TEST_LINT]);
diff --git a/tests/ui-fulldeps/plugin/auxiliary/lint-tool-test.rs b/tests/ui-fulldeps/plugin/auxiliary/lint-tool-test.rs
index c2c024865..21de4aa70 100644
--- a/tests/ui-fulldeps/plugin/auxiliary/lint-tool-test.rs
+++ b/tests/ui-fulldeps/plugin/auxiliary/lint-tool-test.rs
@@ -4,14 +4,14 @@ extern crate rustc_ast;
// Load rustc as a plugin to get macros
extern crate rustc_driver;
-#[macro_use]
extern crate rustc_lint;
#[macro_use]
extern crate rustc_session;
-use rustc_driver::plugin::Registry;
-use rustc_lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintId, LintPass};
use rustc_ast as ast;
+use rustc_driver::plugin::Registry;
+use rustc_lint::{EarlyContext, EarlyLintPass, LintContext, LintId};
+
declare_tool_lint!(pub clippy::TEST_LINT, Warn, "Warn about stuff");
declare_tool_lint!(
/// Some docs
diff --git a/tests/ui-fulldeps/plugin/lint-group-plugin-deny-cmdline.stderr b/tests/ui-fulldeps/plugin/lint-group-plugin-deny-cmdline.stderr
index 20486d596..6e17bbde0 100644
--- a/tests/ui-fulldeps/plugin/lint-group-plugin-deny-cmdline.stderr
+++ b/tests/ui-fulldeps/plugin/lint-group-plugin-deny-cmdline.stderr
@@ -13,6 +13,7 @@ LL | fn lintme() { }
| ^^^^^^^^^^^^^^^
|
= note: `-D test-lint` implied by `-D lint-me`
+ = help: to override `-D lint-me` add `#[allow(test_lint)]`
error: item is named 'pleaselintme'
--> $DIR/lint-group-plugin-deny-cmdline.rs:12:1
@@ -21,6 +22,7 @@ LL | fn pleaselintme() { }
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: `-D please-lint` implied by `-D lint-me`
+ = help: to override `-D lint-me` add `#[allow(please_lint)]`
error: aborting due to 2 previous errors; 1 warning emitted
diff --git a/tests/ui-fulldeps/plugin/lint-tool-cmdline-allow.stderr b/tests/ui-fulldeps/plugin/lint-tool-cmdline-allow.stderr
index b060e3a3e..0e6617959 100644
--- a/tests/ui-fulldeps/plugin/lint-tool-cmdline-allow.stderr
+++ b/tests/ui-fulldeps/plugin/lint-tool-cmdline-allow.stderr
@@ -1,9 +1,12 @@
-warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint
+warning: lint name `test_lint` is deprecated and may not have an effect in the future.
|
+ = help: change it to clippy::test_lint
= note: requested on the command line with `-A test_lint`
+ = note: `#[warn(renamed_and_removed_lints)]` on by default
-warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint
+warning: lint name `test_lint` is deprecated and may not have an effect in the future.
|
+ = help: change it to clippy::test_lint
= note: requested on the command line with `-A test_lint`
warning: item is named 'lintme'
@@ -22,8 +25,9 @@ LL | #![plugin(lint_tool_test)]
|
= note: `#[warn(deprecated)]` on by default
-warning: lint name `test_lint` is deprecated and does not have an effect anymore. Use: clippy::test_lint
+warning: lint name `test_lint` is deprecated and may not have an effect in the future.
|
+ = help: change it to clippy::test_lint
= note: requested on the command line with `-A test_lint`
warning: 5 warnings emitted
diff --git a/tests/ui-fulldeps/pprust-expr-roundtrip.rs b/tests/ui-fulldeps/pprust-expr-roundtrip.rs
index ae375dfab..541be7ebb 100644
--- a/tests/ui-fulldeps/pprust-expr-roundtrip.rs
+++ b/tests/ui-fulldeps/pprust-expr-roundtrip.rs
@@ -80,14 +80,20 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) {
let seg = PathSegment::from_ident(Ident::from_str("x"));
iter_exprs(depth - 1, &mut |e| {
g(ExprKind::MethodCall(Box::new(MethodCall {
- seg: seg.clone(), receiver: e, args: thin_vec![make_x()], span: DUMMY_SP
- }))
- )});
+ seg: seg.clone(),
+ receiver: e,
+ args: thin_vec![make_x()],
+ span: DUMMY_SP,
+ })))
+ });
iter_exprs(depth - 1, &mut |e| {
g(ExprKind::MethodCall(Box::new(MethodCall {
- seg: seg.clone(), receiver: make_x(), args: thin_vec![e], span: DUMMY_SP
- }))
- )});
+ seg: seg.clone(),
+ receiver: make_x(),
+ args: thin_vec![e],
+ span: DUMMY_SP,
+ })))
+ });
}
2..=7 => {
let op = Spanned {
@@ -174,7 +180,7 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) {
18 => {
let pat =
P(Pat { id: DUMMY_NODE_ID, kind: PatKind::Wild, span: DUMMY_SP, tokens: None });
- iter_exprs(depth - 1, &mut |e| g(ExprKind::Let(pat.clone(), e, DUMMY_SP)))
+ iter_exprs(depth - 1, &mut |e| g(ExprKind::Let(pat.clone(), e, DUMMY_SP, None)))
}
_ => panic!("bad counter value in iter_exprs"),
}
diff --git a/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.rs b/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.rs
index 642b58b07..283d87d3e 100644
--- a/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.rs
+++ b/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.rs
@@ -1,7 +1,7 @@
// check-fail
// Tests that a doc comment will not preclude a field from being considered a diagnostic argument
// normalize-stderr-test "the following other types implement trait `IntoDiagnosticArg`:(?:.*\n){0,9}\s+and \d+ others" -> "normalized in stderr"
-// normalize-stderr-test "diagnostic_builder\.rs:[0-9]+:[0-9]+" -> "diagnostic_builder.rs:LL:CC"
+// normalize-stderr-test "(COMPILER_DIR/.*\.rs):[0-9]+:[0-9]+" -> "$1:LL:CC"
// The proc_macro2 crate handles spans differently when on beta/stable release rather than nightly,
// changing the output of this test. Since Subdiagnostic is strictly internal to the compiler
diff --git a/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.stderr b/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.stderr
index 8c876213a..70d7b3225 100644
--- a/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.stderr
+++ b/tests/ui-fulldeps/session-diagnostic/diagnostic-derive-doc-comment-field.stderr
@@ -23,7 +23,7 @@ LL | arg: NotIntoDiagnosticArg,
|
= help: normalized in stderr
note: required by a bound in `Diagnostic::set_arg`
- --> $COMPILER_DIR/rustc_errors/src/diagnostic.rs:960:5
+ --> $COMPILER_DIR/rustc_errors/src/diagnostic.rs:LL:CC
error: aborting due to 2 previous errors
diff --git a/tests/ui-fulldeps/stable-mir/compilation-result.rs b/tests/ui-fulldeps/stable-mir/compilation-result.rs
new file mode 100644
index 000000000..3ec1519fb
--- /dev/null
+++ b/tests/ui-fulldeps/stable-mir/compilation-result.rs
@@ -0,0 +1,78 @@
+// 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_smir;
+extern crate stable_mir;
+
+use rustc_middle::ty::TyCtxt;
+use rustc_smir::rustc_internal;
+use std::io::Write;
+use std::ops::ControlFlow;
+
+/// 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 `StableMir` 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 = vec!["rustc".to_string(), path.to_string()];
+ test_continue(args.clone());
+ test_break(args.clone());
+ test_failed(args.clone());
+ test_skipped(args);
+}
+
+fn test_continue(args: Vec<String>) {
+ let continue_fn = |_: TyCtxt| ControlFlow::Continue::<(), bool>(true);
+ let result = rustc_internal::StableMir::new(args, continue_fn).run();
+ assert_eq!(result, Ok(true));
+}
+
+fn test_break(args: Vec<String>) {
+ let continue_fn = |_: TyCtxt| ControlFlow::Break::<bool, i32>(false);
+ let result = rustc_internal::StableMir::new(args, continue_fn).run();
+ assert_eq!(result, Err(stable_mir::CompilerError::Interrupted(false)));
+}
+
+fn test_skipped(mut args: Vec<String>) {
+ args.push("--version".to_string());
+ let unreach_fn = |_: TyCtxt| -> ControlFlow<()> { unreachable!() };
+ let result = rustc_internal::StableMir::new(args, unreach_fn).run();
+ assert_eq!(result, Err(stable_mir::CompilerError::Skipped));
+}
+
+fn test_failed(mut args: Vec<String>) {
+ args.push("--cfg=broken".to_string());
+ let unreach_fn = |_: TyCtxt| -> ControlFlow<()> { unreachable!() };
+ let result = rustc_internal::StableMir::new(args, unreach_fn).run();
+ assert_eq!(result, Err(stable_mir::CompilerError::CompilationFailed));
+}
+
+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(())
+}
diff --git a/tests/ui-fulldeps/stable-mir/crate-info.rs b/tests/ui-fulldeps/stable-mir/crate-info.rs
index f55d7d599..ce4ee3c24 100644
--- a/tests/ui-fulldeps/stable-mir/crate-info.rs
+++ b/tests/ui-fulldeps/stable-mir/crate-info.rs
@@ -8,27 +8,26 @@
#![feature(rustc_private)]
#![feature(assert_matches)]
+#![feature(control_flow_enum)]
-extern crate rustc_driver;
extern crate rustc_hir;
-extern crate rustc_interface;
extern crate rustc_middle;
-extern crate rustc_session;
extern crate rustc_smir;
+extern crate stable_mir;
-use rustc_driver::{Callbacks, Compilation, RunCompiler};
use rustc_hir::def::DefKind;
-use rustc_interface::{interface, Queries};
use rustc_middle::ty::TyCtxt;
-use rustc_session::EarlyErrorHandler;
-use rustc_smir::{rustc_internal, stable_mir};
+use rustc_smir::rustc_internal;
+
+use stable_mir::fold::Foldable;
use std::assert_matches::assert_matches;
use std::io::Write;
+use std::ops::ControlFlow;
const CRATE_NAME: &str = "input";
/// This function uses the Stable MIR APIs to get information about the test crate.
-fn test_stable_mir(tcx: TyCtxt<'_>) {
+fn test_stable_mir(_tcx: TyCtxt<'_>) -> ControlFlow<()> {
// Get the local crate using stable_mir API.
let local = stable_mir::local_crate();
assert_eq!(&local.name, CRATE_NAME);
@@ -37,12 +36,12 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
// Find items in the local crate.
let items = stable_mir::all_local_items();
- assert!(get_item(tcx, &items, (DefKind::Fn, "foo::bar")).is_some());
+ assert!(get_item(&items, (DefKind::Fn, "foo::bar")).is_some());
// Find the `std` crate.
assert!(stable_mir::find_crate("std").is_some());
- let bar = get_item(tcx, &items, (DefKind::Fn, "bar")).unwrap();
+ let bar = get_item(&items, (DefKind::Fn, "bar")).unwrap();
let body = bar.body();
assert_eq!(body.locals.len(), 2);
assert_eq!(body.blocks.len(), 1);
@@ -57,7 +56,7 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
other => panic!("{other:?}"),
}
- let foo_bar = get_item(tcx, &items, (DefKind::Fn, "foo_bar")).unwrap();
+ let foo_bar = get_item(&items, (DefKind::Fn, "foo_bar")).unwrap();
let body = foo_bar.body();
assert_eq!(body.locals.len(), 7);
assert_eq!(body.blocks.len(), 4);
@@ -67,7 +66,7 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
other => panic!("{other:?}"),
}
- let types = get_item(tcx, &items, (DefKind::Fn, "types")).unwrap();
+ let types = get_item(&items, (DefKind::Fn, "types")).unwrap();
let body = types.body();
assert_eq!(body.locals.len(), 6);
assert_matches!(
@@ -97,7 +96,7 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
))
);
- let drop = get_item(tcx, &items, (DefKind::Fn, "drop")).unwrap();
+ let drop = get_item(&items, (DefKind::Fn, "drop")).unwrap();
let body = drop.body();
assert_eq!(body.blocks.len(), 2);
let block = &body.blocks[0];
@@ -106,7 +105,7 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
other => panic!("{other:?}"),
}
- let assert = get_item(tcx, &items, (DefKind::Fn, "assert")).unwrap();
+ let assert = get_item(&items, (DefKind::Fn, "assert")).unwrap();
let body = assert.body();
assert_eq!(body.blocks.len(), 2);
let block = &body.blocks[0];
@@ -114,24 +113,68 @@ fn test_stable_mir(tcx: TyCtxt<'_>) {
stable_mir::mir::Terminator::Assert { .. } => {}
other => panic!("{other:?}"),
}
+
+ let monomorphic = get_item(&items, (DefKind::Fn, "monomorphic")).unwrap();
+ for block in monomorphic.body().blocks {
+ match &block.terminator {
+ stable_mir::mir::Terminator::Call { func, .. } => match func {
+ stable_mir::mir::Operand::Constant(c) => match &c.literal.literal {
+ stable_mir::ty::ConstantKind::Allocated(alloc) => {
+ assert!(alloc.bytes.is_empty());
+ match c.literal.ty.kind() {
+ stable_mir::ty::TyKind::RigidTy(stable_mir::ty::RigidTy::FnDef(
+ def,
+ mut args,
+ )) => {
+ let func = def.body();
+ match func.locals[1]
+ .fold(&mut args)
+ .continue_value()
+ .unwrap()
+ .kind()
+ {
+ stable_mir::ty::TyKind::RigidTy(
+ stable_mir::ty::RigidTy::Uint(_),
+ ) => {}
+ stable_mir::ty::TyKind::RigidTy(
+ stable_mir::ty::RigidTy::Tuple(_),
+ ) => {}
+ other => panic!("{other:?}"),
+ }
+ }
+ other => panic!("{other:?}"),
+ }
+ }
+ other => panic!("{other:?}"),
+ },
+ other => panic!("{other:?}"),
+ },
+ stable_mir::mir::Terminator::Return => {}
+ other => panic!("{other:?}"),
+ }
+ }
+
+ let foo_const = get_item(&items, (DefKind::Const, "FOO")).unwrap();
+ // Ensure we don't panic trying to get the body of a constant.
+ foo_const.body();
+
+ ControlFlow::Continue(())
}
// Use internal API to find a function in a crate.
fn get_item<'a>(
- tcx: TyCtxt,
items: &'a stable_mir::CrateItems,
item: (DefKind, &str),
) -> Option<&'a stable_mir::CrateItem> {
items.iter().find(|crate_item| {
- let def_id = rustc_internal::item_def_id(crate_item);
- tcx.def_kind(def_id) == item.0 && tcx.def_path_str(def_id) == item.1
+ crate_item.kind().to_string() == format!("{:?}", item.0) && crate_item.name() == item.1
})
}
/// 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.
-/// It will invoke the compiler using a custom Callback implementation, which will
-/// invoke Stable MIR APIs after the compiler has finished its analysis.
+/// Then it will create a `StableMir` using custom arguments and then
+/// it will run the compiler.
fn main() {
let path = "input.rs";
generate_input(&path).unwrap();
@@ -142,29 +185,7 @@ fn main() {
CRATE_NAME.to_string(),
path.to_string(),
];
- rustc_driver::catch_fatal_errors(|| {
- RunCompiler::new(&args, &mut SMirCalls {}).run().unwrap();
- })
- .unwrap();
-}
-
-struct SMirCalls {}
-
-impl Callbacks for SMirCalls {
- /// Called after analysis. Return value instructs the compiler whether to
- /// continue the compilation afterwards (defaults to `Compilation::Continue`)
- fn after_analysis<'tcx>(
- &mut self,
- _handler: &EarlyErrorHandler,
- _compiler: &interface::Compiler,
- queries: &'tcx Queries<'tcx>,
- ) -> Compilation {
- queries.global_ctxt().unwrap().enter(|tcx| {
- rustc_smir::rustc_internal::run(tcx, || test_stable_mir(tcx));
- });
- // No need to keep going.
- Compilation::Stop
- }
+ rustc_internal::StableMir::new(args, test_stable_mir).run().unwrap();
}
fn generate_input(path: &str) -> std::io::Result<()> {
@@ -172,6 +193,18 @@ fn generate_input(path: &str) -> std::io::Result<()> {
write!(
file,
r#"
+ pub const FOO: u32 = 1 + 2;
+
+ fn generic<T, const U: usize>(t: T) -> [(); U] {{
+ _ = t;
+ [(); U]
+ }}
+
+ pub fn monomorphic() {{
+ generic::<(), 5>(());
+ generic::<u32, 0>(45);
+ }}
+
mod foo {{
pub fn bar(i: i32) -> i64 {{
i as i64