diff --git a/src/doc/rustc-guide b/src/doc/rustc-guide index 344c4e437ba4c..464cb5b166378 160000 --- a/src/doc/rustc-guide +++ b/src/doc/rustc-guide @@ -1 +1 @@ -Subproject commit 344c4e437ba4cfa5c14db643ec4d6b68dcd164c5 +Subproject commit 464cb5b166378dff64619081dd4c42533a1eb989 diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index dabf914fdb2cd..4a7a16b2c94e0 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -2561,7 +2561,6 @@ pub fn eq(a: *const T, b: *const T) -> bool { /// # Examples /// /// ``` -/// #![feature(ptr_hash)] /// use std::collections::hash_map::DefaultHasher; /// use std::hash::{Hash, Hasher}; /// use std::ptr; @@ -2579,7 +2578,7 @@ pub fn eq(a: *const T, b: *const T) -> bool { /// /// assert_eq!(actual, expected); /// ``` -#[unstable(feature = "ptr_hash", reason = "newly added", issue = "56286")] +#[stable(feature = "ptr_hash", since = "1.35.0")] pub fn hash(hashee: *const T, into: &mut S) { use hash::Hash; hashee.hash(into); diff --git a/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs b/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs index 3821484d38e5f..7403a5d7dbb09 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/named_anon_conflict.rs @@ -1,6 +1,7 @@ //! Error Reporting for Anonymous Region Lifetime Errors //! where one region is named and the other is anonymous. use crate::infer::error_reporting::nice_region_error::NiceRegionError; +use crate::hir::{FunctionRetTy, TyKind}; use crate::ty; use errors::{Applicability, DiagnosticBuilder}; @@ -11,9 +12,10 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> { let (span, sub, sup) = self.get_regions(); debug!( - "try_report_named_anon_conflict(sub={:?}, sup={:?})", + "try_report_named_anon_conflict(sub={:?}, sup={:?}, error={:?})", sub, - sup + sup, + self.error, ); // Determine whether the sub and sup consist of one named region ('a) @@ -84,6 +86,13 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> { { return None; } + if let FunctionRetTy::Return(ty) = &fndecl.output { + if let (TyKind::Def(_, _), ty::ReStatic) = (&ty.node, sub) { + // This is an impl Trait return that evaluates de need of 'static. + // We handle this case better in `static_impl_trait`. + return None; + } + } } let (error_var, span_label_var) = if let Some(simple_ident) = arg.pat.simple_ident() { @@ -103,13 +112,13 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> { error_var ); + diag.span_label(span, format!("lifetime `{}` required", named)); diag.span_suggestion( - new_ty_span, - &format!("add explicit lifetime `{}` to {}", named, span_label_var), - new_ty.to_string(), - Applicability::Unspecified, - ) - .span_label(span, format!("lifetime `{}` required", named)); + new_ty_span, + &format!("add explicit lifetime `{}` to {}", named, span_label_var), + new_ty.to_string(), + Applicability::Unspecified, + ); Some(diag) } diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index eb629dc44c156..988e4a9ff23a2 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1200,6 +1200,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "when using two-phase-borrows, allow two phases even for non-autoref `&mut` borrows"), time_passes: bool = (false, parse_bool, [UNTRACKED], "measure time of each rustc pass"), + time: bool = (false, parse_bool, [UNTRACKED], + "measure time of rustc processes"), count_llvm_insns: bool = (false, parse_bool, [UNTRACKED_WITH_WARNING(true, "The output generated by `-Z count_llvm_insns` might not be reliable \ diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 7fc5ce6784424..2f3df32945ceb 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -504,6 +504,9 @@ impl Session { self.opts.debugging_opts.verbose } pub fn time_passes(&self) -> bool { + self.opts.debugging_opts.time_passes || self.opts.debugging_opts.time + } + pub fn time_extended(&self) -> bool { self.opts.debugging_opts.time_passes } pub fn profile_queries(&self) -> bool { diff --git a/src/librustc/ty/query/on_disk_cache.rs b/src/librustc/ty/query/on_disk_cache.rs index 05d80f9203f14..28cf3f5245ef8 100644 --- a/src/librustc/ty/query/on_disk_cache.rs +++ b/src/librustc/ty/query/on_disk_cache.rs @@ -12,7 +12,7 @@ use crate::session::{CrateDisambiguator, Session}; use crate::ty; use crate::ty::codec::{self as ty_codec, TyDecoder, TyEncoder}; use crate::ty::context::TyCtxt; -use crate::util::common::time; +use crate::util::common::{time, time_ext}; use errors::Diagnostic; use rustc_data_structures::fx::FxHashMap; @@ -1080,23 +1080,22 @@ fn encode_query_results<'enc, 'a, 'tcx, Q, E>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let desc = &format!("encode_query_results for {}", unsafe { ::std::intrinsics::type_name::() }); - time(tcx.sess, desc, || { + time_ext(tcx.sess.time_extended(), Some(tcx.sess), desc, || { + let map = Q::query_cache(tcx).borrow(); + assert!(map.active.is_empty()); + for (key, entry) in map.results.iter() { + if Q::cache_on_disk(tcx, key.clone()) { + let dep_node = SerializedDepNodeIndex::new(entry.index.index()); - let map = Q::query_cache(tcx).borrow(); - assert!(map.active.is_empty()); - for (key, entry) in map.results.iter() { - if Q::cache_on_disk(tcx, key.clone()) { - let dep_node = SerializedDepNodeIndex::new(entry.index.index()); + // Record position of the cache entry + query_result_index.push((dep_node, AbsoluteBytePos::new(encoder.position()))); - // Record position of the cache entry - query_result_index.push((dep_node, AbsoluteBytePos::new(encoder.position()))); - - // Encode the type check tables with the SerializedDepNodeIndex - // as tag. - encoder.encode_tagged(dep_node, &entry.value)?; + // Encode the type check tables with the SerializedDepNodeIndex + // as tag. + encoder.encode_tagged(dep_node, &entry.value)?; + } } - } - Ok(()) + Ok(()) }) } diff --git a/src/librustc_codegen_llvm/back/link.rs b/src/librustc_codegen_llvm/back/link.rs index 6c175ff4247ca..f10bc0516e5bf 100644 --- a/src/librustc_codegen_llvm/back/link.rs +++ b/src/librustc_codegen_llvm/back/link.rs @@ -18,7 +18,7 @@ use rustc::session::Session; use rustc::middle::cstore::{NativeLibrary, NativeLibraryKind}; use rustc::middle::dependency_format::Linkage; use rustc_codegen_ssa::CodegenResults; -use rustc::util::common::time; +use rustc::util::common::{time, time_ext}; use rustc_fs_util::fix_windows_verbatim_for_gcc; use rustc::hir::def_id::CrateNum; use tempfile::{Builder as TempFileBuilder, TempDir}; @@ -1319,7 +1319,7 @@ fn add_upstream_rust_crates(cmd: &mut dyn Linker, let name = cratepath.file_name().unwrap().to_str().unwrap(); let name = &name[3..name.len() - 5]; // chop off lib/.rlib - time(sess, &format!("altering {}.rlib", name), || { + time_ext(sess.time_extended(), Some(sess), &format!("altering {}.rlib", name), || { let cfg = archive_config(sess, &dst, Some(cratepath)); let mut archive = ArchiveBuilder::new(cfg); archive.update_symbols(); diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs index 55b7855ac0862..fa8c4177eafe2 100644 --- a/src/librustc_codegen_ssa/back/write.rs +++ b/src/librustc_codegen_ssa/back/write.rs @@ -125,7 +125,7 @@ impl ModuleConfig { self.verify_llvm_ir = sess.verify_llvm_ir(); self.no_prepopulate_passes = sess.opts.cg.no_prepopulate_passes; self.no_builtins = no_builtins || sess.target.target.options.no_builtins; - self.time_passes = sess.time_passes(); + self.time_passes = sess.time_extended(); self.inline_threshold = sess.opts.cg.inline_threshold; self.obj_is_bitcode = sess.target.target.options.obj_is_bitcode || sess.opts.cg.linker_plugin_lto.enabled(); @@ -1091,7 +1091,7 @@ fn start_executing_work( fewer_names: sess.fewer_names(), save_temps: sess.opts.cg.save_temps, opts: Arc::new(sess.opts.clone()), - time_passes: sess.time_passes(), + time_passes: sess.time_extended(), profiler: sess.self_profiling.clone(), exported_symbols, plugin_passes: sess.plugin_llvm_passes.borrow().clone(), diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs index 081c458bfc17a..3773f1a40c792 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs @@ -132,6 +132,15 @@ impl<'tcx> RegionInferenceContext<'tcx> { } }); if let Some(i) = best_choice { + if let Some(next) = categorized_path.get(i + 1) { + if categorized_path[i].0 == ConstraintCategory::Return + && next.0 == ConstraintCategory::OpaqueType + { + // The return expression is being influenced by the return type being + // impl Trait, point at the return type and not the return expr. + return *next; + } + } return categorized_path[i]; } @@ -240,6 +249,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { self.provides_universal_region(r, fr, outlived_fr) }); + debug!("report_error: category={:?} {:?}", category, span); // Check if we can use one of the "nice region errors". if let (Some(f), Some(o)) = (self.to_error_region(fr), self.to_error_region(outlived_fr)) { let tables = infcx.tcx.typeck_tables_of(mir_def_id); diff --git a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs index f0d3a0d2986e5..ac10683598aa7 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs @@ -403,8 +403,9 @@ impl<'tcx> RegionInferenceContext<'tcx> { mir_def_id: DefId, errors_buffer: &mut Vec, ) -> Option> { - common::time( - infcx.tcx.sess, + common::time_ext( + infcx.tcx.sess.time_extended(), + Some(infcx.tcx.sess), &format!("solve_nll_region_constraints({:?})", mir_def_id), || self.solve_inner(infcx, mir, mir_def_id, errors_buffer), ) diff --git a/src/librustc_mir/interpret/snapshot.rs b/src/librustc_mir/interpret/snapshot.rs index 0168e1301fa7a..8bb663f846b73 100644 --- a/src/librustc_mir/interpret/snapshot.rs +++ b/src/librustc_mir/interpret/snapshot.rs @@ -431,7 +431,7 @@ impl<'a, 'mir, 'tcx> Eq for EvalSnapshot<'a, 'mir, 'tcx> impl<'a, 'mir, 'tcx> PartialEq for EvalSnapshot<'a, 'mir, 'tcx> { fn eq(&self, other: &Self) -> bool { - // FIXME: This looks to be a *ridicolously expensive* comparison operation. + // FIXME: This looks to be a *ridiculously expensive* comparison operation. // Doesn't this make tons of copies? Either `snapshot` is very badly named, // or it does! self.snapshot() == other.snapshot() diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index ae8e57d54de31..37360a563950b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6722,6 +6722,22 @@ impl<'a> Parser<'a> { self.expect(&token::OpenDelim(token::Brace))?; let mut trait_items = vec![]; while !self.eat(&token::CloseDelim(token::Brace)) { + if let token::DocComment(_) = self.token { + if self.look_ahead(1, + |tok| tok == &token::Token::CloseDelim(token::Brace)) { + let mut err = self.diagnostic().struct_span_err_with_code( + self.span, + "found a documentation comment that doesn't document anything", + DiagnosticId::Error("E0584".into()), + ); + err.help("doc comments must come before what they document, maybe a \ + comment was intended with `//`?", + ); + err.emit(); + self.bump(); + continue; + } + } let mut at_end = false; match self.parse_trait_item(&mut at_end) { Ok(item) => trait_items.push(item), diff --git a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.rs b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.rs index ef1b976ae333f..1c3b5ac76138f 100644 --- a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.rs +++ b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.rs @@ -1,7 +1,7 @@ use std::fmt::Debug; fn elided(x: &i32) -> impl Copy { x } -//~^ ERROR explicit lifetime required in the type of `x` [E0621] +//~^ ERROR cannot infer an appropriate lifetime fn explicit<'a>(x: &'a i32) -> impl Copy { x } //~^ ERROR cannot infer an appropriate lifetime diff --git a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr index 8a477e42a66ef..9339a83b09a9d 100644 --- a/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr +++ b/src/test/ui/impl-trait/must_outlive_least_region_or_bound.stderr @@ -1,10 +1,20 @@ -error[E0621]: explicit lifetime required in the type of `x` - --> $DIR/must_outlive_least_region_or_bound.rs:3:23 +error: cannot infer an appropriate lifetime + --> $DIR/must_outlive_least_region_or_bound.rs:3:35 | LL | fn elided(x: &i32) -> impl Copy { x } - | ---- ^^^^^^^^^ lifetime `'static` required - | | - | help: add explicit lifetime `'static` to the type of `x`: `&'static i32` + | --------- ^ ...but this borrow... + | | + | this return type evaluates to the `'static` lifetime... + | +note: ...can't outlive the anonymous lifetime #1 defined on the function body at 3:1 + --> $DIR/must_outlive_least_region_or_bound.rs:3:1 + | +LL | fn elided(x: &i32) -> impl Copy { x } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +help: you can add a constraint to the return type to make it last less than `'static` and match the anonymous lifetime #1 defined on the function body at 3:1 + | +LL | fn elided(x: &i32) -> impl Copy + '_ { x } + | ^^^^^^^^^^^^^^ error: cannot infer an appropriate lifetime --> $DIR/must_outlive_least_region_or_bound.rs:6:44 @@ -67,5 +77,5 @@ LL | fn ty_param_wont_outlive_static(x: T) -> impl Debug + 'static { error: aborting due to 5 previous errors -Some errors occurred: E0310, E0621, E0623. +Some errors occurred: E0310, E0623. For more information about an error, try `rustc --explain E0310`. diff --git a/src/test/ui/nll/ty-outlives/impl-trait-captures.rs b/src/test/ui/nll/ty-outlives/impl-trait-captures.rs index 7405505d5d6f8..bcdf643c0b9d1 100644 --- a/src/test/ui/nll/ty-outlives/impl-trait-captures.rs +++ b/src/test/ui/nll/ty-outlives/impl-trait-captures.rs @@ -8,8 +8,8 @@ trait Foo<'a> { impl<'a, T> Foo<'a> for T { } fn foo<'a, T>(x: &T) -> impl Foo<'a> { +//~^ ERROR explicit lifetime required in the type of `x` [E0621] x - //~^ ERROR explicit lifetime required in the type of `x` [E0621] } fn main() {} diff --git a/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr b/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr index d9481b6156ca0..3a1e3ce3ad1a0 100644 --- a/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr +++ b/src/test/ui/nll/ty-outlives/impl-trait-captures.stderr @@ -1,8 +1,8 @@ error[E0621]: explicit lifetime required in the type of `x` - --> $DIR/impl-trait-captures.rs:11:5 + --> $DIR/impl-trait-captures.rs:10:25 | -LL | x - | ^ lifetime `ReEarlyBound(0, 'a)` required +LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> { + | ^^^^^^^^^^^^ lifetime `ReEarlyBound(0, 'a)` required help: add explicit lifetime `ReEarlyBound(0, 'a)` to the type of `x` | LL | fn foo<'a, T>(x: &ReEarlyBound(0, 'a) T) -> impl Foo<'a> { diff --git a/src/test/ui/parser/doc-inside-trait-item.rs b/src/test/ui/parser/doc-inside-trait-item.rs new file mode 100644 index 0000000000000..87b501bd2a2df --- /dev/null +++ b/src/test/ui/parser/doc-inside-trait-item.rs @@ -0,0 +1,6 @@ +trait User{ + fn test(); + /// empty doc + //~^ ERROR found a documentation comment that doesn't document anything +} +fn main() {} diff --git a/src/test/ui/parser/doc-inside-trait-item.stderr b/src/test/ui/parser/doc-inside-trait-item.stderr new file mode 100644 index 0000000000000..261e27b6e0d18 --- /dev/null +++ b/src/test/ui/parser/doc-inside-trait-item.stderr @@ -0,0 +1,11 @@ +error[E0584]: found a documentation comment that doesn't document anything + --> $DIR/doc-inside-trait-item.rs:3:5 + | +LL | /// empty doc + | ^^^^^^^^^^^^^ + | + = help: doc comments must come before what they document, maybe a comment was intended with `//`? + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0584`. diff --git a/src/tools/cargotest/main.rs b/src/tools/cargotest/main.rs index 7f3c159075b97..3126b44f0d618 100644 --- a/src/tools/cargotest/main.rs +++ b/src/tools/cargotest/main.rs @@ -30,7 +30,7 @@ const TEST_REPOS: &'static [Test] = &[ }, Test { name: "tokei", - repo: "https://github.com/Aaronepower/tokei", + repo: "https://github.com/XAMPPRocky/tokei", sha: "5e11c4852fe4aa086b0e4fe5885822fbe57ba928", lock: None, packages: &[],