Skip to content

Commit 742b378

Browse files
committed
make hover_feature test less fragile
1 parent a7400a8 commit 742b378

File tree

1 file changed

+8
-79
lines changed
  • src/tools/rust-analyzer/crates/ide/src/hover

1 file changed

+8
-79
lines changed

src/tools/rust-analyzer/crates/ide/src/hover/tests.rs

+8-79
Original file line numberDiff line numberDiff line change
@@ -6882,85 +6882,14 @@ pub fn foo() {}
68826882

68836883
#[test]
68846884
fn hover_feature() {
6885-
check(
6886-
r#"#![feature(intrinsics$0)]"#,
6887-
expect![[r#"
6888-
*intrinsics*
6889-
```
6890-
intrinsics
6891-
```
6892-
___
6893-
6894-
# `intrinsics`
6895-
6896-
The tracking issue for this feature is: None.
6897-
6898-
Intrinsics are rarely intended to be stable directly, but are usually
6899-
exported in some sort of stable manner. Prefer using the stable interfaces to
6900-
the intrinsic directly when you can.
6901-
6902-
------------------------
6903-
6904-
6905-
## Intrinsics with fallback logic
6906-
6907-
Many intrinsics can be written in pure rust, albeit inefficiently or without supporting
6908-
some features that only exist on some backends. Backends can simply not implement those
6909-
intrinsics without causing any code miscompilations or failures to compile.
6910-
All intrinsic fallback bodies are automatically made cross-crate inlineable (like `#[inline]`)
6911-
by the codegen backend, but not the MIR inliner.
6912-
6913-
```rust
6914-
#![feature(intrinsics)]
6915-
#![allow(internal_features)]
6916-
6917-
#[rustc_intrinsic]
6918-
const unsafe fn const_deallocate(_ptr: *mut u8, _size: usize, _align: usize) {}
6919-
```
6920-
6921-
Since these are just regular functions, it is perfectly ok to create the intrinsic twice:
6922-
6923-
```rust
6924-
#![feature(intrinsics)]
6925-
#![allow(internal_features)]
6926-
6927-
#[rustc_intrinsic]
6928-
const unsafe fn const_deallocate(_ptr: *mut u8, _size: usize, _align: usize) {}
6929-
6930-
mod foo {
6931-
#[rustc_intrinsic]
6932-
const unsafe fn const_deallocate(_ptr: *mut u8, _size: usize, _align: usize) {
6933-
panic!("noisy const dealloc")
6934-
}
6935-
}
6936-
6937-
```
6938-
6939-
The behaviour on backends that override the intrinsic is exactly the same. On other
6940-
backends, the intrinsic behaviour depends on which implementation is called, just like
6941-
with any regular function.
6942-
6943-
## Intrinsics lowered to MIR instructions
6944-
6945-
Various intrinsics have native MIR operations that they correspond to. Instead of requiring
6946-
backends to implement both the intrinsic and the MIR operation, the `lower_intrinsics` pass
6947-
will convert the calls to the MIR operation. Backends do not need to know about these intrinsics
6948-
at all. These intrinsics only make sense without a body, and can be as a `#[rustc_intrinsic]`.
6949-
The body is never used, as calls to the intrinsic do not exist anymore after MIR analyses.
6950-
6951-
## Intrinsics without fallback logic
6952-
6953-
These must be implemented by all backends.
6954-
6955-
### `#[rustc_intrinsic]` declarations
6956-
6957-
These are written like intrinsics with fallback bodies, but the body is irrelevant.
6958-
Use `loop {}` for the body or call the intrinsic recursively and add
6959-
`#[rustc_intrinsic_must_be_overridden]` to the function to ensure that backends don't
6960-
invoke the body.
6961-
6962-
"#]],
6963-
)
6885+
let (analysis, position) = fixture::position(r#"#![feature(intrinsics$0)]"#);
6886+
analysis
6887+
.hover(
6888+
&HoverConfig { links_in_hover: true, ..HOVER_BASE_CONFIG },
6889+
FileRange { file_id: position.file_id, range: TextRange::empty(position.offset) },
6890+
)
6891+
.unwrap()
6892+
.unwrap();
69646893
}
69656894

69666895
#[test]

0 commit comments

Comments
 (0)