mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-26 22:53:28 +00:00
Auto merge of #85984 - JohnTitor:rollup-rq0g9ph, r=JohnTitor
Rollup of 8 pull requests Successful merges: - #85717 (Document `From` impls for cow.rs) - #85850 (Remove unused feature gates) - #85888 (Fix typo in internal documentation for `TrustedRandomAccess`) - #85889 (Restoring the `num_def_ids` function in the CStore API ) - #85899 (jsondocck small cleanup) - #85937 (Fix bad suggestions for code from proc_macro) - #85963 (Show `::{{constructor}}` in std::any::type_name().) - #85977 (Fix linkcheck script from getting out of sync.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
4afa3a8092
13
Cargo.lock
13
Cargo.lock
@ -1749,11 +1749,10 @@ dependencies = [
|
||||
"fs-err",
|
||||
"getopts",
|
||||
"jsonpath_lib",
|
||||
"lazy_static",
|
||||
"once_cell",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"shlex 0.1.1",
|
||||
"shlex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2134,7 +2133,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"shlex 1.0.0",
|
||||
"shlex",
|
||||
"tempfile",
|
||||
"toml",
|
||||
]
|
||||
@ -4809,12 +4808,6 @@ version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.0.0"
|
||||
|
@ -12,13 +12,11 @@
|
||||
#![feature(box_patterns)]
|
||||
#![cfg_attr(bootstrap, feature(const_fn_unsize))]
|
||||
#![feature(const_fn_transmute)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(label_break_value)]
|
||||
#![feature(nll)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#![feature(bindings_after_at)]
|
||||
#![feature(iter_is_partitioned)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(box_patterns)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
|
@ -1,15 +1,11 @@
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(assert_matches)]
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(nll)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(iter_zip)]
|
||||
#![recursion_limit = "256"]
|
||||
#![feature(box_syntax)]
|
||||
|
||||
//! This crate contains codegen code that is used by all codegen backends (LLVM and others).
|
||||
//! The backend-agnostic functions of this crate use functions defined in various traits that
|
||||
|
@ -10,15 +10,12 @@
|
||||
#![feature(array_windows)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(generator_trait)]
|
||||
#![feature(fn_traits)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(auto_traits)]
|
||||
#![feature(nll)]
|
||||
#![feature(allow_internal_unstable)]
|
||||
#![feature(hash_raw_entry)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(test)]
|
||||
#![feature(associated_type_bounds)]
|
||||
|
@ -597,7 +597,7 @@ impl<O: ForestObligation> ObligationForest<O> {
|
||||
Some(rpos) => {
|
||||
// Cycle detected.
|
||||
processor.process_backedge(
|
||||
stack[rpos..].iter().map(GetObligation(&self.nodes)),
|
||||
stack[rpos..].iter().map(|&i| &self.nodes[i].obligation),
|
||||
PhantomData,
|
||||
);
|
||||
}
|
||||
@ -705,20 +705,3 @@ impl<O: ForestObligation> ObligationForest<O> {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// I need a Clone closure.
|
||||
#[derive(Clone)]
|
||||
struct GetObligation<'a, O>(&'a [Node<O>]);
|
||||
|
||||
impl<'a, 'b, O> FnOnce<(&'b usize,)> for GetObligation<'a, O> {
|
||||
type Output = &'a O;
|
||||
extern "rust-call" fn call_once(self, args: (&'b usize,)) -> &'a O {
|
||||
&self.0[*args.0].obligation
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b, O> FnMut<(&'b usize,)> for GetObligation<'a, O> {
|
||||
extern "rust-call" fn call_mut(&mut self, args: (&'b usize,)) -> &'a O {
|
||||
&self.0[*args.0].obligation
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(decl_macro)]
|
||||
#![feature(destructuring_assignment)]
|
||||
|
@ -3,12 +3,10 @@
|
||||
//! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/hir.html
|
||||
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(const_panic)]
|
||||
#![cfg_attr(bootstrap, feature(extended_key_value_attributes))]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -1,12 +1,10 @@
|
||||
#![feature(allow_internal_unstable)]
|
||||
#![feature(bench_black_box)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(extend_one)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(test)]
|
||||
#![feature(fn_traits)]
|
||||
#![feature(trusted_step)]
|
||||
|
||||
pub mod bit_set;
|
||||
pub mod vec;
|
||||
|
@ -65,7 +65,7 @@ impl Idx for u32 {
|
||||
/// `u32::MAX`. You can also customize things like the `Debug` impl,
|
||||
/// what traits are derived, and so forth via the macro.
|
||||
#[macro_export]
|
||||
#[allow_internal_unstable(step_trait, rustc_attrs)]
|
||||
#[allow_internal_unstable(step_trait, rustc_attrs, trusted_step)]
|
||||
macro_rules! newtype_index {
|
||||
// ---- public rules ----
|
||||
|
||||
|
@ -16,14 +16,12 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(extend_one)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(never_type)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "512"] // For rustdoc
|
||||
|
||||
#[macro_use]
|
||||
|
@ -1,6 +1,5 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(internal_output_capture)]
|
||||
#![feature(nll)]
|
||||
#![feature(generator_trait)]
|
||||
|
@ -36,8 +36,6 @@
|
||||
#![feature(iter_zip)]
|
||||
#![feature(never_type)]
|
||||
#![feature(nll)]
|
||||
#![feature(half_open_range_patterns)]
|
||||
#![feature(exclusive_range_pattern)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
@ -7,7 +6,6 @@
|
||||
#![feature(once_cell)]
|
||||
#![feature(proc_macro_internals)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(never_type)]
|
||||
#![recursion_limit = "256"]
|
||||
|
@ -1931,6 +1931,10 @@ impl CrateMetadata {
|
||||
self.root.hash
|
||||
}
|
||||
|
||||
fn num_def_ids(&self) -> usize {
|
||||
self.root.tables.def_keys.size()
|
||||
}
|
||||
|
||||
fn local_def_id(&self, index: DefIndex) -> DefId {
|
||||
DefId { krate: self.cnum, index }
|
||||
}
|
||||
|
@ -458,6 +458,13 @@ impl CStore {
|
||||
self.get_crate_data(def_id.krate).module_expansion(def_id.index, sess)
|
||||
}
|
||||
|
||||
/// Only public-facing way to traverse all the definitions in a non-local crate.
|
||||
/// Critically useful for this third-party project: <https://github.com/hacspec/hacspec>.
|
||||
/// See <https://github.com/rust-lang/rust/pull/85889> for context.
|
||||
pub fn num_def_ids_untracked(&self, cnum: CrateNum) -> usize {
|
||||
self.get_crate_data(cnum).num_def_ids()
|
||||
}
|
||||
|
||||
pub fn item_attrs(&self, def_id: DefId, sess: &Session) -> Vec<ast::Attribute> {
|
||||
self.get_crate_data(def_id.krate).get_item_attrs(def_id.index, sess).collect()
|
||||
}
|
||||
|
@ -29,7 +29,6 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(discriminant_kind)]
|
||||
#![feature(never_type)]
|
||||
@ -50,7 +49,6 @@
|
||||
#![feature(associated_type_defaults)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(thread_local_const_init)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "512"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -1,5 +1,5 @@
|
||||
use rustc_hir::def_id::CrateNum;
|
||||
use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData};
|
||||
use rustc_hir::definitions::DisambiguatedDefPathData;
|
||||
use rustc_middle::mir::interpret::Allocation;
|
||||
use rustc_middle::ty::{
|
||||
self,
|
||||
@ -127,11 +127,6 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> {
|
||||
) -> Result<Self::Path, Self::Error> {
|
||||
self = print_prefix(self)?;
|
||||
|
||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
||||
if disambiguated_data.data == DefPathData::Ctor {
|
||||
return Ok(self);
|
||||
}
|
||||
|
||||
write!(self.path, "::{}", disambiguated_data.data).unwrap();
|
||||
|
||||
Ok(self)
|
||||
|
@ -12,16 +12,13 @@ Rust MIR: a lowered representation of Rust.
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(decl_macro)]
|
||||
#![feature(exact_size_is_empty)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(never_type)]
|
||||
#![feature(map_try_insert)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(slice_ptr_len)]
|
||||
#![feature(slice_ptr_get)]
|
||||
#![feature(trusted_len)]
|
||||
#![feature(try_blocks)]
|
||||
@ -31,7 +28,6 @@ Rust MIR: a lowered representation of Rust.
|
||||
#![feature(option_get_or_insert_default)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -1,17 +1,14 @@
|
||||
//! Construction of MIR from HIR.
|
||||
//!
|
||||
//! This crate also contains the match exhaustiveness and usefulness checking.
|
||||
#![feature(array_windows)]
|
||||
#![feature(box_patterns)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -3,7 +3,6 @@
|
||||
#![feature(array_windows)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(bindings_after_at)]
|
||||
#![feature(iter_order_by)]
|
||||
#![feature(box_syntax)]
|
||||
#![feature(box_patterns)]
|
||||
#![recursion_limit = "256"]
|
||||
|
@ -5,13 +5,11 @@
|
||||
//! This API is completely unstable and subject to change.
|
||||
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(const_panic)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(nll)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -2,13 +2,9 @@
|
||||
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(in_band_lifetimes)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(nll)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(never_type)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -1,12 +1,8 @@
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(hash_raw_entry)]
|
||||
#![feature(iter_zip)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(stmt_expr_attributes)]
|
||||
#![feature(trusted_step)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate tracing;
|
||||
|
@ -14,10 +14,7 @@ Core encoding and decoding interfaces.
|
||||
#![feature(nll)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(vec_spare_capacity)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(maybe_uninit_array_assume_init)]
|
||||
#![feature(maybe_uninit_uninit_array)]
|
||||
#![feature(maybe_uninit_slice)]
|
||||
#![feature(new_uninit)]
|
||||
#![cfg_attr(test, feature(test))]
|
||||
|
@ -16,12 +16,10 @@
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(array_windows)]
|
||||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(negative_impls)]
|
||||
#![feature(nll)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(thread_local_const_init)]
|
||||
#![feature(trusted_step)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -9,13 +9,11 @@
|
||||
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||
#![feature(bool_to_option)]
|
||||
#![feature(const_panic)]
|
||||
#![feature(nll)]
|
||||
#![feature(never_type)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![feature(min_specialization)]
|
||||
#![feature(trusted_step)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
@ -8,6 +8,7 @@ use rustc_errors::{Applicability, DiagnosticBuilder};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{is_range_literal, Node};
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
use rustc_middle::ty::adjustment::AllowTwoPhase;
|
||||
use rustc_middle::ty::{self, AssocItem, Ty, TypeAndMut};
|
||||
use rustc_span::symbol::sym;
|
||||
@ -412,14 +413,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
checked_ty: Ty<'tcx>,
|
||||
expected: Ty<'tcx>,
|
||||
) -> Option<(Span, &'static str, String, Applicability)> {
|
||||
let sm = self.sess().source_map();
|
||||
let sess = self.sess();
|
||||
let sp = expr.span;
|
||||
if sm.is_imported(sp) {
|
||||
// Ignore if span is from within a macro #41858, #58298. We previously used the macro
|
||||
// call span, but that breaks down when the type error comes from multiple calls down.
|
||||
|
||||
// If the span is from an external macro, there's no suggestion we can make.
|
||||
if in_external_macro(sess, sp) {
|
||||
return None;
|
||||
}
|
||||
|
||||
let sm = sess.source_map();
|
||||
|
||||
let replace_prefix = |s: &str, old: &str, new: &str| {
|
||||
s.strip_prefix(old).map(|stripped| new.to_string() + stripped)
|
||||
};
|
||||
@ -427,10 +430,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let is_struct_pat_shorthand_field =
|
||||
self.is_hir_id_from_struct_pattern_shorthand_field(expr.hir_id, sp);
|
||||
|
||||
// If the span is from a macro, then it's hard to extract the text
|
||||
// and make a good suggestion, so don't bother.
|
||||
let is_macro = sp.from_expansion() && sp.desugaring_kind().is_none();
|
||||
|
||||
// `ExprKind::DropTemps` is semantically irrelevant for these suggestions.
|
||||
let expr = expr.peel_drop_temps();
|
||||
|
||||
@ -570,10 +569,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, _, ref expr),
|
||||
_,
|
||||
&ty::Ref(_, checked, _),
|
||||
) if {
|
||||
self.infcx.can_sub(self.param_env, checked, &expected).is_ok() && !is_macro
|
||||
} =>
|
||||
{
|
||||
) if self.infcx.can_sub(self.param_env, checked, &expected).is_ok() => {
|
||||
// We have `&T`, check if what was expected was `T`. If so,
|
||||
// we may want to suggest removing a `&`.
|
||||
if sm.is_imported(expr.span) {
|
||||
@ -589,13 +585,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
return None;
|
||||
}
|
||||
if let Ok(code) = sm.span_to_snippet(expr.span) {
|
||||
return Some((
|
||||
sp,
|
||||
"consider removing the borrow",
|
||||
code,
|
||||
Applicability::MachineApplicable,
|
||||
));
|
||||
if sp.contains(expr.span) {
|
||||
if let Ok(code) = sm.span_to_snippet(expr.span) {
|
||||
return Some((
|
||||
sp,
|
||||
"consider removing the borrow",
|
||||
code,
|
||||
Applicability::MachineApplicable,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
(
|
||||
@ -643,7 +641,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
}
|
||||
_ if sp == expr.span && !is_macro => {
|
||||
_ if sp == expr.span => {
|
||||
if let Some(steps) = self.deref_steps(checked_ty, expected) {
|
||||
let expr = expr.peel_blocks();
|
||||
|
||||
|
@ -5,6 +5,12 @@ use super::Vec;
|
||||
|
||||
#[stable(feature = "cow_from_vec", since = "1.8.0")]
|
||||
impl<'a, T: Clone> From<&'a [T]> for Cow<'a, [T]> {
|
||||
/// Creates a [`Borrowed`] variant of [`Cow`]
|
||||
/// from a slice.
|
||||
///
|
||||
/// This conversion does not allocate or clone the data.
|
||||
///
|
||||
/// [`Borrowed`]: crate::borrow::Cow::Borrowed
|
||||
fn from(s: &'a [T]) -> Cow<'a, [T]> {
|
||||
Cow::Borrowed(s)
|
||||
}
|
||||
@ -12,6 +18,12 @@ impl<'a, T: Clone> From<&'a [T]> for Cow<'a, [T]> {
|
||||
|
||||
#[stable(feature = "cow_from_vec", since = "1.8.0")]
|
||||
impl<'a, T: Clone> From<Vec<T>> for Cow<'a, [T]> {
|
||||
/// Creates an [`Owned`] variant of [`Cow`]
|
||||
/// from an owned instance of [`Vec`].
|
||||
///
|
||||
/// This conversion does not allocate or clone the data.
|
||||
///
|
||||
/// [`Owned`]: crate::borrow::Cow::Owned
|
||||
fn from(v: Vec<T>) -> Cow<'a, [T]> {
|
||||
Cow::Owned(v)
|
||||
}
|
||||
@ -19,6 +31,12 @@ impl<'a, T: Clone> From<Vec<T>> for Cow<'a, [T]> {
|
||||
|
||||
#[stable(feature = "cow_from_vec_ref", since = "1.28.0")]
|
||||
impl<'a, T: Clone> From<&'a Vec<T>> for Cow<'a, [T]> {
|
||||
/// Creates a [`Borrowed`] variant of [`Cow`]
|
||||
/// from a reference to [`Vec`].
|
||||
///
|
||||
/// This conversion does not allocate or clone the data.
|
||||
///
|
||||
/// [`Borrowed`]: crate::borrow::Cow::Borrowed
|
||||
fn from(v: &'a Vec<T>) -> Cow<'a, [T]> {
|
||||
Cow::Borrowed(v.as_slice())
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ impl<A: Debug + TrustedRandomAccess, B: Debug + TrustedRandomAccess> ZipFmt<A, B
|
||||
/// called on `self`:
|
||||
/// * `std::clone::Clone::clone()`
|
||||
/// * `std::iter::Iterator::size_hint()`
|
||||
/// * `std::iter::Iterator::next_back()`
|
||||
/// * `std::iter::DoubleEndedIterator::next_back()`
|
||||
/// * `std::iter::Iterator::__iterator_get_unchecked()`
|
||||
/// * `std::iter::TrustedRandomAccess::size()`
|
||||
///
|
||||
|
@ -114,3 +114,16 @@ fn any_unsized() {
|
||||
fn is_any<T: Any + ?Sized>() {}
|
||||
is_any::<[i32]>();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn distinct_type_names() {
|
||||
// https://github.com/rust-lang/rust/issues/84666
|
||||
|
||||
struct Velocity(f32, f32);
|
||||
|
||||
fn type_name_of_val<T>(_: T) -> &'static str {
|
||||
type_name::<T>()
|
||||
}
|
||||
|
||||
assert_ne!(type_name_of_val(Velocity), type_name_of_val(Velocity(0.0, -9.8)),);
|
||||
}
|
||||
|
18
src/test/ui/suggestions/auxiliary/proc-macro-type-error.rs
Normal file
18
src/test/ui/suggestions/auxiliary/proc-macro-type-error.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// force-host
|
||||
// no-prefer-dynamic
|
||||
#![crate_type = "proc-macro"]
|
||||
#![feature(proc_macro_quote)]
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
use proc_macro::{quote, TokenStream};
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn hello(_: TokenStream, _: TokenStream) -> TokenStream {
|
||||
quote!(
|
||||
fn f(_: &mut i32) {}
|
||||
fn g() {
|
||||
f(123);
|
||||
}
|
||||
)
|
||||
}
|
29
src/test/ui/suggestions/suggest-ref-macro.rs
Normal file
29
src/test/ui/suggestions/suggest-ref-macro.rs
Normal file
@ -0,0 +1,29 @@
|
||||
// run-check
|
||||
// aux-build:proc-macro-type-error.rs
|
||||
|
||||
extern crate proc_macro_type_error;
|
||||
|
||||
use proc_macro_type_error::hello;
|
||||
|
||||
#[hello] //~ERROR mismatched types
|
||||
fn abc() {}
|
||||
|
||||
fn x(_: &mut i32) {}
|
||||
|
||||
macro_rules! bla {
|
||||
() => {
|
||||
x(123);
|
||||
//~^ ERROR mismatched types
|
||||
//~| SUGGESTION &mut 123
|
||||
};
|
||||
($v:expr) => {
|
||||
x($v)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
bla!();
|
||||
bla!(456);
|
||||
//~^ ERROR mismatched types
|
||||
//~| SUGGESTION &mut 456
|
||||
}
|
34
src/test/ui/suggestions/suggest-ref-macro.stderr
Normal file
34
src/test/ui/suggestions/suggest-ref-macro.stderr
Normal file
@ -0,0 +1,34 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/suggest-ref-macro.rs:8:1
|
||||
|
|
||||
LL | #[hello]
|
||||
| ^^^^^^^^ expected `&mut i32`, found integer
|
||||
|
|
||||
= note: this error originates in the attribute macro `hello` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/suggest-ref-macro.rs:15:11
|
||||
|
|
||||
LL | x(123);
|
||||
| ^^^
|
||||
| |
|
||||
| expected `&mut i32`, found integer
|
||||
| help: consider mutably borrowing here: `&mut 123`
|
||||
...
|
||||
LL | bla!();
|
||||
| ------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `bla` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/suggest-ref-macro.rs:26:10
|
||||
|
|
||||
LL | bla!(456);
|
||||
| ^^^
|
||||
| |
|
||||
| expected `&mut i32`, found integer
|
||||
| help: consider mutably borrowing here: `&mut 456`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -8,8 +8,7 @@ edition = "2018"
|
||||
jsonpath_lib = "0.2"
|
||||
getopts = "0.2"
|
||||
regex = "1.4"
|
||||
lazy_static = "1.4"
|
||||
shlex = "0.1"
|
||||
serde = "1.0"
|
||||
shlex = "1.0"
|
||||
serde_json = "1.0"
|
||||
fs-err = "2.5.0"
|
||||
once_cell = "1.0"
|
||||
|
@ -1,5 +1,5 @@
|
||||
use jsonpath_lib::select;
|
||||
use lazy_static::lazy_static;
|
||||
use once_cell::sync::Lazy;
|
||||
use regex::{Regex, RegexBuilder};
|
||||
use serde_json::Value;
|
||||
use std::borrow::Cow;
|
||||
@ -94,19 +94,19 @@ impl fmt::Display for CommandKind {
|
||||
}
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref LINE_PATTERN: Regex = RegexBuilder::new(
|
||||
static LINE_PATTERN: Lazy<Regex> = Lazy::new(|| {
|
||||
RegexBuilder::new(
|
||||
r#"
|
||||
\s(?P<invalid>!?)@(?P<negated>!?)
|
||||
(?P<cmd>[A-Za-z]+(?:-[A-Za-z]+)*)
|
||||
(?P<args>.*)$
|
||||
"#
|
||||
"#,
|
||||
)
|
||||
.ignore_whitespace(true)
|
||||
.unicode(true)
|
||||
.build()
|
||||
.unwrap();
|
||||
}
|
||||
.unwrap()
|
||||
});
|
||||
|
||||
fn print_err(msg: &str, lineno: usize) {
|
||||
eprintln!("Invalid command: {} on line {}", msg, lineno)
|
||||
|
@ -85,11 +85,11 @@ fi
|
||||
if [ ! -e "linkchecker/main.rs" ] || [ "$iterative" = "0" ]
|
||||
then
|
||||
echo "Downloading linkchecker source..."
|
||||
nightly_hash=$(rustc +nightly -Vv | grep commit-hash | cut -f2 -d" ")
|
||||
url="https://raw.githubusercontent.com/rust-lang/rust"
|
||||
mkdir linkchecker
|
||||
curl -o linkchecker/Cargo.toml \
|
||||
https://raw.githubusercontent.com/rust-lang/rust/master/src/tools/linkchecker/Cargo.toml
|
||||
curl -o linkchecker/main.rs \
|
||||
https://raw.githubusercontent.com/rust-lang/rust/master/src/tools/linkchecker/main.rs
|
||||
curl -o linkchecker/Cargo.toml ${url}/${nightly_hash}/src/tools/linkchecker/Cargo.toml
|
||||
curl -o linkchecker/main.rs ${url}/${nightly_hash}/src/tools/linkchecker/main.rs
|
||||
fi
|
||||
|
||||
echo "Building book \"$book_name\"..."
|
||||
@ -106,7 +106,7 @@ else
|
||||
check_path="linkcheck/$book_name"
|
||||
fi
|
||||
echo "Running linkchecker on \"$check_path\"..."
|
||||
cargo run --manifest-path=linkchecker/Cargo.toml -- "$check_path"
|
||||
cargo run --release --manifest-path=linkchecker/Cargo.toml -- "$check_path"
|
||||
|
||||
if [ "$iterative" = "0" ]
|
||||
then
|
||||
|
Loading…
Reference in New Issue
Block a user