Skip to content

Feature-gate pointer and reference in intra-doc links #81015

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 18, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/rustc_feature/src/active.rs
Original file line number Diff line number Diff line change
@@ -629,6 +629,8 @@ declare_features! (
/// Allows references to types with interior mutability within constants
(active, const_refs_to_cell, "1.51.0", Some(80384), None),

/// Allows using `pointer` and `reference` in intra-doc links
(active, intra_doc_pointers, "1.51.0", Some(80896), None),
// -------------------------------------------------------------------------
// feature-group-end: actual feature gates
// -------------------------------------------------------------------------
1 change: 1 addition & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
@@ -622,6 +622,7 @@ symbols! {
intel,
into_iter,
into_result,
intra_doc_pointers,
intrinsics,
irrefutable_let_patterns,
isa_attribute,
15 changes: 15 additions & 0 deletions src/doc/unstable-book/src/language-features/intra-doc-pointers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# `intra-doc-pointers`

The tracking issue for this feature is: [#80896]

[#80896]: https://github.com/rust-lang/rust/issues/80896

------------------------

Rustdoc does not currently allow disambiguating between `*const` and `*mut`, and
raw pointers in intra-doc links are unstable until it does.

```rust
#![feature(intra_doc_pointers)]
//! [pointer::add]
```
29 changes: 26 additions & 3 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
@@ -20,8 +20,7 @@ use rustc_session::lint::{
Lint,
};
use rustc_span::hygiene::{MacroKind, SyntaxContext};
use rustc_span::symbol::Ident;
use rustc_span::symbol::Symbol;
use rustc_span::symbol::{sym, Ident, Symbol};
use rustc_span::DUMMY_SP;
use smallvec::{smallvec, SmallVec};

@@ -1195,7 +1194,7 @@ impl LinkCollector<'_, '_> {
};

match res {
Res::Primitive(_) => {
Res::Primitive(prim) => {
if let Some((kind, id)) = self.kind_side_channel.take() {
// We're actually resolving an associated item of a primitive, so we need to
// verify the disambiguator (if any) matches the type of the associated item.
@@ -1206,6 +1205,29 @@ impl LinkCollector<'_, '_> {
// valid omission. See https://github.com/rust-lang/rust/pull/80660#discussion_r551585677
// for discussion on the matter.
verify(kind, id)?;

if prim == PrimitiveType::RawPointer
&& !self.cx.tcx.features().intra_doc_pointers
{
let span = super::source_span_for_markdown_range(
cx,
dox,
&ori_link.range,
&item.attrs,
)
.unwrap_or_else(|| {
span_of_attrs(&item.attrs).unwrap_or(item.source.span())
});

rustc_session::parse::feature_err(
&self.cx.tcx.sess.parse_sess,
sym::intra_doc_pointers,
span,
"linking to associated items of raw pointers is experimental",
)
.note("rustdoc does not allow disambiguating between `*const` and `*mut`, and pointers are unstable until it does")
.emit();
}
} else {
match disambiguator {
Some(Disambiguator::Primitive | Disambiguator::Namespace(_)) | None => {}
@@ -1215,6 +1237,7 @@ impl LinkCollector<'_, '_> {
}
}
}

Some(ItemLink { link: ori_link.link, link_text, did: None, fragment })
}
Res::Def(kind, id) => {
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
//! [pointer::add]
//~^ ERROR: experimental
//! [pointer::wrapping_add]
//~^ ERROR: experimental
//! [pointer] // This is explicitly allowed
//! [reference] // This is explicitly allowed
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error[E0658]: linking to associated items of raw pointers is experimental
--> $DIR/feature-gate-intra-doc-pointers.rs:1:6
|
LL | //! [pointer::add]
| ^^^^^^^^^^^^
|
= note: see issue #80896 <https://github.com/rust-lang/rust/issues/80896> for more information
= help: add `#![feature(intra_doc_pointers)]` to the crate attributes to enable
= note: rustdoc does not allow disambiguating between `*const` and `*mut`, and pointers are unstable until it does

error[E0658]: linking to associated items of raw pointers is experimental
--> $DIR/feature-gate-intra-doc-pointers.rs:3:6
|
LL | //! [pointer::wrapping_add]
| ^^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #80896 <https://github.com/rust-lang/rust/issues/80896> for more information
= help: add `#![feature(intra_doc_pointers)]` to the crate attributes to enable
= note: rustdoc does not allow disambiguating between `*const` and `*mut`, and pointers are unstable until it does

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0658`.
1 change: 1 addition & 0 deletions src/test/rustdoc-ui/intra-doc/non-path-primitives.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#![deny(broken_intra_doc_links)]
#![feature(intra_doc_pointers)]
// These are links that could reasonably expected to work, but don't.

// `[]` isn't supported because it had too many false positives.
18 changes: 9 additions & 9 deletions src/test/rustdoc-ui/intra-doc/non-path-primitives.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: unresolved link to `T`
--> $DIR/non-path-primitives.rs:11:7
--> $DIR/non-path-primitives.rs:12:7
|
LL | //! [[T]::rotate_left]
| ^ no item named `T` in scope
@@ -12,55 +12,55 @@ LL | #![deny(broken_intra_doc_links)]
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`

error: unresolved link to `Z`
--> $DIR/non-path-primitives.rs:13:5
--> $DIR/non-path-primitives.rs:14:5
|
LL | //![Z]([T; N]::map)
| ^ no item named `Z` in scope
|
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`

error: unresolved link to `Z`
--> $DIR/non-path-primitives.rs:16:6
--> $DIR/non-path-primitives.rs:17:6
|
LL | //! [Z][]
| ^ no item named `Z` in scope
|
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`

error: unresolved link to `Z`
--> $DIR/non-path-primitives.rs:18:6
--> $DIR/non-path-primitives.rs:19:6
|
LL | //! [Z]: [T; N]::map
| ^ no item named `Z` in scope
|
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`

error: unresolved link to `unit::eq`
--> $DIR/non-path-primitives.rs:27:6
--> $DIR/non-path-primitives.rs:28:6
|
LL | //! [unit::eq]
| ^^^^^^^^ the builtin type `unit` has no associated item named `eq`

error: unresolved link to `tuple::eq`
--> $DIR/non-path-primitives.rs:28:6
--> $DIR/non-path-primitives.rs:29:6
|
LL | //! [tuple::eq]
| ^^^^^^^^^ the builtin type `tuple` has no associated item named `eq`

error: unresolved link to `fn::eq`
--> $DIR/non-path-primitives.rs:29:6
--> $DIR/non-path-primitives.rs:30:6
|
LL | //! [fn::eq]
| ^^^^^^ the builtin type `fn` has no associated item named `eq`

error: unresolved link to `never::eq`
--> $DIR/non-path-primitives.rs:30:6
--> $DIR/non-path-primitives.rs:31:6
|
LL | //! [never::eq]
| ^^^^^^^^^ the builtin type `never` has no associated item named `eq`

error: unresolved link to `reference::deref`
--> $DIR/non-path-primitives.rs:34:6
--> $DIR/non-path-primitives.rs:35:6
|
LL | //! [reference::deref]
| ^^^^^^^^^^^^^^^^ the builtin type `reference` has no associated item named `deref`
1 change: 1 addition & 0 deletions src/test/rustdoc/intra-doc/non-path-primitives.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// ignore-tidy-linelength
#![crate_name = "foo"]
#![feature(intra_doc_pointers)]
#![deny(broken_intra_doc_links)]

// @has foo/index.html '//a[@href="https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.rotate_left"]' 'slice::rotate_left'
6 changes: 5 additions & 1 deletion src/tools/tidy/src/features.rs
Original file line number Diff line number Diff line change
@@ -85,7 +85,11 @@ pub fn check(
assert!(!lib_features.is_empty());

super::walk_many(
&[&src_path.join("test/ui"), &src_path.join("test/ui-fulldeps")],
&[
&src_path.join("test/ui"),
&src_path.join("test/ui-fulldeps"),
&src_path.join("test/rustdoc-ui"),
],
&mut |path| super::filter_dirs(path),
&mut |entry, contents| {
let file = entry.path();