mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
Auto merge of #97224 - matthiaskrgr:rollup-it5nw68, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #97109 (Fix misleading `cannot infer type for type parameter` error) - #97187 (Reverse condition in Vec::retain_mut doctest) - #97201 (Fix typo) - #97203 (Minor tweaks to rustc book summary formatting.) - #97208 (Do not emit the lint `unused_attributes` for *inherent* `#[doc(hidden)]` associated items) - #97215 (Add complexity estimation of iterating over HashSet and HashMap) - #97220 (Add regression test for#81827) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
536020c5f9
@ -866,6 +866,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
self.report_ambiguous_type_parameter(&mut err, arg);
|
||||
err.span_label(
|
||||
span,
|
||||
arg_data.cannot_infer_msg(use_diag.filter(|d| d.applies_to(span))),
|
||||
@ -933,6 +934,28 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn report_ambiguous_type_parameter(&self, err: &mut Diagnostic, arg: GenericArg<'tcx>) {
|
||||
if let GenericArgKind::Type(ty) = arg.unpack()
|
||||
&& let ty::Infer(ty::TyVar(ty_vid)) = *ty.kind()
|
||||
{
|
||||
let mut inner = self.inner.borrow_mut();
|
||||
let ty_vars = &inner.type_variables();
|
||||
let var_origin = ty_vars.var_origin(ty_vid);
|
||||
if let TypeVariableOriginKind::TypeParameterDefinition(_, Some(def_id)) =
|
||||
var_origin.kind
|
||||
&& let Some(parent_def_id) = self.tcx.parent(def_id).as_local()
|
||||
&& let Some(node) = self.tcx.hir().find_by_def_id(parent_def_id)
|
||||
{
|
||||
match node {
|
||||
hir::Node::Item(item) if matches!(item.kind, hir::ItemKind::Impl(_) | hir::ItemKind::Fn(..)) => (),
|
||||
hir::Node::ImplItem(impl_item) if matches!(impl_item.kind, hir::ImplItemKind::Fn(..)) => (),
|
||||
_ => return,
|
||||
}
|
||||
err.span_help(self.tcx.def_span(def_id), "type parameter declared here");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn need_type_info_err_in_generator(
|
||||
&self,
|
||||
kind: hir::GeneratorKind,
|
||||
|
@ -832,7 +832,7 @@ impl CheckAttrVisitor<'_> {
|
||||
let parent_hir_id = self.tcx.hir().get_parent_item(hir_id);
|
||||
let containing_item = self.tcx.hir().expect_item(parent_hir_id);
|
||||
|
||||
if Target::from_item(containing_item) == Target::Impl {
|
||||
if let hir::ItemKind::Impl(hir::Impl { of_trait: Some(_), .. }) = containing_item.kind {
|
||||
let meta_items = attr.meta_item_list().unwrap();
|
||||
|
||||
let (span, replacement_span) = if meta_items.len() == 1 {
|
||||
|
@ -1470,11 +1470,11 @@ impl<T, A: Allocator> Vec<T, A> {
|
||||
///
|
||||
/// ```
|
||||
/// let mut vec = vec![1, 2, 3, 4];
|
||||
/// vec.retain_mut(|x| if *x > 3 {
|
||||
/// false
|
||||
/// } else {
|
||||
/// vec.retain_mut(|x| if *x <= 3 {
|
||||
/// *x += 1;
|
||||
/// true
|
||||
/// } else {
|
||||
/// false
|
||||
/// });
|
||||
/// assert_eq!(vec, [2, 3, 4]);
|
||||
/// ```
|
||||
|
@ -344,6 +344,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// println!("{key}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over keys takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn keys(&self) -> Keys<'_, K, V> {
|
||||
Keys { inner: self.iter() }
|
||||
@ -370,6 +375,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// vec.sort_unstable();
|
||||
/// assert_eq!(vec, ["a", "b", "c"]);
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over keys takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[inline]
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "map_into_keys_values", since = "1.54.0")]
|
||||
@ -395,6 +405,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// println!("{val}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over values takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn values(&self) -> Values<'_, K, V> {
|
||||
Values { inner: self.iter() }
|
||||
@ -422,6 +437,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// println!("{val}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over values takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[stable(feature = "map_values_mut", since = "1.10.0")]
|
||||
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
|
||||
ValuesMut { inner: self.iter_mut() }
|
||||
@ -448,6 +468,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// vec.sort_unstable();
|
||||
/// assert_eq!(vec, [1, 2, 3]);
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over values takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[inline]
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "map_into_keys_values", since = "1.54.0")]
|
||||
@ -473,6 +498,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// println!("key: {key} val: {val}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over map takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn iter(&self) -> Iter<'_, K, V> {
|
||||
@ -503,6 +533,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// println!("key: {key} val: {val}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over map takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
|
||||
@ -633,6 +668,11 @@ impl<K, V, S> HashMap<K, V, S> {
|
||||
/// map.retain(|&k, _| k % 2 == 0);
|
||||
/// assert_eq!(map.len(), 4);
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, this operation takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[inline]
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "retain_hash_collection", since = "1.18.0")]
|
||||
|
@ -184,6 +184,11 @@ impl<T, S> HashSet<T, S> {
|
||||
/// println!("{x}");
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, iterating over set takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[inline]
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -312,6 +317,11 @@ impl<T, S> HashSet<T, S> {
|
||||
/// set.retain(|&k| k % 2 == 0);
|
||||
/// assert_eq!(set.len(), 3);
|
||||
/// ```
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// In the current implementation, this operation takes O(capacity) time
|
||||
/// instead of O(len) because it internally visits empty buckets too.
|
||||
#[rustc_lint_query_instability]
|
||||
#[stable(feature = "retain_hash_collection", since = "1.18.0")]
|
||||
pub fn retain<F>(&mut self, f: F)
|
||||
|
@ -1,19 +1,20 @@
|
||||
# The Rustc Book
|
||||
|
||||
- [What is rustc?](what-is-rustc.md)
|
||||
- [Command-line arguments](command-line-arguments.md)
|
||||
- [Command-line Arguments](command-line-arguments.md)
|
||||
- [Codegen Options](codegen-options/index.md)
|
||||
- [Lints](lints/index.md)
|
||||
- [Lint levels](lints/levels.md)
|
||||
- [Lint Levels](lints/levels.md)
|
||||
- [Lint Groups](lints/groups.md)
|
||||
- [Lint listing](lints/listing/index.md)
|
||||
- [Allowed-by-default lints](lints/listing/allowed-by-default.md)
|
||||
- [Warn-by-default lints](lints/listing/warn-by-default.md)
|
||||
- [Deny-by-default lints](lints/listing/deny-by-default.md)
|
||||
- [Codegen options](codegen-options/index.md)
|
||||
- [Lint Listing](lints/listing/index.md)
|
||||
- [Allowed-by-default Lints](lints/listing/allowed-by-default.md)
|
||||
- [Warn-by-default Lints](lints/listing/warn-by-default.md)
|
||||
- [Deny-by-default Lints](lints/listing/deny-by-default.md)
|
||||
- [JSON Output](json.md)
|
||||
- [Tests](tests/index.md)
|
||||
- [Platform Support](platform-support.md)
|
||||
- [Template for target-specific documentation](platform-support/TEMPLATE.md)
|
||||
- [Target Tier Policy](target-tier-policy.md)
|
||||
- [Template for Target-specific Documentation](platform-support/TEMPLATE.md)
|
||||
- [aarch64-apple-ios-sim](platform-support/aarch64-apple-ios-sim.md)
|
||||
- [armv7-unknown-linux-uclibceabi](platform-support/armv7-unknown-linux-uclibceabi.md)
|
||||
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
|
||||
@ -25,13 +26,12 @@
|
||||
- [*-unknown-openbsd](platform-support/openbsd.md)
|
||||
- [wasm64-unknown-unknown](platform-support/wasm64-unknown-unknown.md)
|
||||
- [x86_64-unknown-none](platform-support/x86_64-unknown-none.md)
|
||||
- [Target Tier Policy](target-tier-policy.md)
|
||||
- [Targets](targets/index.md)
|
||||
- [Built-in Targets](targets/built-in.md)
|
||||
- [Custom Targets](targets/custom.md)
|
||||
- [Known Issues](targets/known-issues.md)
|
||||
- [Profile-guided Optimization](profile-guided-optimization.md)
|
||||
- [Instrumentation-based Code Coverage](instrument-coverage.md)
|
||||
- [Linker-plugin based LTO](linker-plugin-lto.md)
|
||||
- [Linker-plugin-based LTO](linker-plugin-lto.md)
|
||||
- [Exploit Mitigations](exploit-mitigations.md)
|
||||
- [Contributing to `rustc`](contributing.md)
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Codegen options
|
||||
# Codegen Options
|
||||
|
||||
All of these options are passed to `rustc` via the `-C` flag, short for "codegen." You can see
|
||||
a version of this list for your exact compiler by running `rustc -C help`.
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Command-line arguments
|
||||
# Command-line Arguments
|
||||
|
||||
Here's a list of command-line arguments to `rustc` and what they do.
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# `instrument-coverage`
|
||||
# Instrumentation-based Code Coverage
|
||||
|
||||
## Introduction
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Linker-plugin-LTO
|
||||
# Linker-plugin-based LTO
|
||||
|
||||
The `-C linker-plugin-lto` flag allows for deferring the LTO optimization
|
||||
to the actual linking step, which in turn allows for performing
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Lint levels
|
||||
# Lint Levels
|
||||
|
||||
In `rustc`, lints are divided into five *levels*:
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
# Allowed-by-default lints
|
||||
# Allowed-by-default Lints
|
||||
|
||||
This file is auto-generated by the lint-docs script.
|
||||
|
@ -1,3 +1,3 @@
|
||||
# Deny-by-default lints
|
||||
# Deny-by-default Lints
|
||||
|
||||
This file is auto-generated by the lint-docs script.
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Lint listing
|
||||
# Lint Listing
|
||||
|
||||
This section lists out all of the lints, grouped by their default lint levels.
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
# Warn-by-default lints
|
||||
# Warn-by-default Lints
|
||||
|
||||
This file is auto-generated by the lint-docs script.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Windows targets similar to `*-pc-windows-gnu` but using UCRT as the runtime and various LLVM tools/libraries instead of GCC/Binutils.
|
||||
|
||||
Target triples avaiable so far:
|
||||
Target triples available so far:
|
||||
- `aarch64-pc-windows-gnullvm`
|
||||
- `x86_64-pc-windows-gnullvm`
|
||||
|
||||
@ -26,7 +26,7 @@ Like with any other Windows target created binaries are in PE format.
|
||||
## Building the target
|
||||
|
||||
For cross-compilation I recommend using [llvm-mingw](https://github.com/mstorsjo/llvm-mingw) toolchain, one change that seems necessary beside configuring corss compilers is disabling experimental `m86k` target. Otherwise LLVM build fails with `multiple definition ...` errors.
|
||||
Native bootstrapping builds require rather fragile hacks until host artifacts are avaiable so I won't describe them here.
|
||||
Native bootstrapping builds require rather fragile hacks until host artifacts are available so I won't describe them here.
|
||||
|
||||
## Building Rust programs
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Profile Guided Optimization
|
||||
# Profile-guided Optimization
|
||||
|
||||
`rustc` supports doing profile-guided optimization (PGO).
|
||||
This chapter describes what PGO is, what it is good for, and how it can be used.
|
||||
|
@ -5,6 +5,12 @@ LL | let _ = foo([0; 1]);
|
||||
| - ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
| |
|
||||
| consider giving this pattern a type
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-83249.rs:12:8
|
||||
|
|
||||
LL | fn foo<T: Foo>(_: [u8; T::N]) -> T {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,12 +3,24 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | A = foo(),
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-64662.rs:6:14
|
||||
|
|
||||
LL | const fn foo<T>() -> isize {
|
||||
| ^
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-64662.rs:3:9
|
||||
|
|
||||
LL | B = foo(),
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-64662.rs:6:14
|
||||
|
|
||||
LL | const fn foo<T>() -> isize {
|
||||
| ^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -37,6 +37,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | bfnr(x);
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `bfnr`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/E0401.rs:4:13
|
||||
|
|
||||
LL | fn bfnr<U, V: Baz<U>, W: Fn()>(y: T) {
|
||||
| ^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
17
src/test/ui/inference/ambiguous_type_parameter.rs
Normal file
17
src/test/ui/inference/ambiguous_type_parameter.rs
Normal file
@ -0,0 +1,17 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
trait Store<K, V> {
|
||||
fn get_raw(&self, key: &K) -> Option<()>;
|
||||
}
|
||||
|
||||
struct InMemoryStore;
|
||||
|
||||
impl<K> Store<String, HashMap<K, String>> for InMemoryStore {
|
||||
fn get_raw(&self, key: &String) -> Option<()> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
InMemoryStore.get_raw(&String::default()); //~ ERROR type annotations needed
|
||||
}
|
15
src/test/ui/inference/ambiguous_type_parameter.stderr
Normal file
15
src/test/ui/inference/ambiguous_type_parameter.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/ambiguous_type_parameter.rs:16:19
|
||||
|
|
||||
LL | InMemoryStore.get_raw(&String::default());
|
||||
| ^^^^^^^ cannot infer type for type parameter `K`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/ambiguous_type_parameter.rs:9:6
|
||||
|
|
||||
LL | impl<K> Store<String, HashMap<K, String>> for InMemoryStore {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
@ -6,6 +6,11 @@ LL | let foo = foo(1, "");
|
||||
| |
|
||||
| consider giving `foo` the explicit type `Foo<_, _, W, Z>`, where the type parameter `W` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/erase-type-params-in-label.rs:25:14
|
||||
|
|
||||
LL | fn foo<T, K, W: Default, Z: Default>(t: T, k: K) -> Foo<T, K, W, Z> {
|
||||
| ^
|
||||
= note: cannot satisfy `_: Default`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/erase-type-params-in-label.rs:25:17
|
||||
@ -25,6 +30,11 @@ LL | let bar = bar(1, "");
|
||||
| |
|
||||
| consider giving `bar` the explicit type `Bar<_, _, Z>`, where the type parameter `Z` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/erase-type-params-in-label.rs:14:14
|
||||
|
|
||||
LL | fn bar<T, K, Z: Default>(t: T, k: K) -> Bar<T, K, Z> {
|
||||
| ^
|
||||
= note: cannot satisfy `_: Default`
|
||||
note: required by a bound in `bar`
|
||||
--> $DIR/erase-type-params-in-label.rs:14:17
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | foo(gen()); //<- Do not suggest `foo::<impl Clone>()`!
|
||||
| ^^^ cannot infer type for type parameter `impl Clone` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-86162-1.rs:3:11
|
||||
|
|
||||
LL | fn foo(x: impl Clone) {}
|
||||
| ^^^^^^^^^^
|
||||
= note: cannot satisfy `_: Clone`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/issue-86162-1.rs:3:16
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | Foo::bar(gen()); //<- Do not suggest `Foo::bar::<impl Clone>()`!
|
||||
| ^^^^^^^^ cannot infer type for type parameter `impl Clone` declared on the associated function `bar`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-86162-2.rs:8:15
|
||||
|
|
||||
LL | fn bar(x: impl Clone) {}
|
||||
| ^^^^^^^^^^
|
||||
= note: cannot satisfy `_: Clone`
|
||||
note: required by a bound in `Foo::bar`
|
||||
--> $DIR/issue-86162-2.rs:8:20
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo(TypeWithState(marker::PhantomData));
|
||||
| ^^^ cannot infer type for type parameter `State` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/issue-6458.rs:6:12
|
||||
|
|
||||
LL | pub fn foo<State>(_: TypeWithState<State>) {}
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
#![deny(unused_attributes)]
|
||||
#![feature(inherent_associated_types)]
|
||||
#![allow(dead_code, incomplete_features)]
|
||||
#![crate_type = "lib"]
|
||||
#![deny(unused_attributes)]
|
||||
// run-rustfix
|
||||
|
||||
pub trait Trait {
|
||||
@ -12,6 +14,17 @@ pub trait Trait {
|
||||
|
||||
pub struct Implementor;
|
||||
|
||||
impl Implementor {
|
||||
#[doc(hidden)] // no error
|
||||
type Inh = ();
|
||||
|
||||
#[doc(hidden)] // no error
|
||||
const INH: () = ();
|
||||
|
||||
#[doc(hidden)] // no error
|
||||
fn inh() {}
|
||||
}
|
||||
|
||||
impl Trait for Implementor {
|
||||
|
||||
type It = ();
|
||||
|
@ -1,5 +1,7 @@
|
||||
#![deny(unused_attributes)]
|
||||
#![feature(inherent_associated_types)]
|
||||
#![allow(dead_code, incomplete_features)]
|
||||
#![crate_type = "lib"]
|
||||
#![deny(unused_attributes)]
|
||||
// run-rustfix
|
||||
|
||||
pub trait Trait {
|
||||
@ -12,6 +14,17 @@ pub trait Trait {
|
||||
|
||||
pub struct Implementor;
|
||||
|
||||
impl Implementor {
|
||||
#[doc(hidden)] // no error
|
||||
type Inh = ();
|
||||
|
||||
#[doc(hidden)] // no error
|
||||
const INH: () = ();
|
||||
|
||||
#[doc(hidden)] // no error
|
||||
fn inh() {}
|
||||
}
|
||||
|
||||
impl Trait for Implementor {
|
||||
#[doc(hidden)]
|
||||
type It = ();
|
||||
|
@ -1,11 +1,11 @@
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:16:5
|
||||
--> $DIR/unused-attr-doc-hidden.rs:29:5
|
||||
|
|
||||
LL | #[doc(hidden)]
|
||||
| ^^^^^^^^^^^^^^ help: remove this attribute
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-attr-doc-hidden.rs:1:9
|
||||
--> $DIR/unused-attr-doc-hidden.rs:4:9
|
||||
|
|
||||
LL | #![deny(unused_attributes)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -13,7 +13,7 @@ LL | #![deny(unused_attributes)]
|
||||
= note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
|
||||
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:21:5
|
||||
--> $DIR/unused-attr-doc-hidden.rs:34:5
|
||||
|
|
||||
LL | #[doc(hidden)]
|
||||
| ^^^^^^^^^^^^^^ help: remove this attribute
|
||||
@ -22,7 +22,7 @@ LL | #[doc(hidden)]
|
||||
= note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
|
||||
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:26:11
|
||||
--> $DIR/unused-attr-doc-hidden.rs:39:11
|
||||
|
|
||||
LL | #[doc(hidden, alias = "aka")]
|
||||
| ^^^^^^--
|
||||
@ -33,7 +33,7 @@ LL | #[doc(hidden, alias = "aka")]
|
||||
= note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
|
||||
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:31:27
|
||||
--> $DIR/unused-attr-doc-hidden.rs:44:27
|
||||
|
|
||||
LL | #[doc(alias = "this", hidden,)]
|
||||
| ^^^^^^-
|
||||
@ -44,7 +44,7 @@ LL | #[doc(alias = "this", hidden,)]
|
||||
= note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
|
||||
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:36:11
|
||||
--> $DIR/unused-attr-doc-hidden.rs:49:11
|
||||
|
|
||||
LL | #[doc(hidden, hidden)]
|
||||
| ^^^^^^--
|
||||
@ -55,7 +55,7 @@ LL | #[doc(hidden, hidden)]
|
||||
= note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
|
||||
|
||||
error: `#[doc(hidden)]` is ignored on trait impl items
|
||||
--> $DIR/unused-attr-doc-hidden.rs:36:19
|
||||
--> $DIR/unused-attr-doc-hidden.rs:49:19
|
||||
|
|
||||
LL | #[doc(hidden, hidden)]
|
||||
| ^^^^^^ help: remove this attribute
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `X` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/missing-type-parameter.rs:1:8
|
||||
|
|
||||
LL | fn foo<X>() { }
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
11
src/test/ui/parser/issue-81827.rs
Normal file
11
src/test/ui/parser/issue-81827.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// error-pattern: this file contains an unclosed delimiter
|
||||
// error-pattern: mismatched closing delimiter: `]`
|
||||
// error-pattern: expected one of `)` or `,`, found `{`
|
||||
|
||||
#![crate_name="0"]
|
||||
|
||||
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn r()->i{0|{#[cfg(r(0{]0
|
35
src/test/ui/parser/issue-81827.stderr
Normal file
35
src/test/ui/parser/issue-81827.stderr
Normal file
@ -0,0 +1,35 @@
|
||||
error: this file contains an unclosed delimiter
|
||||
--> $DIR/issue-81827.rs:11:27
|
||||
|
|
||||
LL | fn r()->i{0|{#[cfg(r(0{]0
|
||||
| - - ^
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| unclosed delimiter
|
||||
|
||||
error: this file contains an unclosed delimiter
|
||||
--> $DIR/issue-81827.rs:11:27
|
||||
|
|
||||
LL | fn r()->i{0|{#[cfg(r(0{]0
|
||||
| - - ^
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| unclosed delimiter
|
||||
|
||||
error: mismatched closing delimiter: `]`
|
||||
--> $DIR/issue-81827.rs:11:23
|
||||
|
|
||||
LL | fn r()->i{0|{#[cfg(r(0{]0
|
||||
| - ^^ mismatched closing delimiter
|
||||
| | |
|
||||
| | unclosed delimiter
|
||||
| closing delimiter possibly meant for this
|
||||
|
||||
error: expected one of `)` or `,`, found `{`
|
||||
--> $DIR/issue-81827.rs:11:23
|
||||
|
|
||||
LL | fn r()->i{0|{#[cfg(r(0{]0
|
||||
| ^ expected one of `)` or `,`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
@ -5,6 +5,12 @@ LL | let _ = f;
|
||||
| - ^ cannot infer type for type parameter `A` declared on the function `f`
|
||||
| |
|
||||
| consider giving this pattern the explicit type `fn() -> A`, where the type parameter `A` is specified
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/fn-needing-specified-return-type-param.rs:1:6
|
||||
|
|
||||
LL | fn f<A>() -> A { unimplemented!() }
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | test(22, std::default::Default::default());
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `test`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:20:11
|
||||
|
|
||||
LL | fn test<T,U>(_: T, _: U)
|
||||
| ^
|
||||
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:26:5
|
||||
@ -10,6 +16,11 @@ error[E0283]: type annotations needed
|
||||
LL | test(22, std::default::Default::default());
|
||||
| ^^^^ cannot infer type for type parameter `U` declared on the function `test`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:20:11
|
||||
|
|
||||
LL | fn test<T,U>(_: T, _: U)
|
||||
| ^
|
||||
note: multiple `impl`s satisfying `i32: Convert<_>` found
|
||||
--> $DIR/multidispatch-convert-ambig-dest.rs:8:1
|
||||
|
|
||||
|
@ -16,6 +16,11 @@ LL | a.method();
|
||||
| | cannot infer type for type parameter `U`
|
||||
| this method call resolves to `U`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:12:9
|
||||
|
|
||||
LL | impl<T, U> V<U> for A<T>
|
||||
| ^
|
||||
note: multiple `impl`s satisfying `B: I<_>` found
|
||||
--> $DIR/not-suggest-non-existing-fully-qualified-path.rs:5:1
|
||||
|
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/unbounded-type-param-in-fn-with-assoc-type.rs:3:8
|
||||
|
|
||||
LL | fn foo<T, U = u64>() -> (T, U) {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -3,6 +3,12 @@ error[E0282]: type annotations needed
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/unbounded-type-param-in-fn.rs:1:8
|
||||
|
|
||||
LL | fn foo<T>() -> T {
|
||||
| ^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,6 +4,11 @@ error[E0283]: type annotations needed
|
||||
LL | foo(42);
|
||||
| ^^^ cannot infer type for type parameter `T` declared on the function `foo`
|
||||
|
|
||||
help: type parameter declared here
|
||||
--> $DIR/type-annotation-needed.rs:1:8
|
||||
|
|
||||
LL | fn foo<T: Into<String>>(x: i32) {}
|
||||
| ^
|
||||
= note: cannot satisfy `_: Into<String>`
|
||||
note: required by a bound in `foo`
|
||||
--> $DIR/type-annotation-needed.rs:1:11
|
||||
|
@ -482,20 +482,20 @@ fn lint_name(line: &str) -> Result<String, &'static str> {
|
||||
}
|
||||
}
|
||||
|
||||
static ALLOWED_MD: &str = r#"# Allowed-by-default lints
|
||||
static ALLOWED_MD: &str = r#"# Allowed-by-default Lints
|
||||
|
||||
These lints are all set to the 'allow' level by default. As such, they won't show up
|
||||
unless you set them to a higher lint level with a flag or attribute.
|
||||
|
||||
"#;
|
||||
|
||||
static WARN_MD: &str = r#"# Warn-by-default lints
|
||||
static WARN_MD: &str = r#"# Warn-by-default Lints
|
||||
|
||||
These lints are all set to the 'warn' level by default.
|
||||
|
||||
"#;
|
||||
|
||||
static DENY_MD: &str = r#"# Deny-by-default lints
|
||||
static DENY_MD: &str = r#"# Deny-by-default Lints
|
||||
|
||||
These lints are all set to the 'deny' level by default.
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//! The features are detected using the `detect_features` function below.
|
||||
//! This function uses the CPUID instruction to read the feature flags from the
|
||||
//! CPU and encodes them in a `usize` where each bit position represents
|
||||
//! whether a feature is available (bit is set) or unavaiable (bit is cleared).
|
||||
//! whether a feature is available (bit is set) or unavailable (bit is cleared).
|
||||
//!
|
||||
//! The enum `Feature` is used to map bit positions to feature names, and the
|
||||
//! the `__crate::detect::check_for!` macro is used to map string literals (e.g.,
|
||||
|
@ -3,7 +3,7 @@
|
||||
//! The features are detected using the `detect_features` function below.
|
||||
//! This function uses the CPUID instruction to read the feature flags from the
|
||||
//! CPU and encodes them in a `usize` where each bit position represents
|
||||
//! whether a feature is available (bit is set) or unavaiable (bit is cleared).
|
||||
//! whether a feature is available (bit is set) or unavailable (bit is cleared).
|
||||
//!
|
||||
//! The enum `Feature` is used to map bit positions to feature names, and the
|
||||
//! the `__crate::detect::check_for!` macro is used to map string literals (e.g.,
|
||||
|
Loading…
Reference in New Issue
Block a user