Merge pull request #19566 from flodiebold/push-vzpyzvpkwkyt
Fix dyn compatibility code bypassing callable_item_signature query
diff --git a/Cargo.lock b/Cargo.lock
index 0d509f5..b017b37 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -272,9 +272,9 @@
[[package]]
name = "crossbeam-channel"
-version = "0.5.14"
+version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
diff --git a/Cargo.toml b/Cargo.toml
index d6f9a13..1fdc6b3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -108,7 +108,7 @@
chalk-ir = "0.100.0"
chalk-recursive = { version = "0.100.0", default-features = false }
chalk-derive = "0.100.0"
-crossbeam-channel = "0.5.14"
+crossbeam-channel = "0.5.15"
dissimilar = "1.0.10"
dot = "0.1.4"
either = "1.15.0"
diff --git a/crates/hir-def/src/expr_store.rs b/crates/hir-def/src/expr_store.rs
index 05c220d..eb66e59 100644
--- a/crates/hir-def/src/expr_store.rs
+++ b/crates/hir-def/src/expr_store.rs
@@ -282,6 +282,9 @@
}
}
+ /// Walks the immediate children expressions and calls `f` for each child expression.
+ ///
+ /// Note that this does not walk const blocks.
pub fn walk_child_exprs(&self, expr_id: ExprId, mut f: impl FnMut(ExprId)) {
let expr = &self[expr_id];
match expr {
@@ -415,6 +418,10 @@
}
}
+ /// Walks the immediate children expressions and calls `f` for each child expression but does
+ /// not walk expressions within patterns.
+ ///
+ /// Note that this does not walk const blocks.
pub fn walk_child_exprs_without_pats(&self, expr_id: ExprId, mut f: impl FnMut(ExprId)) {
let expr = &self[expr_id];
match expr {
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs
index ca0f33f..73b99db 100644
--- a/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -348,6 +348,7 @@
Expr::Closure { args, .. } => {
self.walk_pats_top(args.iter().copied(), current);
}
+ Expr::Const(e) => self.walk_expr(*e),
_ => {}
}
diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index a9b481f..c851a9c 100644
--- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -878,4 +878,17 @@
"#,
);
}
+
+ #[test]
+ fn unsafe_call_in_const_expr() {
+ check_diagnostics(
+ r#"
+unsafe fn f() {}
+fn main() {
+ const { f(); };
+ // ^^^ 💡 error: call to unsafe function is unsafe and requires an unsafe function or block
+}
+ "#,
+ );
+ }
}