From 6df57a7d680463dfb6927b4407ee2329f9288522 Mon Sep 17 00:00:00 2001 From: Geoffry Song Date: Fri, 26 Oct 2018 01:21:34 -0700 Subject: [PATCH 01/17] Slight copy-editing for `std::cell::Cell` docs Hopefully this is a bit more precise and also more correct English. --- src/libcore/cell.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index ec7d366c3f5ce..689cf319bd750 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -207,8 +207,8 @@ use ptr; /// /// # Examples /// -/// Here you can see how using `Cell` allows to use mutable field inside -/// immutable struct (which is also called 'interior mutability'). +/// In this example, you can see that `Cell` enables mutation inside an +/// immutable struct. In other words, it enables "interior mutability". /// /// ``` /// use std::cell::Cell; @@ -225,10 +225,11 @@ use ptr; /// /// let new_value = 100; /// -/// // ERROR, because my_struct is immutable +/// // ERROR: `my_struct` is immutable /// // my_struct.regular_field = new_value; /// -/// // WORKS, although `my_struct` is immutable, field `special_field` is mutable because it is Cell +/// // WORKS: although `my_struct` is immutable, `special_field` is a `Cell`, +/// // which can always be mutated /// my_struct.special_field.set(new_value); /// assert_eq!(my_struct.special_field.get(), new_value); /// ``` From 42d3ef7f6728935c7e37ab578afc467d1b325e62 Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Sun, 28 Oct 2018 12:14:54 +0100 Subject: [PATCH 02/17] Remove unused re import in gdb_rust_pretty_printing --- src/etc/gdb_rust_pretty_printing.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/etc/gdb_rust_pretty_printing.py b/src/etc/gdb_rust_pretty_printing.py index b1252f386df36..e6d5ef1a23ff7 100755 --- a/src/etc/gdb_rust_pretty_printing.py +++ b/src/etc/gdb_rust_pretty_printing.py @@ -9,7 +9,6 @@ # except according to those terms. import gdb -import re import sys import debugger_pretty_printers_common as rustpp From 20aa7513835b26256664f409c36611a9bc3b88e4 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 28 Oct 2018 15:33:27 -0400 Subject: [PATCH 03/17] Choose predicates without inference variables over those with them Fixes #54705 When constructing synthetic auto trait impls, we may come across multiple predicates involving the same type, trait, and substitutions. Since we can only display one of these, we pick the one with the 'most strict' lifetime paramters. This ensures that the impl we render the user is actually valid (that is, a struct matching that impl will actually implement the auto trait in question). This commit exapnds the definition of 'more strict' to take into account inference variables. We always choose a predicate without inference variables over a predicate with inference variables. --- src/librustc/traits/auto_trait.rs | 42 ++++++++++++++++++++++++------- src/test/rustdoc/issue-54705.rs | 40 +++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 src/test/rustdoc/issue-54705.rs diff --git a/src/librustc/traits/auto_trait.rs b/src/librustc/traits/auto_trait.rs index 50ca6ca78ab3a..fea686d5db364 100644 --- a/src/librustc/traits/auto_trait.rs +++ b/src/librustc/traits/auto_trait.rs @@ -447,27 +447,51 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { ty::RegionKind::ReLateBound(_, _), ) => {} - (ty::RegionKind::ReLateBound(_, _), _) => { + (ty::RegionKind::ReLateBound(_, _), _) | + (_, ty::RegionKind::ReVar(_)) => { + // One of these is true: // The new predicate has a HRTB in a spot where the old // predicate does not (if they both had a HRTB, the previous - // match arm would have executed). + // match arm would have executed). A HRBT is a 'stricter' + // bound than anything else, so we want to keep the newer + // predicate (with the HRBT) in place of the old predicate. // - // The means we want to remove the older predicate from - // user_computed_preds, since having both it and the new + // OR + // + // The old predicate has a region variable where the new + // predicate has some other kind of region. An region + // variable isn't something we can actually display to a user, + // so we choose ther new predicate (which doesn't have a region + // varaible). + // + // In both cases, we want to remove the old predicate, + // from user_computed_preds, and replace it with the new + // one. Having both the old and the new // predicate in a ParamEnv would confuse SelectionContext + // // We're currently in the predicate passed to 'retain', // so we return 'false' to remove the old predicate from // user_computed_preds return false; } - (_, ty::RegionKind::ReLateBound(_, _)) => { - // This is the opposite situation as the previous arm - the - // old predicate has a HRTB lifetime in a place where the - // new predicate does not. We want to leave the old + (_, ty::RegionKind::ReLateBound(_, _)) | + (ty::RegionKind::ReVar(_), _) => { + // This is the opposite situation as the previous arm. + // One of these is true: + // + // The old predicate has a HRTB lifetime in a place where the + // new predicate does not. + // + // OR + // + // The new predicate has a region variable where the old + // predicate has some other type of region. + // + // We want to leave the old // predicate in user_computed_preds, and skip adding // new_pred to user_computed_params. should_add_new = false - } + }, _ => {} } } diff --git a/src/test/rustdoc/issue-54705.rs b/src/test/rustdoc/issue-54705.rs new file mode 100644 index 0000000000000..ccc939657a146 --- /dev/null +++ b/src/test/rustdoc/issue-54705.rs @@ -0,0 +1,40 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + + +pub trait ScopeHandle<'scope> {} + + + +// @has issue_54705/struct.ScopeFutureContents.html +// @has - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]//*/code' "impl<'scope, S> \ +// Send for ScopeFutureContents<'scope, S> where S: Sync" +// +// @has - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]//*/code' "impl<'scope, S> \ +// Sync for ScopeFutureContents<'scope, S> where S: Sync" +pub struct ScopeFutureContents<'scope, S> + where S: ScopeHandle<'scope>, +{ + dummy: &'scope S, + this: Box>, +} + +struct ScopeFuture<'scope, S> + where S: ScopeHandle<'scope>, +{ + contents: ScopeFutureContents<'scope, S>, +} + +unsafe impl<'scope, S> Send for ScopeFuture<'scope, S> + where S: ScopeHandle<'scope>, +{} +unsafe impl<'scope, S> Sync for ScopeFuture<'scope, S> + where S: ScopeHandle<'scope>, +{} From a7bea73292cd9353feb19532f9c6d1afcb2a99d4 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Tue, 23 Oct 2018 21:13:03 -0400 Subject: [PATCH 04/17] Don't print opt fuel messages to stdout because it breaks Rustbuild Rustbuild passes `--message-format json` to the compiler invocations which causes JSON to be emitted on stdout. Printing optimization fuel messages to stdout breaks the json and causes Rustbuild to fail. Work around this by emitting optimization fuel related messages on stderr instead. --- src/librustc/session/mod.rs | 2 +- src/librustc_driver/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index a17825a877d88..fe94b62ef19e2 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -868,7 +868,7 @@ impl Session { let fuel = self.optimization_fuel_limit.get(); ret = fuel != 0; if fuel == 0 && !self.out_of_fuel.get() { - println!("optimization-fuel-exhausted: {}", msg()); + eprintln!("optimization-fuel-exhausted: {}", msg()); self.out_of_fuel.set(true); } else if fuel > 0 { self.optimization_fuel_limit.set(fuel - 1); diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 276b7290c2ef0..8a7d4a0174310 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -944,7 +944,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls { control.compilation_done.callback = box move |state| { old_callback(state); let sess = state.session; - println!("Fuel used by {}: {}", + eprintln!("Fuel used by {}: {}", sess.print_fuel_crate.as_ref().unwrap(), sess.print_fuel.get()); } From dbc3c6e56fe4cc7c4692b18067b335fc63ca1ec8 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 30 Oct 2018 17:48:48 +1100 Subject: [PATCH 05/17] Make `process_obligations`' computation of `completed` optional. It's only used in tests. This reduces instruction counts on several benchmarks by 0.5--1%. --- src/librustc/traits/fulfill.rs | 7 +- .../obligation_forest/mod.rs | 54 ++++++---- .../obligation_forest/test.rs | 99 ++++++++++--------- 3 files changed, 88 insertions(+), 72 deletions(-) diff --git a/src/librustc/traits/fulfill.rs b/src/librustc/traits/fulfill.rs index cfa77b210e857..0c692dd9a0661 100644 --- a/src/librustc/traits/fulfill.rs +++ b/src/librustc/traits/fulfill.rs @@ -12,8 +12,9 @@ use infer::InferCtxt; use mir::interpret::{GlobalId, ErrorHandled}; use ty::{self, Ty, TypeFoldable, ToPolyTraitRef, ToPredicate}; use ty::error::ExpectedFound; -use rustc_data_structures::obligation_forest::{Error, ForestObligation, ObligationForest}; -use rustc_data_structures::obligation_forest::{ObligationProcessor, ProcessResult}; +use rustc_data_structures::obligation_forest::{DoCompleted, Error, ForestObligation}; +use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor}; +use rustc_data_structures::obligation_forest::{ProcessResult}; use std::marker::PhantomData; use hir::def_id::DefId; @@ -98,7 +99,7 @@ impl<'a, 'gcx, 'tcx> FulfillmentContext<'tcx> { let outcome = self.predicates.process_obligations(&mut FulfillProcessor { selcx, register_region_obligations: self.register_region_obligations - }); + }, DoCompleted::No); debug!("select: outcome={:#?}", outcome); // FIXME: if we kept the original cache key, we could mark projection diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs index ccf2a7f81590e..c211d888df131 100644 --- a/src/librustc_data_structures/obligation_forest/mod.rs +++ b/src/librustc_data_structures/obligation_forest/mod.rs @@ -162,8 +162,8 @@ enum NodeState { #[derive(Debug)] pub struct Outcome { /// Obligations that were completely evaluated, including all - /// (transitive) subobligations. - pub completed: Vec, + /// (transitive) subobligations. Only computed if requested. + pub completed: Option>, /// Backtrace of obligations that were found to be in error. pub errors: Vec>, @@ -177,6 +177,14 @@ pub struct Outcome { pub stalled: bool, } +/// Should `process_obligations` compute the `Outcome::completed` field of its +/// result? +#[derive(PartialEq)] +pub enum DoCompleted { + No, + Yes, +} + #[derive(Debug, PartialEq, Eq)] pub struct Error { pub error: E, @@ -282,8 +290,8 @@ impl ObligationForest { }); } } - let successful_obligations = self.compress(); - assert!(successful_obligations.is_empty()); + let successful_obligations = self.compress(DoCompleted::Yes); + assert!(successful_obligations.unwrap().is_empty()); errors } @@ -311,7 +319,8 @@ impl ObligationForest { /// be called in a loop until `outcome.stalled` is false. /// /// This CANNOT be unrolled (presently, at least). - pub fn process_obligations

(&mut self, processor: &mut P) -> Outcome + pub fn process_obligations

(&mut self, processor: &mut P, do_completed: DoCompleted) + -> Outcome where P: ObligationProcessor { debug!("process_obligations(len={})", self.nodes.len()); @@ -366,7 +375,7 @@ impl ObligationForest { // There's no need to perform marking, cycle processing and compression when nothing // changed. return Outcome { - completed: vec![], + completed: if do_completed == DoCompleted::Yes { Some(vec![]) } else { None }, errors, stalled, }; @@ -376,12 +385,12 @@ impl ObligationForest { self.process_cycles(processor); // Now we have to compress the result - let completed_obligations = self.compress(); + let completed = self.compress(do_completed); debug!("process_obligations: complete"); Outcome { - completed: completed_obligations, + completed, errors, stalled, } @@ -524,7 +533,7 @@ impl ObligationForest { /// Beforehand, all nodes must be marked as `Done` and no cycles /// on these nodes may be present. This is done by e.g. `process_cycles`. #[inline(never)] - fn compress(&mut self) -> Vec { + fn compress(&mut self, do_completed: DoCompleted) -> Option> { let nodes_len = self.nodes.len(); let mut node_rewrites: Vec<_> = self.scratch.take().unwrap(); node_rewrites.extend(0..nodes_len); @@ -573,21 +582,26 @@ impl ObligationForest { if dead_nodes == 0 { node_rewrites.truncate(0); self.scratch = Some(node_rewrites); - return vec![]; + return if do_completed == DoCompleted::Yes { Some(vec![]) } else { None }; } // Pop off all the nodes we killed and extract the success // stories. - let successful = (0..dead_nodes) - .map(|_| self.nodes.pop().unwrap()) - .flat_map(|node| { - match node.state.get() { - NodeState::Error => None, - NodeState::Done => Some(node.obligation), - _ => unreachable!() - } - }) - .collect(); + let successful = if do_completed == DoCompleted::Yes { + Some((0..dead_nodes) + .map(|_| self.nodes.pop().unwrap()) + .flat_map(|node| { + match node.state.get() { + NodeState::Error => None, + NodeState::Done => Some(node.obligation), + _ => unreachable!() + } + }) + .collect()) + } else { + self.nodes.truncate(self.nodes.len() - dead_nodes); + None + }; self.apply_rewrites(&node_rewrites); node_rewrites.truncate(0); diff --git a/src/librustc_data_structures/obligation_forest/test.rs b/src/librustc_data_structures/obligation_forest/test.rs index c27a65e34310f..2a418973fbda2 100644 --- a/src/librustc_data_structures/obligation_forest/test.rs +++ b/src/librustc_data_structures/obligation_forest/test.rs @@ -10,7 +10,7 @@ #![cfg(test)] -use super::{Error, ObligationForest, ObligationProcessor, Outcome, ProcessResult}; +use super::{Error, DoCompleted, ObligationForest, ObligationProcessor, Outcome, ProcessResult}; use std::fmt; use std::marker::PhantomData; @@ -84,8 +84,8 @@ fn push_pop() { "C" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, vec!["C"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["C"]); assert_eq!(err, vec![Error { error: "B is for broken", @@ -108,8 +108,8 @@ fn push_pop() { "D" => ProcessResult::Changed(vec!["D.1", "D.2"]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, Vec::<&'static str>::new()); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), Vec::<&'static str>::new()); assert_eq!(err, Vec::new()); @@ -127,8 +127,8 @@ fn push_pop() { "D.2" => ProcessResult::Changed(vec!["D.2.i"]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, vec!["A.3", "A.1", "A.3.i"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["A.3", "A.1", "A.3.i"]); assert_eq!(err, vec![Error { error: "A is for apple", @@ -143,8 +143,8 @@ fn push_pop() { "D.2.i" => ProcessResult::Changed(vec![]), _ => panic!("unexpected obligation {:?}", obligation), } - }, |_| {})); - assert_eq!(ok, vec!["D.2.i", "D.2"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["D.2.i", "D.2"]); assert_eq!(err, vec![Error { error: "D is for dumb", @@ -171,8 +171,8 @@ fn success_in_grandchildren() { "A" => ProcessResult::Changed(vec!["A.1", "A.2", "A.3"]), _ => unreachable!(), } - }, |_| {})); - assert!(ok.is_empty()); + }, |_| {}), DoCompleted::Yes); + assert!(ok.unwrap().is_empty()); assert!(err.is_empty()); let Outcome { completed: ok, errors: err, .. } = @@ -183,8 +183,8 @@ fn success_in_grandchildren() { "A.3" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, vec!["A.3", "A.1"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["A.3", "A.1"]); assert!(err.is_empty()); let Outcome { completed: ok, errors: err, .. } = @@ -194,8 +194,8 @@ fn success_in_grandchildren() { "A.2.ii" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, vec!["A.2.ii"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["A.2.ii"]); assert!(err.is_empty()); let Outcome { completed: ok, errors: err, .. } = @@ -204,14 +204,15 @@ fn success_in_grandchildren() { "A.2.i.a" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_| {})); - assert_eq!(ok, vec!["A.2.i.a", "A.2.i", "A.2", "A"]); + }, |_| {}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["A.2.i.a", "A.2.i", "A.2", "A"]); assert!(err.is_empty()); let Outcome { completed: ok, errors: err, .. } = - forest.process_obligations(&mut C(|_| unreachable!(), |_| {})); + forest.process_obligations(&mut C(|_| unreachable!(), |_| {}), + DoCompleted::Yes); - assert!(ok.is_empty()); + assert!(ok.unwrap().is_empty()); assert!(err.is_empty()); } @@ -227,8 +228,8 @@ fn to_errors_no_throw() { "A" => ProcessResult::Changed(vec!["A.1", "A.2", "A.3"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let errors = forest.to_errors(()); assert_eq!(errors[0].backtrace, vec!["A.1", "A"]); @@ -248,8 +249,8 @@ fn diamond() { "A" => ProcessResult::Changed(vec!["A.1", "A.2"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let Outcome { completed: ok, errors: err, .. } = @@ -259,8 +260,8 @@ fn diamond() { "A.2" => ProcessResult::Changed(vec!["D"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let mut d_count = 0; @@ -270,9 +271,9 @@ fn diamond() { "D" => { d_count += 1; ProcessResult::Changed(vec![]) }, _ => unreachable!(), } - }, |_|{})); + }, |_|{}), DoCompleted::Yes); assert_eq!(d_count, 1); - assert_eq!(ok, vec!["D", "A.2", "A.1", "A"]); + assert_eq!(ok.unwrap(), vec!["D", "A.2", "A.1", "A"]); assert_eq!(err.len(), 0); let errors = forest.to_errors(()); @@ -285,8 +286,8 @@ fn diamond() { "A'" => ProcessResult::Changed(vec!["A'.1", "A'.2"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let Outcome { completed: ok, errors: err, .. } = @@ -296,8 +297,8 @@ fn diamond() { "A'.2" => ProcessResult::Changed(vec!["D'"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let mut d_count = 0; @@ -307,9 +308,9 @@ fn diamond() { "D'" => { d_count += 1; ProcessResult::Error("operation failed") }, _ => unreachable!(), } - }, |_|{})); + }, |_|{}), DoCompleted::Yes); assert_eq!(d_count, 1); - assert_eq!(ok.len(), 0); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err, vec![super::Error { error: "operation failed", backtrace: vec!["D'", "A'.1", "A'"] @@ -333,8 +334,8 @@ fn done_dependency() { "A: Sized" | "B: Sized" | "C: Sized" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok, vec!["C: Sized", "B: Sized", "A: Sized"]); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["C: Sized", "B: Sized", "A: Sized"]); assert_eq!(err.len(), 0); forest.register_obligation("(A,B,C): Sized"); @@ -348,8 +349,8 @@ fn done_dependency() { ]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok, vec!["(A,B,C): Sized"]); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["(A,B,C): Sized"]); assert_eq!(err.len(), 0); } @@ -371,8 +372,8 @@ fn orphan() { "C2" => ProcessResult::Changed(vec![]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok, vec!["C2", "C1"]); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap(), vec!["C2", "C1"]); assert_eq!(err.len(), 0); let Outcome { completed: ok, errors: err, .. } = @@ -382,8 +383,8 @@ fn orphan() { "B" => ProcessResult::Changed(vec!["D"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err.len(), 0); let Outcome { completed: ok, errors: err, .. } = @@ -393,8 +394,8 @@ fn orphan() { "E" => ProcessResult::Error("E is for error"), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err, vec![super::Error { error: "E is for error", backtrace: vec!["E", "A"] @@ -406,8 +407,8 @@ fn orphan() { "D" => ProcessResult::Error("D is dead"), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err, vec![super::Error { error: "D is dead", backtrace: vec!["D"] @@ -431,8 +432,8 @@ fn simultaneous_register_and_error() { "B" => ProcessResult::Changed(vec!["A"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err, vec![super::Error { error: "An error", backtrace: vec!["A"] @@ -449,8 +450,8 @@ fn simultaneous_register_and_error() { "B" => ProcessResult::Changed(vec!["A"]), _ => unreachable!(), } - }, |_|{})); - assert_eq!(ok.len(), 0); + }, |_|{}), DoCompleted::Yes); + assert_eq!(ok.unwrap().len(), 0); assert_eq!(err, vec![super::Error { error: "An error", backtrace: vec!["A"] From d22ae75c9d6aeb4bb79b51e7c6fc3d824c736ac6 Mon Sep 17 00:00:00 2001 From: Cameron Hart Date: Wed, 31 Oct 2018 02:54:56 +1100 Subject: [PATCH 06/17] Fix feature gate only being checked on first repr attr. --- src/libsyntax/attr/mod.rs | 5 +++++ src/libsyntax/feature_gate.rs | 2 +- src/test/ui/feature-gates/feature-gate-repr-simd.rs | 4 ++++ .../ui/feature-gates/feature-gate-repr-simd.stderr | 10 +++++++++- src/test/ui/feature-gates/feature-gate-repr_packed.rs | 4 ++++ .../ui/feature-gates/feature-gate-repr_packed.stderr | 10 +++++++++- 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index 5404420988c35..6487665947729 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -455,6 +455,11 @@ pub fn find_by_name<'a>(attrs: &'a [Attribute], name: &str) -> Option<&'a Attrib attrs.iter().find(|attr| attr.check_name(name)) } +pub fn filter_by_name<'a>(attrs: &'a [Attribute], name: &'a str) + -> impl Iterator { + attrs.iter().filter(move |attr| attr.check_name(name)) +} + pub fn first_attr_value_str_by_name(attrs: &[Attribute], name: &str) -> Option { attrs.iter() .find(|at| at.check_name(name)) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index da0ec33030e06..d4dc1f8b50851 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1625,7 +1625,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { } ast::ItemKind::Struct(..) => { - if let Some(attr) = attr::find_by_name(&i.attrs[..], "repr") { + for attr in attr::filter_by_name(&i.attrs[..], "repr") { for item in attr.meta_item_list().unwrap_or_else(Vec::new) { if item.check_name("simd") { gate_feature_post!(&self, repr_simd, attr.span, diff --git a/src/test/ui/feature-gates/feature-gate-repr-simd.rs b/src/test/ui/feature-gates/feature-gate-repr-simd.rs index 429cec7ec90d0..a70f2758abb59 100644 --- a/src/test/ui/feature-gates/feature-gate-repr-simd.rs +++ b/src/test/ui/feature-gates/feature-gate-repr-simd.rs @@ -11,4 +11,8 @@ #[repr(simd)] //~ error: SIMD types are experimental struct Foo(u64, u64); +#[repr(C)] +#[repr(simd)] //~ error: SIMD types are experimental +struct Bar(u64, u64); + fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-repr-simd.stderr b/src/test/ui/feature-gates/feature-gate-repr-simd.stderr index 8174f82060a18..2f98bd24d4f79 100644 --- a/src/test/ui/feature-gates/feature-gate-repr-simd.stderr +++ b/src/test/ui/feature-gates/feature-gate-repr-simd.stderr @@ -6,6 +6,14 @@ LL | #[repr(simd)] //~ error: SIMD types are experimental | = help: add #![feature(repr_simd)] to the crate attributes to enable -error: aborting due to previous error +error[E0658]: SIMD types are experimental and possibly buggy (see issue #27731) + --> $DIR/feature-gate-repr-simd.rs:15:1 + | +LL | #[repr(simd)] //~ error: SIMD types are experimental + | ^^^^^^^^^^^^^ + | + = help: add #![feature(repr_simd)] to the crate attributes to enable + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/feature-gate-repr_packed.rs b/src/test/ui/feature-gates/feature-gate-repr_packed.rs index 12bb152b46749..65e3be288fdf7 100644 --- a/src/test/ui/feature-gates/feature-gate-repr_packed.rs +++ b/src/test/ui/feature-gates/feature-gate-repr_packed.rs @@ -11,4 +11,8 @@ #[repr(packed(1))] //~ error: the `#[repr(packed(n))]` attribute is experimental struct Foo(u64); +#[repr(C)] +#[repr(packed(1))] //~ error: the `#[repr(packed(n))]` attribute is experimental +struct Bar(u64); + fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-repr_packed.stderr b/src/test/ui/feature-gates/feature-gate-repr_packed.stderr index d0faf9d90bd5c..ed89a3f6b3169 100644 --- a/src/test/ui/feature-gates/feature-gate-repr_packed.stderr +++ b/src/test/ui/feature-gates/feature-gate-repr_packed.stderr @@ -6,6 +6,14 @@ LL | #[repr(packed(1))] //~ error: the `#[repr(packed(n))]` attribute is experim | = help: add #![feature(repr_packed)] to the crate attributes to enable -error: aborting due to previous error +error[E0658]: the `#[repr(packed(n))]` attribute is experimental (see issue #33158) + --> $DIR/feature-gate-repr_packed.rs:15:1 + | +LL | #[repr(packed(1))] //~ error: the `#[repr(packed(n))]` attribute is experimental + | ^^^^^^^^^^^^^^^^^^ + | + = help: add #![feature(repr_packed)] to the crate attributes to enable + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`. From 84775edcc26a4923a137f9c40947c6a25632b77f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= Date: Mon, 5 Nov 2018 12:08:35 +0100 Subject: [PATCH 07/17] -C remark: fix incorrect warning about requiring "--debuginfo" instead of "-C debuginfo=n" --- src/librustc/session/config.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 7620077758401..5306f2c9689b1 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -2202,8 +2202,7 @@ pub fn build_session_options_and_crate_config( if !cg.remark.is_empty() && debuginfo == DebugInfo::None { early_warn( error_format, - "-C remark will not show source locations without \ - --debuginfo", + "-C remark requires \"-C debuginfo=n\" to show source locations", ); } From 842914e4864f87df9fb9060b708f96dcb0353df1 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 5 Nov 2018 07:54:38 -0800 Subject: [PATCH 08/17] Add `aarch64-pc-windows-msvc` to deployed targets Accidentally forgotten from #54718! --- src/tools/build-manifest/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index f81964ccbc23c..15fd855d935ae 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -48,6 +48,7 @@ static TARGETS: &'static [&'static str] = &[ "aarch64-apple-ios", "aarch64-fuchsia", "aarch64-linux-android", + "aarch64-pc-windows-msvc", "aarch64-unknown-cloudabi", "aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl", From a1c4060c9daf800e50016f67821baff4088fb19e Mon Sep 17 00:00:00 2001 From: Alexander Regueiro Date: Mon, 5 Nov 2018 04:00:03 +0000 Subject: [PATCH 09/17] Moved and renamed ui issue tests. --- .../{issue_11680.rs => issue-11680.rs} | 0 .../{issue_16725.rs => issue-16725.rs} | 0 ...rivacy.rs => issue-17718-const-privacy.rs} | 0 .../{issue_1920.rs => issue-1920.rs} | 0 .../{issue_21202.rs => issue-21202.rs} | 0 ...{issue_30123_aux.rs => issue-30123-aux.rs} | 0 .../{issue_41549.rs => issue-41549.rs} | 0 .../{issue_5844_aux.rs => issue-5844-aux.rs} | 0 .../{lint_stability.rs => lint-stability.rs} | 0 ...rivate_trait_xc.rs => private-trait-xc.rs} | 0 ...sue_43189_a.rs => xcrate-issue-43189-a.rs} | 0 ...sue_43189_b.rs => xcrate-issue-43189-b.rs} | 0 ....rs => xcrate-issue-46112-rexport-core.rs} | 0 src/test/ui/issues/issue-11593.rs | 2 +- src/test/ui/issues/issue-11680.rs | 2 +- src/test/ui/issues/issue-16725.rs | 2 +- .../ui/issues/issue-17718-const-privacy.rs | 2 +- src/test/ui/issues/issue-1920-1.rs | 2 +- src/test/ui/issues/issue-1920-2.rs | 2 +- src/test/ui/issues/issue-1920-3.rs | 2 +- src/test/ui/issues/issue-21202.rs | 2 +- src/test/ui/issues/issue-28075.rs | 2 +- src/test/ui/issues/issue-28388-3.rs | 2 +- src/test/ui/issues/issue-30123.rs | 2 +- .../{issue32829.rs => issue-32829-2.rs} | 0 ...issue32829.stderr => issue-32829-2.stderr} | 24 +++++++++---------- .../{issue_38875_b.rs => issue-38875-b.rs} | 0 .../{issue_38875.rs => issue-38875.rs} | 2 +- src/test/ui/{ => issues}/issue-40827.rs | 0 src/test/ui/{ => issues}/issue-40827.stderr | 0 src/test/ui/issues/issue-41549.rs | 2 +- .../{issue_41652_b.rs => issue-41652-b.rs} | 0 .../{issue_41652.rs => issue-41652.rs} | 2 +- ...{issue_41652.stderr => issue-41652.stderr} | 2 +- src/test/ui/issues/issue-43189.rs | 4 ++-- .../{issue_45829_a.rs => issue-45829-a.rs} | 0 .../{issue_45829_b.rs => issue-45829-b.rs} | 0 .../issue-45829/rename-extern-vs-use.rs | 2 +- .../issue-45829/rename-extern-with-tab.rs | 4 ++-- .../ui/issues/issue-45829/rename-extern.rs | 4 ++-- .../issue-45829/rename-use-vs-extern.rs | 2 +- src/test/ui/issues/issue-46112.rs | 2 +- src/test/ui/{ => issues}/issue-49556.rs | 0 .../{option_deref.rs => option-deref.rs} | 0 ...ption_deref.stderr => option-deref.stderr} | 2 +- ...esult_deref_err.rs => result-deref-err.rs} | 0 ...ref_err.stderr => result-deref-err.stderr} | 2 +- ...{result_deref_ok.rs => result-deref-ok.rs} | 0 ...deref_ok.stderr => result-deref-ok.stderr} | 2 +- .../{result_deref.rs => result-deref.rs} | 0 ...esult_deref.stderr => result-deref.stderr} | 2 +- src/test/ui/{ => issues}/issue-51602.rs | 0 src/test/ui/{ => issues}/issue-51602.stderr | 0 src/test/ui/{ => issues}/issue-52717.rs | 0 src/test/ui/{ => issues}/issue-52717.stderr | 0 src/test/ui/{ => issues}/issue-52992.rs | 0 src/test/ui/{ => issues}/issue-53251.rs | 0 src/test/ui/{ => issues}/issue-53251.stderr | 0 src/test/ui/{ => issues}/issue-53300.rs | 0 src/test/ui/{ => issues}/issue-53300.stderr | 0 src/test/ui/{ => issues}/issue-53419.rs | 0 src/test/ui/{ => issues}/issue-53565.rs | 0 src/test/ui/{ => issues}/issue-53565.stderr | 0 src/test/ui/{ => issues}/issue-53568.rs | 0 src/test/ui/{ => issues}/issue-53692.rs | 0 src/test/ui/{ => issues}/issue-53692.stderr | 0 src/test/ui/{ => issues}/issue-53840.rs | 0 src/test/ui/{ => issues}/issue-53840.stderr | 0 src/test/ui/{ => issues}/issue-54302-cases.rs | 0 .../ui/{ => issues}/issue-54302-cases.stderr | 0 src/test/ui/{ => issues}/issue-54302.rs | 0 src/test/ui/{ => issues}/issue-54302.stderr | 0 src/test/ui/issues/issue-5844.rs | 2 +- 73 files changed, 41 insertions(+), 41 deletions(-) rename src/test/ui/issues/auxiliary/{issue_11680.rs => issue-11680.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_16725.rs => issue-16725.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_17718_const_privacy.rs => issue-17718-const-privacy.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_1920.rs => issue-1920.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_21202.rs => issue-21202.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_30123_aux.rs => issue-30123-aux.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_41549.rs => issue-41549.rs} (100%) rename src/test/ui/issues/auxiliary/{issue_5844_aux.rs => issue-5844-aux.rs} (100%) rename src/test/ui/issues/auxiliary/{lint_stability.rs => lint-stability.rs} (100%) rename src/test/ui/issues/auxiliary/{private_trait_xc.rs => private-trait-xc.rs} (100%) rename src/test/ui/issues/auxiliary/{xcrate_issue_43189_a.rs => xcrate-issue-43189-a.rs} (100%) rename src/test/ui/issues/auxiliary/{xcrate_issue_43189_b.rs => xcrate-issue-43189-b.rs} (100%) rename src/test/ui/issues/auxiliary/{xcrate_issue_46112_rexport_core.rs => xcrate-issue-46112-rexport-core.rs} (100%) rename src/test/ui/issues/{issue32829.rs => issue-32829-2.rs} (100%) rename src/test/ui/issues/{issue32829.stderr => issue-32829-2.stderr} (85%) rename src/test/ui/issues/issue-38875/auxiliary/{issue_38875_b.rs => issue-38875-b.rs} (100%) rename src/test/ui/issues/issue-38875/{issue_38875.rs => issue-38875.rs} (94%) rename src/test/ui/{ => issues}/issue-40827.rs (100%) rename src/test/ui/{ => issues}/issue-40827.stderr (100%) rename src/test/ui/issues/issue-41652/auxiliary/{issue_41652_b.rs => issue-41652-b.rs} (100%) rename src/test/ui/issues/issue-41652/{issue_41652.rs => issue-41652.rs} (95%) rename src/test/ui/issues/issue-41652/{issue_41652.stderr => issue-41652.stderr} (91%) rename src/test/ui/issues/issue-45829/auxiliary/{issue_45829_a.rs => issue-45829-a.rs} (100%) rename src/test/ui/issues/issue-45829/auxiliary/{issue_45829_b.rs => issue-45829-b.rs} (100%) rename src/test/ui/{ => issues}/issue-49556.rs (100%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{option_deref.rs => option-deref.rs} (100%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{option_deref.stderr => option-deref.stderr} (92%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref_err.rs => result-deref-err.rs} (100%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref_err.stderr => result-deref-err.stderr} (92%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref_ok.rs => result-deref-ok.rs} (100%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref_ok.stderr => result-deref-ok.stderr} (92%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref.rs => result-deref.rs} (100%) rename src/test/ui/issues/issue-50264-inner-deref-trait/{result_deref.stderr => result-deref.stderr} (92%) rename src/test/ui/{ => issues}/issue-51602.rs (100%) rename src/test/ui/{ => issues}/issue-51602.stderr (100%) rename src/test/ui/{ => issues}/issue-52717.rs (100%) rename src/test/ui/{ => issues}/issue-52717.stderr (100%) rename src/test/ui/{ => issues}/issue-52992.rs (100%) rename src/test/ui/{ => issues}/issue-53251.rs (100%) rename src/test/ui/{ => issues}/issue-53251.stderr (100%) rename src/test/ui/{ => issues}/issue-53300.rs (100%) rename src/test/ui/{ => issues}/issue-53300.stderr (100%) rename src/test/ui/{ => issues}/issue-53419.rs (100%) rename src/test/ui/{ => issues}/issue-53565.rs (100%) rename src/test/ui/{ => issues}/issue-53565.stderr (100%) rename src/test/ui/{ => issues}/issue-53568.rs (100%) rename src/test/ui/{ => issues}/issue-53692.rs (100%) rename src/test/ui/{ => issues}/issue-53692.stderr (100%) rename src/test/ui/{ => issues}/issue-53840.rs (100%) rename src/test/ui/{ => issues}/issue-53840.stderr (100%) rename src/test/ui/{ => issues}/issue-54302-cases.rs (100%) rename src/test/ui/{ => issues}/issue-54302-cases.stderr (100%) rename src/test/ui/{ => issues}/issue-54302.rs (100%) rename src/test/ui/{ => issues}/issue-54302.stderr (100%) diff --git a/src/test/ui/issues/auxiliary/issue_11680.rs b/src/test/ui/issues/auxiliary/issue-11680.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_11680.rs rename to src/test/ui/issues/auxiliary/issue-11680.rs diff --git a/src/test/ui/issues/auxiliary/issue_16725.rs b/src/test/ui/issues/auxiliary/issue-16725.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_16725.rs rename to src/test/ui/issues/auxiliary/issue-16725.rs diff --git a/src/test/ui/issues/auxiliary/issue_17718_const_privacy.rs b/src/test/ui/issues/auxiliary/issue-17718-const-privacy.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_17718_const_privacy.rs rename to src/test/ui/issues/auxiliary/issue-17718-const-privacy.rs diff --git a/src/test/ui/issues/auxiliary/issue_1920.rs b/src/test/ui/issues/auxiliary/issue-1920.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_1920.rs rename to src/test/ui/issues/auxiliary/issue-1920.rs diff --git a/src/test/ui/issues/auxiliary/issue_21202.rs b/src/test/ui/issues/auxiliary/issue-21202.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_21202.rs rename to src/test/ui/issues/auxiliary/issue-21202.rs diff --git a/src/test/ui/issues/auxiliary/issue_30123_aux.rs b/src/test/ui/issues/auxiliary/issue-30123-aux.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_30123_aux.rs rename to src/test/ui/issues/auxiliary/issue-30123-aux.rs diff --git a/src/test/ui/issues/auxiliary/issue_41549.rs b/src/test/ui/issues/auxiliary/issue-41549.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_41549.rs rename to src/test/ui/issues/auxiliary/issue-41549.rs diff --git a/src/test/ui/issues/auxiliary/issue_5844_aux.rs b/src/test/ui/issues/auxiliary/issue-5844-aux.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue_5844_aux.rs rename to src/test/ui/issues/auxiliary/issue-5844-aux.rs diff --git a/src/test/ui/issues/auxiliary/lint_stability.rs b/src/test/ui/issues/auxiliary/lint-stability.rs similarity index 100% rename from src/test/ui/issues/auxiliary/lint_stability.rs rename to src/test/ui/issues/auxiliary/lint-stability.rs diff --git a/src/test/ui/issues/auxiliary/private_trait_xc.rs b/src/test/ui/issues/auxiliary/private-trait-xc.rs similarity index 100% rename from src/test/ui/issues/auxiliary/private_trait_xc.rs rename to src/test/ui/issues/auxiliary/private-trait-xc.rs diff --git a/src/test/ui/issues/auxiliary/xcrate_issue_43189_a.rs b/src/test/ui/issues/auxiliary/xcrate-issue-43189-a.rs similarity index 100% rename from src/test/ui/issues/auxiliary/xcrate_issue_43189_a.rs rename to src/test/ui/issues/auxiliary/xcrate-issue-43189-a.rs diff --git a/src/test/ui/issues/auxiliary/xcrate_issue_43189_b.rs b/src/test/ui/issues/auxiliary/xcrate-issue-43189-b.rs similarity index 100% rename from src/test/ui/issues/auxiliary/xcrate_issue_43189_b.rs rename to src/test/ui/issues/auxiliary/xcrate-issue-43189-b.rs diff --git a/src/test/ui/issues/auxiliary/xcrate_issue_46112_rexport_core.rs b/src/test/ui/issues/auxiliary/xcrate-issue-46112-rexport-core.rs similarity index 100% rename from src/test/ui/issues/auxiliary/xcrate_issue_46112_rexport_core.rs rename to src/test/ui/issues/auxiliary/xcrate-issue-46112-rexport-core.rs diff --git a/src/test/ui/issues/issue-11593.rs b/src/test/ui/issues/issue-11593.rs index 2749438433d16..f962704dc75a5 100644 --- a/src/test/ui/issues/issue-11593.rs +++ b/src/test/ui/issues/issue-11593.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:private_trait_xc.rs +// aux-build:private-trait-xc.rs extern crate private_trait_xc; diff --git a/src/test/ui/issues/issue-11680.rs b/src/test/ui/issues/issue-11680.rs index 7dccd7811066e..209b63104fa02 100644 --- a/src/test/ui/issues/issue-11680.rs +++ b/src/test/ui/issues/issue-11680.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_11680.rs +// aux-build:issue-11680.rs extern crate issue_11680 as other; diff --git a/src/test/ui/issues/issue-16725.rs b/src/test/ui/issues/issue-16725.rs index cadf602a4cfc4..659ffb2c98408 100644 --- a/src/test/ui/issues/issue-16725.rs +++ b/src/test/ui/issues/issue-16725.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_16725.rs +// aux-build:issue-16725.rs extern crate issue_16725 as foo; diff --git a/src/test/ui/issues/issue-17718-const-privacy.rs b/src/test/ui/issues/issue-17718-const-privacy.rs index 523a387956a32..60eb4b7126dae 100644 --- a/src/test/ui/issues/issue-17718-const-privacy.rs +++ b/src/test/ui/issues/issue-17718-const-privacy.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_17718_const_privacy.rs +// aux-build:issue-17718-const-privacy.rs extern crate issue_17718_const_privacy as other; diff --git a/src/test/ui/issues/issue-1920-1.rs b/src/test/ui/issues/issue-1920-1.rs index 97dd290a45bc8..7ba655805829a 100644 --- a/src/test/ui/issues/issue-1920-1.rs +++ b/src/test/ui/issues/issue-1920-1.rs @@ -10,7 +10,7 @@ //! Test that absolute path names are correct when a crate is not linked into the root namespace -// aux-build:issue_1920.rs +// aux-build:issue-1920.rs mod foo { pub extern crate issue_1920; diff --git a/src/test/ui/issues/issue-1920-2.rs b/src/test/ui/issues/issue-1920-2.rs index 2af6e2cc991fa..bf4817aaf34dc 100644 --- a/src/test/ui/issues/issue-1920-2.rs +++ b/src/test/ui/issues/issue-1920-2.rs @@ -10,7 +10,7 @@ //! Test that when a crate is linked under another name that name is used in global paths -// aux-build:issue_1920.rs +// aux-build:issue-1920.rs extern crate issue_1920 as bar; diff --git a/src/test/ui/issues/issue-1920-3.rs b/src/test/ui/issues/issue-1920-3.rs index fa6efea845fce..a70e958630f28 100644 --- a/src/test/ui/issues/issue-1920-3.rs +++ b/src/test/ui/issues/issue-1920-3.rs @@ -10,7 +10,7 @@ //! Test that when a crate is linked multiple times that the shortest absolute path name is used -// aux-build:issue_1920.rs +// aux-build:issue-1920.rs mod foo { pub extern crate issue_1920; diff --git a/src/test/ui/issues/issue-21202.rs b/src/test/ui/issues/issue-21202.rs index 2bce838c1cfdc..fa4b515c81c00 100644 --- a/src/test/ui/issues/issue-21202.rs +++ b/src/test/ui/issues/issue-21202.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_21202.rs +// aux-build:issue-21202.rs extern crate issue_21202 as crate1; diff --git a/src/test/ui/issues/issue-28075.rs b/src/test/ui/issues/issue-28075.rs index 0f6b9d1b5dc4f..494b446dd3ff2 100644 --- a/src/test/ui/issues/issue-28075.rs +++ b/src/test/ui/issues/issue-28075.rs @@ -10,7 +10,7 @@ // Unstable entities should be caught in import lists -// aux-build:lint_stability.rs +// aux-build:lint-stability.rs #![allow(warnings)] diff --git a/src/test/ui/issues/issue-28388-3.rs b/src/test/ui/issues/issue-28388-3.rs index 12e3457ef9e34..7593bb35add09 100644 --- a/src/test/ui/issues/issue-28388-3.rs +++ b/src/test/ui/issues/issue-28388-3.rs @@ -10,7 +10,7 @@ // Prefix in imports with empty braces should be resolved and checked privacy, stability, etc. -// aux-build:lint_stability.rs +// aux-build:lint-stability.rs extern crate lint_stability; diff --git a/src/test/ui/issues/issue-30123.rs b/src/test/ui/issues/issue-30123.rs index 653097ad69f72..39278cffa122a 100644 --- a/src/test/ui/issues/issue-30123.rs +++ b/src/test/ui/issues/issue-30123.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_30123_aux.rs +// aux-build:issue-30123-aux.rs extern crate issue_30123_aux; use issue_30123_aux::*; diff --git a/src/test/ui/issues/issue32829.rs b/src/test/ui/issues/issue-32829-2.rs similarity index 100% rename from src/test/ui/issues/issue32829.rs rename to src/test/ui/issues/issue-32829-2.rs diff --git a/src/test/ui/issues/issue32829.stderr b/src/test/ui/issues/issue-32829-2.stderr similarity index 85% rename from src/test/ui/issues/issue32829.stderr rename to src/test/ui/issues/issue-32829-2.stderr index dad0880dbdfd7..6d6b94ca4bc6d 100644 --- a/src/test/ui/issues/issue32829.stderr +++ b/src/test/ui/issues/issue-32829-2.stderr @@ -1,5 +1,5 @@ error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue32829.rs:17:9 + --> $DIR/issue-32829-2.rs:17:9 | LL | 5; | ^ @@ -7,13 +7,13 @@ LL | 5; = help: add #![feature(const_let)] to the crate attributes to enable error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue32829.rs:25:9 + --> $DIR/issue-32829-2.rs:25:9 | LL | invalid(); | ^^^^^^^^^ error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue32829.rs:25:9 + --> $DIR/issue-32829-2.rs:25:9 | LL | invalid(); | ^^^^^^^^^ @@ -21,7 +21,7 @@ LL | invalid(); = help: add #![feature(const_let)] to the crate attributes to enable error[E0658]: statements in constants are unstable (see issue #48821) - --> $DIR/issue32829.rs:34:9 + --> $DIR/issue-32829-2.rs:34:9 | LL | valid(); | ^^^^^^^ @@ -29,7 +29,7 @@ LL | valid(); = help: add #![feature(const_let)] to the crate attributes to enable error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:42:9 + --> $DIR/issue-32829-2.rs:42:9 | LL | 5; | ^ @@ -37,13 +37,13 @@ LL | 5; = help: add #![feature(const_let)] to the crate attributes to enable error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue32829.rs:50:9 + --> $DIR/issue-32829-2.rs:50:9 | LL | invalid(); | ^^^^^^^^^ error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:50:9 + --> $DIR/issue-32829-2.rs:50:9 | LL | invalid(); | ^^^^^^^^^ @@ -51,7 +51,7 @@ LL | invalid(); = help: add #![feature(const_let)] to the crate attributes to enable error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:59:9 + --> $DIR/issue-32829-2.rs:59:9 | LL | valid(); | ^^^^^^^ @@ -59,7 +59,7 @@ LL | valid(); = help: add #![feature(const_let)] to the crate attributes to enable error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:67:9 + --> $DIR/issue-32829-2.rs:67:9 | LL | 5; | ^ @@ -67,13 +67,13 @@ LL | 5; = help: add #![feature(const_let)] to the crate attributes to enable error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants - --> $DIR/issue32829.rs:75:9 + --> $DIR/issue-32829-2.rs:75:9 | LL | invalid(); | ^^^^^^^^^ error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:75:9 + --> $DIR/issue-32829-2.rs:75:9 | LL | invalid(); | ^^^^^^^^^ @@ -81,7 +81,7 @@ LL | invalid(); = help: add #![feature(const_let)] to the crate attributes to enable error[E0658]: statements in statics are unstable (see issue #48821) - --> $DIR/issue32829.rs:84:9 + --> $DIR/issue-32829-2.rs:84:9 | LL | valid(); | ^^^^^^^ diff --git a/src/test/ui/issues/issue-38875/auxiliary/issue_38875_b.rs b/src/test/ui/issues/issue-38875/auxiliary/issue-38875-b.rs similarity index 100% rename from src/test/ui/issues/issue-38875/auxiliary/issue_38875_b.rs rename to src/test/ui/issues/issue-38875/auxiliary/issue-38875-b.rs diff --git a/src/test/ui/issues/issue-38875/issue_38875.rs b/src/test/ui/issues/issue-38875/issue-38875.rs similarity index 94% rename from src/test/ui/issues/issue-38875/issue_38875.rs rename to src/test/ui/issues/issue-38875/issue-38875.rs index d9debe34c4d5a..74db92cb82802 100644 --- a/src/test/ui/issues/issue-38875/issue_38875.rs +++ b/src/test/ui/issues/issue-38875/issue-38875.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_38875_b.rs +// aux-build:issue-38875-b.rs // compile-pass extern crate issue_38875_b; diff --git a/src/test/ui/issue-40827.rs b/src/test/ui/issues/issue-40827.rs similarity index 100% rename from src/test/ui/issue-40827.rs rename to src/test/ui/issues/issue-40827.rs diff --git a/src/test/ui/issue-40827.stderr b/src/test/ui/issues/issue-40827.stderr similarity index 100% rename from src/test/ui/issue-40827.stderr rename to src/test/ui/issues/issue-40827.stderr diff --git a/src/test/ui/issues/issue-41549.rs b/src/test/ui/issues/issue-41549.rs index 67be194c8ed2a..de52fcfe32722 100644 --- a/src/test/ui/issues/issue-41549.rs +++ b/src/test/ui/issues/issue-41549.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_41549.rs +// aux-build:issue-41549.rs extern crate issue_41549; diff --git a/src/test/ui/issues/issue-41652/auxiliary/issue_41652_b.rs b/src/test/ui/issues/issue-41652/auxiliary/issue-41652-b.rs similarity index 100% rename from src/test/ui/issues/issue-41652/auxiliary/issue_41652_b.rs rename to src/test/ui/issues/issue-41652/auxiliary/issue-41652-b.rs diff --git a/src/test/ui/issues/issue-41652/issue_41652.rs b/src/test/ui/issues/issue-41652/issue-41652.rs similarity index 95% rename from src/test/ui/issues/issue-41652/issue_41652.rs rename to src/test/ui/issues/issue-41652/issue-41652.rs index a4e92820e21e5..4b42c0475eb67 100644 --- a/src/test/ui/issues/issue-41652/issue_41652.rs +++ b/src/test/ui/issues/issue-41652/issue-41652.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_41652_b.rs +// aux-build:issue-41652-b.rs extern crate issue_41652_b; diff --git a/src/test/ui/issues/issue-41652/issue_41652.stderr b/src/test/ui/issues/issue-41652/issue-41652.stderr similarity index 91% rename from src/test/ui/issues/issue-41652/issue_41652.stderr rename to src/test/ui/issues/issue-41652/issue-41652.stderr index 3f76b25692cf1..ed5eb360298b7 100644 --- a/src/test/ui/issues/issue-41652/issue_41652.stderr +++ b/src/test/ui/issues/issue-41652/issue-41652.stderr @@ -1,5 +1,5 @@ error[E0689]: can't call method `f` on ambiguous numeric type `{integer}` - --> $DIR/issue_41652.rs:19:11 + --> $DIR/issue-41652.rs:19:11 | LL | 3.f() | ^ diff --git a/src/test/ui/issues/issue-43189.rs b/src/test/ui/issues/issue-43189.rs index 154bee5d1d4f3..7018198aff55b 100644 --- a/src/test/ui/issues/issue-43189.rs +++ b/src/test/ui/issues/issue-43189.rs @@ -12,8 +12,8 @@ // paths rooted from `std` to be misrendered in the diagnostic output. // ignore-windows -// aux-build:xcrate_issue_43189_a.rs -// aux-build:xcrate_issue_43189_b.rs +// aux-build:xcrate-issue-43189-a.rs +// aux-build:xcrate-issue-43189-b.rs extern crate xcrate_issue_43189_b; fn main() { diff --git a/src/test/ui/issues/issue-45829/auxiliary/issue_45829_a.rs b/src/test/ui/issues/issue-45829/auxiliary/issue-45829-a.rs similarity index 100% rename from src/test/ui/issues/issue-45829/auxiliary/issue_45829_a.rs rename to src/test/ui/issues/issue-45829/auxiliary/issue-45829-a.rs diff --git a/src/test/ui/issues/issue-45829/auxiliary/issue_45829_b.rs b/src/test/ui/issues/issue-45829/auxiliary/issue-45829-b.rs similarity index 100% rename from src/test/ui/issues/issue-45829/auxiliary/issue_45829_b.rs rename to src/test/ui/issues/issue-45829/auxiliary/issue-45829-b.rs diff --git a/src/test/ui/issues/issue-45829/rename-extern-vs-use.rs b/src/test/ui/issues/issue-45829/rename-extern-vs-use.rs index 5230cadf60430..6befee331d5ae 100644 --- a/src/test/ui/issues/issue-45829/rename-extern-vs-use.rs +++ b/src/test/ui/issues/issue-45829/rename-extern-vs-use.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_45829_b.rs +// aux-build:issue-45829-b.rs mod foo { pub mod bar {} diff --git a/src/test/ui/issues/issue-45829/rename-extern-with-tab.rs b/src/test/ui/issues/issue-45829/rename-extern-with-tab.rs index 7066ed65c78c3..61c7e915fe88c 100644 --- a/src/test/ui/issues/issue-45829/rename-extern-with-tab.rs +++ b/src/test/ui/issues/issue-45829/rename-extern-with-tab.rs @@ -8,8 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_45829_a.rs -// aux-build:issue_45829_b.rs +// aux-build:issue-45829-a.rs +// aux-build:issue-45829-b.rs extern crate issue_45829_a; extern crate issue_45829_b as issue_45829_a; diff --git a/src/test/ui/issues/issue-45829/rename-extern.rs b/src/test/ui/issues/issue-45829/rename-extern.rs index 7c3d972400574..41e3e8bbe1452 100644 --- a/src/test/ui/issues/issue-45829/rename-extern.rs +++ b/src/test/ui/issues/issue-45829/rename-extern.rs @@ -8,8 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_45829_a.rs -// aux-build:issue_45829_b.rs +// aux-build:issue-45829-a.rs +// aux-build:issue-45829-b.rs extern crate issue_45829_a; extern crate issue_45829_b as issue_45829_a; diff --git a/src/test/ui/issues/issue-45829/rename-use-vs-extern.rs b/src/test/ui/issues/issue-45829/rename-use-vs-extern.rs index 1cc261ed922eb..9a2ec7a527326 100644 --- a/src/test/ui/issues/issue-45829/rename-use-vs-extern.rs +++ b/src/test/ui/issues/issue-45829/rename-use-vs-extern.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// aux-build:issue_45829_b.rs +// aux-build:issue-45829-b.rs extern crate issue_45829_b; use std as issue_45829_b; diff --git a/src/test/ui/issues/issue-46112.rs b/src/test/ui/issues/issue-46112.rs index 698005b5d3068..202c67e584c5d 100644 --- a/src/test/ui/issues/issue-46112.rs +++ b/src/test/ui/issues/issue-46112.rs @@ -12,7 +12,7 @@ // paths rooted from `std` to be misrendered in the diagnostic output. // ignore-windows -// aux-build:xcrate_issue_46112_rexport_core.rs +// aux-build:xcrate-issue-46112-rexport-core.rs extern crate xcrate_issue_46112_rexport_core; fn test(r: Result, &'static str>) { } diff --git a/src/test/ui/issue-49556.rs b/src/test/ui/issues/issue-49556.rs similarity index 100% rename from src/test/ui/issue-49556.rs rename to src/test/ui/issues/issue-49556.rs diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option_deref.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/option-deref.rs similarity index 100% rename from src/test/ui/issues/issue-50264-inner-deref-trait/option_deref.rs rename to src/test/ui/issues/issue-50264-inner-deref-trait/option-deref.rs diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/option_deref.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/option-deref.stderr similarity index 92% rename from src/test/ui/issues/issue-50264-inner-deref-trait/option_deref.stderr rename to src/test/ui/issues/issue-50264-inner-deref-trait/option-deref.stderr index a56cd6e8d2f53..3e255ca6539b9 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/option_deref.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/option-deref.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `deref` found for type `std::option::Option<{integer}>` in the current scope - --> $DIR/option_deref.rs:14:29 + --> $DIR/option-deref.rs:14:29 | LL | let _result = &Some(42).deref(); | ^^^^^ diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_err.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.rs similarity index 100% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_err.rs rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.rs diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_err.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr similarity index 92% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_err.stderr rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr index bf75687b21f74..57b5d07afb4ab 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_err.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-err.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `deref_err` found for type `std::result::Result<_, {integer}>` in the current scope - --> $DIR/result_deref_err.rs:14:28 + --> $DIR/result-deref-err.rs:14:28 | LL | let _result = &Err(41).deref_err(); | ^^^^^^^^^ diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_ok.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-ok.rs similarity index 100% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_ok.rs rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-ok.rs diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_ok.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-ok.stderr similarity index 92% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_ok.stderr rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-ok.stderr index a77333a756816..ee0c439715bd9 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref_ok.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref-ok.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `deref_ok` found for type `std::result::Result<{integer}, _>` in the current scope - --> $DIR/result_deref_ok.rs:14:27 + --> $DIR/result-deref-ok.rs:14:27 | LL | let _result = &Ok(42).deref_ok(); | ^^^^^^^^ diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref.rs b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref.rs similarity index 100% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref.rs rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref.rs diff --git a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref.stderr b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref.stderr similarity index 92% rename from src/test/ui/issues/issue-50264-inner-deref-trait/result_deref.stderr rename to src/test/ui/issues/issue-50264-inner-deref-trait/result-deref.stderr index d3d7c1993ca5a..46fee660f6640 100644 --- a/src/test/ui/issues/issue-50264-inner-deref-trait/result_deref.stderr +++ b/src/test/ui/issues/issue-50264-inner-deref-trait/result-deref.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `deref` found for type `std::result::Result<{integer}, _>` in the current scope - --> $DIR/result_deref.rs:14:27 + --> $DIR/result-deref.rs:14:27 | LL | let _result = &Ok(42).deref(); | ^^^^^ diff --git a/src/test/ui/issue-51602.rs b/src/test/ui/issues/issue-51602.rs similarity index 100% rename from src/test/ui/issue-51602.rs rename to src/test/ui/issues/issue-51602.rs diff --git a/src/test/ui/issue-51602.stderr b/src/test/ui/issues/issue-51602.stderr similarity index 100% rename from src/test/ui/issue-51602.stderr rename to src/test/ui/issues/issue-51602.stderr diff --git a/src/test/ui/issue-52717.rs b/src/test/ui/issues/issue-52717.rs similarity index 100% rename from src/test/ui/issue-52717.rs rename to src/test/ui/issues/issue-52717.rs diff --git a/src/test/ui/issue-52717.stderr b/src/test/ui/issues/issue-52717.stderr similarity index 100% rename from src/test/ui/issue-52717.stderr rename to src/test/ui/issues/issue-52717.stderr diff --git a/src/test/ui/issue-52992.rs b/src/test/ui/issues/issue-52992.rs similarity index 100% rename from src/test/ui/issue-52992.rs rename to src/test/ui/issues/issue-52992.rs diff --git a/src/test/ui/issue-53251.rs b/src/test/ui/issues/issue-53251.rs similarity index 100% rename from src/test/ui/issue-53251.rs rename to src/test/ui/issues/issue-53251.rs diff --git a/src/test/ui/issue-53251.stderr b/src/test/ui/issues/issue-53251.stderr similarity index 100% rename from src/test/ui/issue-53251.stderr rename to src/test/ui/issues/issue-53251.stderr diff --git a/src/test/ui/issue-53300.rs b/src/test/ui/issues/issue-53300.rs similarity index 100% rename from src/test/ui/issue-53300.rs rename to src/test/ui/issues/issue-53300.rs diff --git a/src/test/ui/issue-53300.stderr b/src/test/ui/issues/issue-53300.stderr similarity index 100% rename from src/test/ui/issue-53300.stderr rename to src/test/ui/issues/issue-53300.stderr diff --git a/src/test/ui/issue-53419.rs b/src/test/ui/issues/issue-53419.rs similarity index 100% rename from src/test/ui/issue-53419.rs rename to src/test/ui/issues/issue-53419.rs diff --git a/src/test/ui/issue-53565.rs b/src/test/ui/issues/issue-53565.rs similarity index 100% rename from src/test/ui/issue-53565.rs rename to src/test/ui/issues/issue-53565.rs diff --git a/src/test/ui/issue-53565.stderr b/src/test/ui/issues/issue-53565.stderr similarity index 100% rename from src/test/ui/issue-53565.stderr rename to src/test/ui/issues/issue-53565.stderr diff --git a/src/test/ui/issue-53568.rs b/src/test/ui/issues/issue-53568.rs similarity index 100% rename from src/test/ui/issue-53568.rs rename to src/test/ui/issues/issue-53568.rs diff --git a/src/test/ui/issue-53692.rs b/src/test/ui/issues/issue-53692.rs similarity index 100% rename from src/test/ui/issue-53692.rs rename to src/test/ui/issues/issue-53692.rs diff --git a/src/test/ui/issue-53692.stderr b/src/test/ui/issues/issue-53692.stderr similarity index 100% rename from src/test/ui/issue-53692.stderr rename to src/test/ui/issues/issue-53692.stderr diff --git a/src/test/ui/issue-53840.rs b/src/test/ui/issues/issue-53840.rs similarity index 100% rename from src/test/ui/issue-53840.rs rename to src/test/ui/issues/issue-53840.rs diff --git a/src/test/ui/issue-53840.stderr b/src/test/ui/issues/issue-53840.stderr similarity index 100% rename from src/test/ui/issue-53840.stderr rename to src/test/ui/issues/issue-53840.stderr diff --git a/src/test/ui/issue-54302-cases.rs b/src/test/ui/issues/issue-54302-cases.rs similarity index 100% rename from src/test/ui/issue-54302-cases.rs rename to src/test/ui/issues/issue-54302-cases.rs diff --git a/src/test/ui/issue-54302-cases.stderr b/src/test/ui/issues/issue-54302-cases.stderr similarity index 100% rename from src/test/ui/issue-54302-cases.stderr rename to src/test/ui/issues/issue-54302-cases.stderr diff --git a/src/test/ui/issue-54302.rs b/src/test/ui/issues/issue-54302.rs similarity index 100% rename from src/test/ui/issue-54302.rs rename to src/test/ui/issues/issue-54302.rs diff --git a/src/test/ui/issue-54302.stderr b/src/test/ui/issues/issue-54302.stderr similarity index 100% rename from src/test/ui/issue-54302.stderr rename to src/test/ui/issues/issue-54302.stderr diff --git a/src/test/ui/issues/issue-5844.rs b/src/test/ui/issues/issue-5844.rs index 02e5b9b092197..329bfd1dde0f9 100644 --- a/src/test/ui/issues/issue-5844.rs +++ b/src/test/ui/issues/issue-5844.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -//aux-build:issue_5844_aux.rs +//aux-build:issue-5844-aux.rs extern crate issue_5844_aux; From 22b571d62a6750d1d67509a8e71f524c69d37b9d Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 6 Nov 2018 17:07:17 +0100 Subject: [PATCH 10/17] Add explcit `--error-format` options to tests of print-fuel to sidestep compiletests presumption of JSON. As a driveby, rename the stdout files to stderr, which should have been part of the earlier commit. --- src/test/run-pass/optimization-fuel-0.rs | 3 ++- .../{optimization-fuel-0.stdout => optimization-fuel-0.stderr} | 0 src/test/run-pass/optimization-fuel-1.rs | 3 ++- .../{optimization-fuel-1.stdout => optimization-fuel-1.stderr} | 0 src/test/ui/print-fuel/print-fuel.rs | 3 ++- .../ui/print-fuel/{print-fuel.stdout => print-fuel.stderr} | 0 6 files changed, 6 insertions(+), 3 deletions(-) rename src/test/run-pass/{optimization-fuel-0.stdout => optimization-fuel-0.stderr} (100%) rename src/test/run-pass/{optimization-fuel-1.stdout => optimization-fuel-1.stderr} (100%) rename src/test/ui/print-fuel/{print-fuel.stdout => print-fuel.stderr} (100%) diff --git a/src/test/run-pass/optimization-fuel-0.rs b/src/test/run-pass/optimization-fuel-0.rs index 3832c040108f8..a12dad4489df9 100644 --- a/src/test/run-pass/optimization-fuel-0.rs +++ b/src/test/run-pass/optimization-fuel-0.rs @@ -12,7 +12,8 @@ use std::mem::size_of; -// compile-flags: -Z fuel=foo=0 +// (#55495: The --error-format is to sidestep an issue in our test harness) +// compile-flags: --error-format human -Z fuel=foo=0 struct S1(u8, u16, u8); struct S2(u8, u16, u8); diff --git a/src/test/run-pass/optimization-fuel-0.stdout b/src/test/run-pass/optimization-fuel-0.stderr similarity index 100% rename from src/test/run-pass/optimization-fuel-0.stdout rename to src/test/run-pass/optimization-fuel-0.stderr diff --git a/src/test/run-pass/optimization-fuel-1.rs b/src/test/run-pass/optimization-fuel-1.rs index e3529ebfb0d81..1e76aaa48b761 100644 --- a/src/test/run-pass/optimization-fuel-1.rs +++ b/src/test/run-pass/optimization-fuel-1.rs @@ -12,7 +12,8 @@ use std::mem::size_of; -// compile-flags: -Z fuel=foo=1 +// (#55495: The --error-format is to sidestep an issue in our test harness) +// compile-flags: --error-format human -Z fuel=foo=1 struct S1(u8, u16, u8); struct S2(u8, u16, u8); diff --git a/src/test/run-pass/optimization-fuel-1.stdout b/src/test/run-pass/optimization-fuel-1.stderr similarity index 100% rename from src/test/run-pass/optimization-fuel-1.stdout rename to src/test/run-pass/optimization-fuel-1.stderr diff --git a/src/test/ui/print-fuel/print-fuel.rs b/src/test/ui/print-fuel/print-fuel.rs index 96b025128ee9a..31123410481c3 100644 --- a/src/test/ui/print-fuel/print-fuel.rs +++ b/src/test/ui/print-fuel/print-fuel.rs @@ -11,7 +11,8 @@ #![crate_name="foo"] #![allow(dead_code)] -// compile-flags: -Z print-fuel=foo +// (#55495: The --error-format is to sidestep an issue in our test harness) +// compile-flags: --error-format human -Z print-fuel=foo // compile-pass struct S1(u8, u16, u8); diff --git a/src/test/ui/print-fuel/print-fuel.stdout b/src/test/ui/print-fuel/print-fuel.stderr similarity index 100% rename from src/test/ui/print-fuel/print-fuel.stdout rename to src/test/ui/print-fuel/print-fuel.stderr From 66702fcd0ae34100aaf74a9bdf8da77b6e273616 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 2 Nov 2018 13:22:48 +0100 Subject: [PATCH 11/17] Run name-anon-globals after LTO passes as well If we're going to emit bitcode (through ThinLTOBuffer), then we need to ensure that anon globals are named. This was already done after optimization passes, but also has to happen after LTO passes, as we always emit the final result in a ThinLTO-compatible manner. Fixes #51947. --- src/librustc_codegen_llvm/back/lto.rs | 7 +++++++ src/librustc_codegen_llvm/back/write.rs | 8 ++++++-- src/test/ui/issue-51947.rs | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/issue-51947.rs diff --git a/src/librustc_codegen_llvm/back/lto.rs b/src/librustc_codegen_llvm/back/lto.rs index 8f940e0d22a83..3d96fef7c0d6f 100644 --- a/src/librustc_codegen_llvm/back/lto.rs +++ b/src/librustc_codegen_llvm/back/lto.rs @@ -605,6 +605,13 @@ fn run_pass_manager(cgcx: &CodegenContext, } }); + // We always generate bitcode through ThinLTOBuffers, + // which do not support anonymous globals + if config.bitcode_needed() { + let pass = llvm::LLVMRustFindAndCreatePass("name-anon-globals\0".as_ptr() as *const _); + llvm::LLVMRustAddPass(pm, pass.unwrap()); + } + if config.verify_llvm_ir { let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); llvm::LLVMRustAddPass(pm, pass.unwrap()); diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index d04e80195f054..184be4b9eab39 100644 --- a/src/librustc_codegen_llvm/back/write.rs +++ b/src/librustc_codegen_llvm/back/write.rs @@ -337,6 +337,11 @@ impl ModuleConfig { self.merge_functions = sess.opts.optimize == config::OptLevel::Default || sess.opts.optimize == config::OptLevel::Aggressive; } + + pub fn bitcode_needed(&self) -> bool { + self.emit_bc || self.obj_is_bitcode + || self.emit_bc_compressed || self.embed_bitcode + } } /// Assembler name and command used by codegen when no_integrated_as is enabled @@ -564,8 +569,7 @@ unsafe fn optimize(cgcx: &CodegenContext, // Some options cause LLVM bitcode to be emitted, which uses ThinLTOBuffers, so we need // to make sure we run LLVM's NameAnonGlobals pass when emitting bitcode; otherwise // we'll get errors in LLVM. - let using_thin_buffers = config.emit_bc || config.obj_is_bitcode - || config.emit_bc_compressed || config.embed_bitcode; + let using_thin_buffers = config.bitcode_needed(); let mut have_name_anon_globals_pass = false; if !config.no_prepopulate_passes { llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod); diff --git a/src/test/ui/issue-51947.rs b/src/test/ui/issue-51947.rs new file mode 100644 index 0000000000000..7b79807e4d7ff --- /dev/null +++ b/src/test/ui/issue-51947.rs @@ -0,0 +1,17 @@ +// compile-pass + +#![crate_type = "lib"] +#![feature(linkage)] + +// MergeFunctions will merge these via an anonymous internal +// backing function, which must be named if ThinLTO buffers are used + +#[linkage = "weak"] +pub fn fn1(a: u32, b: u32, c: u32) -> u32 { + a + b + c +} + +#[linkage = "weak"] +pub fn fn2(a: u32, b: u32, c: u32) -> u32 { + a + b + c +} From 2869fda12c0bd8386371e6e1cac098cf05ed2a5b Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 1 Nov 2018 14:22:55 -0600 Subject: [PATCH 12/17] Update lldb This updates lldb to pick up some bug fixes, and makes one minor test suite fix to account for this. --- src/test/debuginfo/vec-slices.rs | 2 +- src/tools/lldb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/debuginfo/vec-slices.rs b/src/test/debuginfo/vec-slices.rs index 39267edaac045..dba3972a3df99 100644 --- a/src/test/debuginfo/vec-slices.rs +++ b/src/test/debuginfo/vec-slices.rs @@ -99,7 +99,7 @@ // lldb-command:print padded_tuple // lldbg-check:[...]$4 = &[(6, 7), (8, 9)] -// lldbr-check:(&[(i32, i16)]) padded_tuple = { data_ptr = *0x555555555030 length = 2 } +// lldbr-check:(&[(i32, i16)]) padded_tuple = { data_ptr = *[...] length = 2 } // lldb-command:print padded_struct // lldbg-check:[...]$5 = &[AStruct { x: 10, y: 11, z: 12 }, AStruct { x: 13, y: 14, z: 15 }] diff --git a/src/tools/lldb b/src/tools/lldb index 29bf485828122..fdea743be550e 160000 --- a/src/tools/lldb +++ b/src/tools/lldb @@ -1 +1 @@ -Subproject commit 29bf48582812212450f4caf7da1af3f18c52bfef +Subproject commit fdea743be550ed8d7b61b2c908944cdd1290a6ad From 46fcf1c6ad32fbc517bb99b30c692a5ca9048940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Tue, 6 Nov 2018 11:24:48 -0800 Subject: [PATCH 13/17] Use trait impl method span when type param mismatch is due to impl Trait --- src/librustc_typeck/check/compare_method.rs | 4 +++- .../issues/type-arg-mismatch-due-to-impl-trait.rs | 15 +++++++++++++++ .../type-arg-mismatch-due-to-impl-trait.stderr | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs create mode 100644 src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr diff --git a/src/librustc_typeck/check/compare_method.rs b/src/librustc_typeck/check/compare_method.rs index 54c6c8f7b9322..45c5457c9e140 100644 --- a/src/librustc_typeck/check/compare_method.rs +++ b/src/librustc_typeck/check/compare_method.rs @@ -595,7 +595,9 @@ fn compare_number_of_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, if num_impl_m_type_params != num_trait_m_type_params { let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap(); let impl_m_item = tcx.hir.expect_impl_item(impl_m_node_id); - let span = if impl_m_item.generics.params.is_empty() { + let span = if impl_m_item.generics.params.is_empty() + || impl_m_item.generics.span.is_dummy() // impl Trait in argument position (#55374) + { impl_m_span } else { impl_m_item.generics.span diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs new file mode 100644 index 0000000000000..4a71932d1df18 --- /dev/null +++ b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs @@ -0,0 +1,15 @@ +trait Foo { + type T; + fn foo(&self, t: Self::T); +//~^ NOTE expected 0 type parameters +} + +impl Foo for u32 { + type T = (); + + fn foo(&self, t: impl Clone) {} +//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters +//~| NOTE found 1 type parameter +} + +fn main() {} diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr new file mode 100644 index 0000000000000..af7fdde9a8ed1 --- /dev/null +++ b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr @@ -0,0 +1,12 @@ +error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters + --> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:5 + | +LL | fn foo(&self, t: Self::T); + | -------------------------- expected 0 type parameters +... +LL | fn foo(&self, t: impl Clone) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found 1 type parameter + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0049`. From eca11b99a7d25e4e6573472a16537c1aacb5d5e1 Mon Sep 17 00:00:00 2001 From: teresy Date: Tue, 6 Nov 2018 15:05:44 -0500 Subject: [PATCH 14/17] refactor: use shorthand fields --- src/liballoc/string.rs | 2 +- src/libpanic_unwind/dwarf/mod.rs | 2 +- src/libpanic_unwind/seh64_gnu.rs | 2 +- src/librustc/infer/resolve.rs | 4 ++-- src/librustc/infer/type_variable.rs | 2 +- src/librustc/infer/unify_key.rs | 2 +- src/librustc/middle/stability.rs | 2 +- src/librustc/mir/mod.rs | 2 +- src/librustc/mir/tcx.rs | 2 +- src/librustc/traits/project.rs | 2 +- src/librustc/traits/select.rs | 2 +- src/librustc/ty/_match.rs | 2 +- src/librustc/ty/fold.rs | 2 +- src/librustc_codegen_llvm/llvm/mod.rs | 2 +- src/librustc_codegen_llvm/mir/analyze.rs | 2 +- src/librustc_codegen_utils/symbol_names_test.rs | 2 +- src/librustc_data_structures/flock.rs | 2 +- src/librustc_data_structures/svh.rs | 2 +- src/librustc_lint/types.rs | 2 +- src/librustc_metadata/encoder.rs | 2 +- src/librustc_mir/build/scope.rs | 4 ++-- src/librustc_mir/dataflow/impls/borrowed_locals.rs | 2 +- src/librustc_mir/dataflow/impls/storage_liveness.rs | 2 +- src/librustc_mir/hair/pattern/check_match.rs | 2 +- src/librustc_mir/hair/pattern/mod.rs | 6 +++--- src/librustc_mir/transform/elaborate_drops.rs | 2 +- src/librustc_mir/transform/simplify.rs | 2 +- src/librustc_mir/transform/simplify_branches.rs | 2 +- src/librustc_passes/ast_validation.rs | 2 +- src/librustc_resolve/lib.rs | 4 ++-- src/librustc_save_analysis/json_dumper.rs | 2 +- src/librustc_typeck/check/wfcheck.rs | 2 +- src/librustc_typeck/coherence/orphan.rs | 2 +- src/librustc_typeck/coherence/unsafety.rs | 2 +- src/librustc_typeck/collect.rs | 2 +- src/librustc_typeck/impl_wf_check.rs | 2 +- src/librustdoc/clean/mod.rs | 2 +- src/libstd/collections/hash/map.rs | 2 +- src/libstd/fs.rs | 2 +- src/libstd/io/util.rs | 2 +- src/libstd/sync/mpsc/mod.rs | 2 +- src/libstd/sys/cloudabi/time.rs | 4 ++-- src/libstd/sys/redox/fd.rs | 2 +- src/libstd/sys/redox/fs.rs | 2 +- src/libstd/sys/redox/syscall/error.rs | 2 +- src/libstd/sys/redox/thread.rs | 2 +- src/libstd/sys/redox/time.rs | 2 +- src/libstd/sys/unix/fd.rs | 2 +- src/libstd/sys/unix/fs.rs | 8 ++++---- src/libstd/sys/unix/time.rs | 4 ++-- src/libstd/sys/windows/process.rs | 2 +- src/libstd/sys/windows/time.rs | 2 +- src/libstd/sys_common/poison.rs | 2 +- src/libstd/sys_common/wtf8.rs | 4 ++-- src/libsyntax/ext/source_util.rs | 2 +- src/libsyntax/fold.rs | 2 +- src/libsyntax/parse/parser.rs | 2 +- 57 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/liballoc/string.rs b/src/liballoc/string.rs index ab3f8fc270720..0dffbd9a4c352 100644 --- a/src/liballoc/string.rs +++ b/src/liballoc/string.rs @@ -502,7 +502,7 @@ impl String { #[stable(feature = "rust1", since = "1.0.0")] pub fn from_utf8(vec: Vec) -> Result { match str::from_utf8(&vec) { - Ok(..) => Ok(String { vec: vec }), + Ok(..) => Ok(String { vec }), Err(e) => { Err(FromUtf8Error { bytes: vec, diff --git a/src/libpanic_unwind/dwarf/mod.rs b/src/libpanic_unwind/dwarf/mod.rs index 7e0c32fe03d8a..3ff250ff6592b 100644 --- a/src/libpanic_unwind/dwarf/mod.rs +++ b/src/libpanic_unwind/dwarf/mod.rs @@ -29,7 +29,7 @@ struct Unaligned(T); impl DwarfReader { pub fn new(ptr: *const u8) -> DwarfReader { - DwarfReader { ptr: ptr } + DwarfReader { ptr } } // DWARF streams are packed, so e.g. a u32 would not necessarily be aligned diff --git a/src/libpanic_unwind/seh64_gnu.rs b/src/libpanic_unwind/seh64_gnu.rs index c2074db00385b..60e9829ef9eaf 100644 --- a/src/libpanic_unwind/seh64_gnu.rs +++ b/src/libpanic_unwind/seh64_gnu.rs @@ -41,7 +41,7 @@ struct PanicData { } pub unsafe fn panic(data: Box) -> u32 { - let panic_ctx = Box::new(PanicData { data: data }); + let panic_ctx = Box::new(PanicData { data }); let params = [Box::into_raw(panic_ctx) as c::ULONG_PTR]; c::RaiseException(RUST_PANIC, c::EXCEPTION_NONCONTINUABLE, diff --git a/src/librustc/infer/resolve.rs b/src/librustc/infer/resolve.rs index 0ef9761857264..a0c310ac2761e 100644 --- a/src/librustc/infer/resolve.rs +++ b/src/librustc/infer/resolve.rs @@ -26,7 +26,7 @@ pub struct OpportunisticTypeResolver<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { impl<'a, 'gcx, 'tcx> OpportunisticTypeResolver<'a, 'gcx, 'tcx> { pub fn new(infcx: &'a InferCtxt<'a, 'gcx, 'tcx>) -> Self { - OpportunisticTypeResolver { infcx: infcx } + OpportunisticTypeResolver { infcx } } } @@ -54,7 +54,7 @@ pub struct OpportunisticTypeAndRegionResolver<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { impl<'a, 'gcx, 'tcx> OpportunisticTypeAndRegionResolver<'a, 'gcx, 'tcx> { pub fn new(infcx: &'a InferCtxt<'a, 'gcx, 'tcx>) -> Self { - OpportunisticTypeAndRegionResolver { infcx: infcx } + OpportunisticTypeAndRegionResolver { infcx } } } diff --git a/src/librustc/infer/type_variable.rs b/src/librustc/infer/type_variable.rs index 970b6e096ffe4..39bf59a7a4ec5 100644 --- a/src/librustc/infer/type_variable.rs +++ b/src/librustc/infer/type_variable.rs @@ -169,7 +169,7 @@ impl<'tcx> TypeVariableTable<'tcx> { // Hack: we only need this so that `types_escaping_snapshot` // can see what has been unified; see the Delegate impl for // more details. - self.values.record(Instantiate { vid: vid }); + self.values.record(Instantiate { vid }); } /// Creates a new type variable. diff --git a/src/librustc/infer/unify_key.rs b/src/librustc/infer/unify_key.rs index cdc92877a5ae8..f8001e085c469 100644 --- a/src/librustc/infer/unify_key.rs +++ b/src/librustc/infer/unify_key.rs @@ -43,7 +43,7 @@ impl UnifyValue for RegionVidKey { value2.min_vid }; - Ok(RegionVidKey { min_vid: min_vid }) + Ok(RegionVidKey { min_vid }) } } diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 9dd13dd2272b0..30e1d49c445fc 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -469,7 +469,7 @@ impl<'a, 'tcx> Index<'tcx> { /// Cross-references the feature names of unstable APIs with enabled /// features and possibly prints errors. pub fn check_unstable_api_usage<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { - let mut checker = Checker { tcx: tcx }; + let mut checker = Checker { tcx }; tcx.hir.krate().visit_all_item_likes(&mut checker.as_deep_visitor()); } diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 9a0623ca53938..a7a3c0afb0894 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -2871,7 +2871,7 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> { use mir::TerminatorKind::*; let kind = match self.kind { - Goto { target } => Goto { target: target }, + Goto { target } => Goto { target }, SwitchInt { ref discr, switch_ty, diff --git a/src/librustc/mir/tcx.rs b/src/librustc/mir/tcx.rs index fc7b4862b0ae5..0fa37609f34d9 100644 --- a/src/librustc/mir/tcx.rs +++ b/src/librustc/mir/tcx.rs @@ -32,7 +32,7 @@ pub enum PlaceTy<'tcx> { impl<'a, 'gcx, 'tcx> PlaceTy<'tcx> { pub fn from_ty(ty: Ty<'tcx>) -> PlaceTy<'tcx> { - PlaceTy::Ty { ty: ty } + PlaceTy::Ty { ty } } pub fn to_ty(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Ty<'tcx> { diff --git a/src/librustc/traits/project.rs b/src/librustc/traits/project.rs index 7c1f87fbf3fef..6d2b545f1b0aa 100644 --- a/src/librustc/traits/project.rs +++ b/src/librustc/traits/project.rs @@ -269,7 +269,7 @@ fn project_and_unify_type<'cx, 'gcx, 'tcx>( }, Err(err) => { debug!("project_and_unify_type: equating types encountered error {:?}", err); - Err(MismatchedProjectionTypes { err: err }) + Err(MismatchedProjectionTypes { err }) } } } diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 156a27a7d0abd..a4a5efad1f580 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -3434,7 +3434,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { _ => bug!(), }; - Ok(VtableBuiltinData { nested: nested }) + Ok(VtableBuiltinData { nested }) } /////////////////////////////////////////////////////////////////////////// diff --git a/src/librustc/ty/_match.rs b/src/librustc/ty/_match.rs index c9b0e97c9b05c..d20b6d361991b 100644 --- a/src/librustc/ty/_match.rs +++ b/src/librustc/ty/_match.rs @@ -34,7 +34,7 @@ pub struct Match<'a, 'gcx: 'a+'tcx, 'tcx: 'a> { impl<'a, 'gcx, 'tcx> Match<'a, 'gcx, 'tcx> { pub fn new(tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Match<'a, 'gcx, 'tcx> { - Match { tcx: tcx } + Match { tcx } } } diff --git a/src/librustc/ty/fold.rs b/src/librustc/ty/fold.rs index f54dcfa37e944..329abe609b558 100644 --- a/src/librustc/ty/fold.rs +++ b/src/librustc/ty/fold.rs @@ -82,7 +82,7 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone { } fn has_type_flags(&self, flags: TypeFlags) -> bool { - self.visit_with(&mut HasTypeFlagsVisitor { flags: flags }) + self.visit_with(&mut HasTypeFlagsVisitor { flags }) } fn has_projections(&self) -> bool { self.has_type_flags(TypeFlags::HAS_PROJECTION) diff --git a/src/librustc_codegen_llvm/llvm/mod.rs b/src/librustc_codegen_llvm/llvm/mod.rs index 4343c8c184ecf..fbd5192a63f8e 100644 --- a/src/librustc_codegen_llvm/llvm/mod.rs +++ b/src/librustc_codegen_llvm/llvm/mod.rs @@ -190,7 +190,7 @@ impl ObjectFile { pub fn new(llmb: &'static mut MemoryBuffer) -> Option { unsafe { let llof = LLVMCreateObjectFile(llmb)?; - Some(ObjectFile { llof: llof }) + Some(ObjectFile { llof }) } } } diff --git a/src/librustc_codegen_llvm/mir/analyze.rs b/src/librustc_codegen_llvm/mir/analyze.rs index a0d6cc4629589..aad08550d97fb 100644 --- a/src/librustc_codegen_llvm/mir/analyze.rs +++ b/src/librustc_codegen_llvm/mir/analyze.rs @@ -328,7 +328,7 @@ pub fn cleanup_kinds<'a, 'tcx>(mir: &mir::Mir<'tcx>) -> IndexVec { - result[succ] = CleanupKind::Internal { funclet: funclet }; + result[succ] = CleanupKind::Internal { funclet }; } CleanupKind::Funclet => { if funclet != succ { diff --git a/src/librustc_codegen_utils/symbol_names_test.rs b/src/librustc_codegen_utils/symbol_names_test.rs index 47bbd67fb5c70..6eaf0c1c08da1 100644 --- a/src/librustc_codegen_utils/symbol_names_test.rs +++ b/src/librustc_codegen_utils/symbol_names_test.rs @@ -32,7 +32,7 @@ pub fn report_symbol_names<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { } tcx.dep_graph.with_ignore(|| { - let mut visitor = SymbolNamesTest { tcx: tcx }; + let mut visitor = SymbolNamesTest { tcx }; tcx.hir.krate().visit_all_item_likes(&mut visitor); }) } diff --git a/src/librustc_data_structures/flock.rs b/src/librustc_data_structures/flock.rs index 38ce331051fec..86e48e21626ab 100644 --- a/src/librustc_data_structures/flock.rs +++ b/src/librustc_data_structures/flock.rs @@ -214,7 +214,7 @@ cfg_if! { unsafe { libc::close(fd); } Err(err) } else { - Ok(Lock { fd: fd }) + Ok(Lock { fd }) } } } diff --git a/src/librustc_data_structures/svh.rs b/src/librustc_data_structures/svh.rs index 94f132562b5ea..3d17824608cc8 100644 --- a/src/librustc_data_structures/svh.rs +++ b/src/librustc_data_structures/svh.rs @@ -31,7 +31,7 @@ impl Svh { /// compute the SVH from some HIR, you want the `calculate_svh` /// function found in `librustc_incremental`. pub fn new(hash: u64) -> Svh { - Svh { hash: hash } + Svh { hash } } pub fn as_u64(&self) -> u64 { diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index a441f7a87f763..af32218fe2068 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -794,7 +794,7 @@ impl LintPass for ImproperCTypes { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { fn check_foreign_item(&mut self, cx: &LateContext, it: &hir::ForeignItem) { - let mut vis = ImproperCTypesVisitor { cx: cx }; + let mut vis = ImproperCTypesVisitor { cx }; let abi = cx.tcx.hir.get_foreign_abi(it.id); if abi != Abi::RustIntrinsic && abi != Abi::PlatformIntrinsic { match it.node { diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs index c36ae02ab54e0..153dbf3b4c595 100644 --- a/src/librustc_metadata/encoder.rs +++ b/src/librustc_metadata/encoder.rs @@ -323,7 +323,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { index.record(DefId::local(CRATE_DEF_INDEX), IsolatedEncoder::encode_info_for_mod, FromId(CRATE_NODE_ID, (&krate.module, &krate.attrs, &vis))); - let mut visitor = EncodeVisitor { index: index }; + let mut visitor = EncodeVisitor { index }; krate.visit_all_item_likes(&mut visitor.as_deep_visitor()); for macro_def in &krate.exported_macros { visitor.visit_macro_def(macro_def); diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir/build/scope.rs index cc5b08f2a9047..c62188e7ac942 100644 --- a/src/librustc_mir/build/scope.rs +++ b/src/librustc_mir/build/scope.rs @@ -453,7 +453,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { } let scope = &self.scopes[len - scope_count]; self.cfg.terminate(block, scope.source_info(span), - TerminatorKind::Goto { target: target }); + TerminatorKind::Goto { target }); } /// Creates a path that performs all required cleanup for dropping a generator. @@ -1019,7 +1019,7 @@ fn build_diverge_scope<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>, } else { let block = cfg.start_new_cleanup_block(); cfg.push_end_region(tcx, block, source_info(span), scope.region_scope); - cfg.terminate(block, source_info(span), TerminatorKind::Goto { target: target }); + cfg.terminate(block, source_info(span), TerminatorKind::Goto { target }); *cached_block = Some(block); block } diff --git a/src/librustc_mir/dataflow/impls/borrowed_locals.rs b/src/librustc_mir/dataflow/impls/borrowed_locals.rs index 8d186597b142c..1e279d8dd9708 100644 --- a/src/librustc_mir/dataflow/impls/borrowed_locals.rs +++ b/src/librustc_mir/dataflow/impls/borrowed_locals.rs @@ -28,7 +28,7 @@ pub struct HaveBeenBorrowedLocals<'a, 'tcx: 'a> { impl<'a, 'tcx: 'a> HaveBeenBorrowedLocals<'a, 'tcx> { pub fn new(mir: &'a Mir<'tcx>) -> Self { - HaveBeenBorrowedLocals { mir: mir } + HaveBeenBorrowedLocals { mir } } pub fn mir(&self) -> &Mir<'tcx> { diff --git a/src/librustc_mir/dataflow/impls/storage_liveness.rs b/src/librustc_mir/dataflow/impls/storage_liveness.rs index ab03ace23d7b4..c8faa34df8a2b 100644 --- a/src/librustc_mir/dataflow/impls/storage_liveness.rs +++ b/src/librustc_mir/dataflow/impls/storage_liveness.rs @@ -21,7 +21,7 @@ pub struct MaybeStorageLive<'a, 'tcx: 'a> { impl<'a, 'tcx: 'a> MaybeStorageLive<'a, 'tcx> { pub fn new(mir: &'a Mir<'tcx>) -> Self { - MaybeStorageLive { mir: mir } + MaybeStorageLive { mir } } pub fn mir(&self) -> &Mir<'tcx> { diff --git a/src/librustc_mir/hair/pattern/check_match.rs b/src/librustc_mir/hair/pattern/check_match.rs index f2ae5774da875..9f99f0362e73d 100644 --- a/src/librustc_mir/hair/pattern/check_match.rs +++ b/src/librustc_mir/hair/pattern/check_match.rs @@ -52,7 +52,7 @@ impl<'a, 'tcx> Visitor<'tcx> for OuterVisitor<'a, 'tcx> { } pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { - tcx.hir.krate().visit_all_item_likes(&mut OuterVisitor { tcx: tcx }.as_deep_visitor()); + tcx.hir.krate().visit_all_item_likes(&mut OuterVisitor { tcx }.as_deep_visitor()); tcx.sess.abort_if_errors(); } diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs index cb974366a3029..d70b274322bb5 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir/hair/pattern/mod.rs @@ -459,7 +459,7 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> { }) .collect(); - PatternKind::Leaf { subpatterns: subpatterns } + PatternKind::Leaf { subpatterns } } ty::Error => { // Avoid ICE (#50577) return Pattern { span: pat.span, ty, kind: Box::new(PatternKind::Wild) }; @@ -666,13 +666,13 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> { subpatterns, } } else { - PatternKind::Leaf { subpatterns: subpatterns } + PatternKind::Leaf { subpatterns } } } Def::Struct(..) | Def::StructCtor(..) | Def::Union(..) | Def::TyAlias(..) | Def::AssociatedTy(..) | Def::SelfTy(..) | Def::SelfCtor(..) => { - PatternKind::Leaf { subpatterns: subpatterns } + PatternKind::Leaf { subpatterns } } _ => { diff --git a/src/librustc_mir/transform/elaborate_drops.rs b/src/librustc_mir/transform/elaborate_drops.rs index 9d77289d7b9b1..f3d0d0520c700 100644 --- a/src/librustc_mir/transform/elaborate_drops.rs +++ b/src/librustc_mir/transform/elaborate_drops.rs @@ -495,7 +495,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { let target = self.patch.new_block(BasicBlockData { statements: vec![assign], terminator: Some(Terminator { - kind: TerminatorKind::Goto { target: target }, + kind: TerminatorKind::Goto { target }, ..*terminator }), is_cleanup: false, diff --git a/src/librustc_mir/transform/simplify.rs b/src/librustc_mir/transform/simplify.rs index a6e0932bf0ace..a624b05bbbe4b 100644 --- a/src/librustc_mir/transform/simplify.rs +++ b/src/librustc_mir/transform/simplify.rs @@ -302,7 +302,7 @@ impl MirPass for SimplifyLocals { let map = make_local_map(&mut mir.local_decls, marker.locals); // Update references to all vars and tmps now - LocalUpdater { map: map }.visit_mir(mir); + LocalUpdater { map }.visit_mir(mir); mir.local_decls.shrink_to_fit(); } } diff --git a/src/librustc_mir/transform/simplify_branches.rs b/src/librustc_mir/transform/simplify_branches.rs index e14941b8aeb9a..b24898095435b 100644 --- a/src/librustc_mir/transform/simplify_branches.rs +++ b/src/librustc_mir/transform/simplify_branches.rs @@ -57,7 +57,7 @@ impl MirPass for SimplifyBranches { TerminatorKind::Assert { target, cond: Operand::Constant(ref c), expected, .. } if (c.literal.assert_bool(tcx) == Some(true)) == expected => { - TerminatorKind::Goto { target: target } + TerminatorKind::Goto { target } }, TerminatorKind::FalseEdges { real_target, .. } => { TerminatorKind::Goto { target: real_target } diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index f6ace57f5e0fb..89d5465e601c1 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -691,5 +691,5 @@ pub fn check_crate(session: &Session, krate: &Crate) { is_banned: false, }, krate); - visit::walk_crate(&mut AstValidator { session: session }, krate) + visit::walk_crate(&mut AstValidator { session }, krate) } diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 86fe584dc3a40..94568989ef3a5 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -4424,7 +4424,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { // declared as public (due to pruning, we don't explore // outside crate private modules => no need to check this) if !in_module_is_extern || name_binding.vis == ty::Visibility::Public { - candidates.push(ImportSuggestion { path: path }); + candidates.push(ImportSuggestion { path }); } } } @@ -4533,7 +4533,7 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> { span: name_binding.span, segments: path_segments, }; - result = Some((module, ImportSuggestion { path: path })); + result = Some((module, ImportSuggestion { path })); } else { // add the module to the lookup if seen_modules.insert(module.def_id().unwrap()) { diff --git a/src/librustc_save_analysis/json_dumper.rs b/src/librustc_save_analysis/json_dumper.rs index e14ac73ee1020..53ec67070951e 100644 --- a/src/librustc_save_analysis/json_dumper.rs +++ b/src/librustc_save_analysis/json_dumper.rs @@ -71,7 +71,7 @@ impl<'b> JsonDumper> { config: Config, ) -> JsonDumper> { JsonDumper { - output: CallbackOutput { callback: callback }, + output: CallbackOutput { callback }, config: config.clone(), result: Analysis::new(config), } diff --git a/src/librustc_typeck/check/wfcheck.rs b/src/librustc_typeck/check/wfcheck.rs index cc1906d91d4c9..d40b2f1833a4e 100644 --- a/src/librustc_typeck/check/wfcheck.rs +++ b/src/librustc_typeck/check/wfcheck.rs @@ -962,7 +962,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { AdtField { ty: field_ty, span: field.span } }) .collect(); - AdtVariant { fields: fields } + AdtVariant { fields } } fn enum_variants(&self, enum_def: &hir::EnumDef) -> Vec> { diff --git a/src/librustc_typeck/coherence/orphan.rs b/src/librustc_typeck/coherence/orphan.rs index b155587dddc41..14c6864434fcf 100644 --- a/src/librustc_typeck/coherence/orphan.rs +++ b/src/librustc_typeck/coherence/orphan.rs @@ -17,7 +17,7 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor; use rustc::hir; pub fn check<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { - let mut orphan = OrphanChecker { tcx: tcx }; + let mut orphan = OrphanChecker { tcx }; tcx.hir.krate().visit_all_item_likes(&mut orphan); } diff --git a/src/librustc_typeck/coherence/unsafety.rs b/src/librustc_typeck/coherence/unsafety.rs index bdbf93ddec286..0894c1d49e80e 100644 --- a/src/librustc_typeck/coherence/unsafety.rs +++ b/src/librustc_typeck/coherence/unsafety.rs @@ -16,7 +16,7 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor; use rustc::hir::{self, Unsafety}; pub fn check<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { - let mut unsafety = UnsafetyChecker { tcx: tcx }; + let mut unsafety = UnsafetyChecker { tcx }; tcx.hir.krate().visit_all_item_likes(&mut unsafety); } diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index f96c85ae7ae3f..3cefe302ac421 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -62,7 +62,7 @@ use std::iter; // Main entry point pub fn collect_item_types<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { - let mut visitor = CollectItemTypesVisitor { tcx: tcx }; + let mut visitor = CollectItemTypesVisitor { tcx }; tcx.hir .krate() .visit_all_item_likes(&mut visitor.as_deep_visitor()); diff --git a/src/librustc_typeck/impl_wf_check.rs b/src/librustc_typeck/impl_wf_check.rs index 7e0a8d63e2889..b79d1279e3d28 100644 --- a/src/librustc_typeck/impl_wf_check.rs +++ b/src/librustc_typeck/impl_wf_check.rs @@ -62,7 +62,7 @@ pub fn impl_wf_check<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { // We will tag this as part of the WF check -- logically, it is, // but it's one that we must perform earlier than the rest of // WfCheck. - tcx.hir.krate().visit_all_item_likes(&mut ImplWfCheck { tcx: tcx }); + tcx.hir.krate().visit_all_item_likes(&mut ImplWfCheck { tcx }); } struct ImplWfCheck<'a, 'tcx: 'a> { diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 2ba1f103971f0..88e4ebeb39efc 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2959,7 +2959,7 @@ impl<'tcx> Clean for ty::VariantDef { source: cx.tcx.def_span(self.did).clean(cx), visibility: Some(Inherited), def_id: self.did, - inner: VariantItem(Variant { kind: kind }), + inner: VariantItem(Variant { kind }), stability: get_stability(cx, self.did), deprecation: get_deprecation(cx, self.did), } diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index ef5dae724b247..04e1632460b18 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -2854,7 +2854,7 @@ mod test_map { slot.borrow_mut()[k] += 1; }); - Droppable { k: k } + Droppable { k } } } diff --git a/src/libstd/fs.rs b/src/libstd/fs.rs index 017949291bcf1..c2ced266294c4 100644 --- a/src/libstd/fs.rs +++ b/src/libstd/fs.rs @@ -877,7 +877,7 @@ impl OpenOptions { fn _open(&self, path: &Path) -> io::Result { let inner = fs_imp::File::open(path, &self.0)?; - Ok(File { inner: inner }) + Ok(File { inner }) } } diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 371e5b21c13b2..12995d0868345 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -150,7 +150,7 @@ pub struct Repeat { byte: u8 } /// assert_eq!(buffer, [0b101, 0b101, 0b101]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] -pub fn repeat(byte: u8) -> Repeat { Repeat { byte: byte } } +pub fn repeat(byte: u8) -> Repeat { Repeat { byte } } #[stable(feature = "rust1", since = "1.0.0")] impl Read for Repeat { diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index 59cf741487e44..81f98a55c1171 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -931,7 +931,7 @@ impl fmt::Debug for Sender { impl SyncSender { fn new(inner: Arc>) -> SyncSender { - SyncSender { inner: inner } + SyncSender { inner } } /// Sends a value on this synchronous channel. diff --git a/src/libstd/sys/cloudabi/time.rs b/src/libstd/sys/cloudabi/time.rs index ee12731619aac..3d66998b9f549 100644 --- a/src/libstd/sys/cloudabi/time.rs +++ b/src/libstd/sys/cloudabi/time.rs @@ -32,7 +32,7 @@ impl Instant { let mut t = mem::uninitialized(); let ret = abi::clock_time_get(abi::clockid::MONOTONIC, 0, &mut t); assert_eq!(ret, abi::errno::SUCCESS); - Instant { t: t } + Instant { t } } } @@ -71,7 +71,7 @@ impl SystemTime { let mut t = mem::uninitialized(); let ret = abi::clock_time_get(abi::clockid::REALTIME, 0, &mut t); assert_eq!(ret, abi::errno::SUCCESS); - SystemTime { t: t } + SystemTime { t } } } diff --git a/src/libstd/sys/redox/fd.rs b/src/libstd/sys/redox/fd.rs index e04e2791b23a1..d61103a872f9e 100644 --- a/src/libstd/sys/redox/fd.rs +++ b/src/libstd/sys/redox/fd.rs @@ -21,7 +21,7 @@ pub struct FileDesc { impl FileDesc { pub fn new(fd: usize) -> FileDesc { - FileDesc { fd: fd } + FileDesc { fd } } pub fn raw(&self) -> usize { self.fd } diff --git a/src/libstd/sys/redox/fs.rs b/src/libstd/sys/redox/fs.rs index 2e2216186f1e6..6059406997dff 100644 --- a/src/libstd/sys/redox/fs.rs +++ b/src/libstd/sys/redox/fs.rs @@ -264,7 +264,7 @@ impl File { pub fn file_attr(&self) -> io::Result { let mut stat = syscall::Stat::default(); cvt(syscall::fstat(self.0.raw(), &mut stat))?; - Ok(FileAttr { stat: stat }) + Ok(FileAttr { stat }) } pub fn fsync(&self) -> io::Result<()> { diff --git a/src/libstd/sys/redox/syscall/error.rs b/src/libstd/sys/redox/syscall/error.rs index 1ef79547431f8..1e3783705537a 100644 --- a/src/libstd/sys/redox/syscall/error.rs +++ b/src/libstd/sys/redox/syscall/error.rs @@ -19,7 +19,7 @@ pub type Result = result::Result; impl Error { pub fn new(errno: i32) -> Error { - Error { errno: errno } + Error { errno } } pub fn mux(result: Result) -> usize { diff --git a/src/libstd/sys/redox/thread.rs b/src/libstd/sys/redox/thread.rs index f4177087d77a1..bab91b16e6c0a 100644 --- a/src/libstd/sys/redox/thread.rs +++ b/src/libstd/sys/redox/thread.rs @@ -38,7 +38,7 @@ impl Thread { panic!("thread failed to exit"); } else { mem::forget(p); - Ok(Thread { id: id }) + Ok(Thread { id }) } } diff --git a/src/libstd/sys/redox/time.rs b/src/libstd/sys/redox/time.rs index 5c491115c5516..aac6d2704e790 100644 --- a/src/libstd/sys/redox/time.rs +++ b/src/libstd/sys/redox/time.rs @@ -187,7 +187,7 @@ impl SystemTime { impl From for SystemTime { fn from(t: syscall::TimeSpec) -> SystemTime { - SystemTime { t: Timespec { t: t } } + SystemTime { t: Timespec { t } } } } diff --git a/src/libstd/sys/unix/fd.rs b/src/libstd/sys/unix/fd.rs index db2ea6b660a7a..af33d2636fb1f 100644 --- a/src/libstd/sys/unix/fd.rs +++ b/src/libstd/sys/unix/fd.rs @@ -41,7 +41,7 @@ fn max_len() -> usize { impl FileDesc { pub fn new(fd: c_int) -> FileDesc { - FileDesc { fd: fd } + FileDesc { fd } } pub fn raw(&self) -> c_int { self.fd } diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 1d5b0cfa94ad5..add06aec11b64 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -317,7 +317,7 @@ impl DirEntry { cvt(unsafe { fstatat64(fd, self.entry.d_name.as_ptr(), &mut stat, libc::AT_SYMLINK_NOFOLLOW) })?; - Ok(FileAttr { stat: stat }) + Ok(FileAttr { stat }) } #[cfg(not(any(target_os = "linux", target_os = "emscripten", target_os = "android")))] @@ -526,7 +526,7 @@ impl File { cvt(unsafe { fstat64(self.0.raw(), &mut stat) })?; - Ok(FileAttr { stat: stat }) + Ok(FileAttr { stat }) } pub fn fsync(&self) -> io::Result<()> { @@ -807,7 +807,7 @@ pub fn stat(p: &Path) -> io::Result { cvt(unsafe { stat64(p.as_ptr(), &mut stat) })?; - Ok(FileAttr { stat: stat }) + Ok(FileAttr { stat }) } pub fn lstat(p: &Path) -> io::Result { @@ -816,7 +816,7 @@ pub fn lstat(p: &Path) -> io::Result { cvt(unsafe { lstat64(p.as_ptr(), &mut stat) })?; - Ok(FileAttr { stat: stat }) + Ok(FileAttr { stat }) } pub fn canonicalize(p: &Path) -> io::Result { diff --git a/src/libstd/sys/unix/time.rs b/src/libstd/sys/unix/time.rs index 0b1fb726357e1..af51f8a8e257a 100644 --- a/src/libstd/sys/unix/time.rs +++ b/src/libstd/sys/unix/time.rs @@ -217,7 +217,7 @@ mod inner { impl From for SystemTime { fn from(t: libc::timespec) -> SystemTime { - SystemTime { t: Timespec { t: t } } + SystemTime { t: Timespec { t } } } } @@ -332,7 +332,7 @@ mod inner { impl From for SystemTime { fn from(t: libc::timespec) -> SystemTime { - SystemTime { t: Timespec { t: t } } + SystemTime { t: Timespec { t } } } } diff --git a/src/libstd/sys/windows/process.rs b/src/libstd/sys/windows/process.rs index 4974a8de89c79..ff1ee0d26fe54 100644 --- a/src/libstd/sys/windows/process.rs +++ b/src/libstd/sys/windows/process.rs @@ -241,7 +241,7 @@ impl<'a> DropGuard<'a> { fn new(lock: &'a Mutex) -> DropGuard<'a> { unsafe { lock.lock(); - DropGuard { lock: lock } + DropGuard { lock } } } } diff --git a/src/libstd/sys/windows/time.rs b/src/libstd/sys/windows/time.rs index 07e64d386a1c2..54bcbc76b1a3c 100644 --- a/src/libstd/sys/windows/time.rs +++ b/src/libstd/sys/windows/time.rs @@ -170,7 +170,7 @@ impl fmt::Debug for SystemTime { impl From for SystemTime { fn from(t: c::FILETIME) -> SystemTime { - SystemTime { t: t } + SystemTime { t } } } diff --git a/src/libstd/sys_common/poison.rs b/src/libstd/sys_common/poison.rs index 1625efe4a2ae7..af93571a60482 100644 --- a/src/libstd/sys_common/poison.rs +++ b/src/libstd/sys_common/poison.rs @@ -174,7 +174,7 @@ impl PoisonError { /// [`RwLock::read`]: ../../std/sync/struct.RwLock.html#method.read #[stable(feature = "sync_poison", since = "1.2.0")] pub fn new(guard: T) -> PoisonError { - PoisonError { guard: guard } + PoisonError { guard } } /// Consumes this error indicating that a lock is poisoned, returning the diff --git a/src/libstd/sys_common/wtf8.rs b/src/libstd/sys_common/wtf8.rs index 8725abe741679..19ce932aa1233 100644 --- a/src/libstd/sys_common/wtf8.rs +++ b/src/libstd/sys_common/wtf8.rs @@ -67,7 +67,7 @@ impl CodePoint { /// Only use when `value` is known to be less than or equal to 0x10FFFF. #[inline] pub unsafe fn from_u32_unchecked(value: u32) -> CodePoint { - CodePoint { value: value } + CodePoint { value } } /// Creates a new `CodePoint` if the value is a valid code point. @@ -76,7 +76,7 @@ impl CodePoint { #[inline] pub fn from_u32(value: u32) -> Option { match value { - 0 ..= 0x10FFFF => Some(CodePoint { value: value }), + 0 ..= 0x10FFFF => Some(CodePoint { value }), _ => None } } diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs index f5d1bd6255e2a..e1ba8897a47f4 100644 --- a/src/libsyntax/ext/source_util.rs +++ b/src/libsyntax/ext/source_util.rs @@ -126,7 +126,7 @@ pub fn expand_include<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[tokenstream::T } } - Box::new(ExpandResult { p: p }) + Box::new(ExpandResult { p }) } // include_str! : read the given file, insert it as a literal string expr diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 95a2298ca757d..378df6461f130 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -944,7 +944,7 @@ pub fn noop_fold_item_kind(i: ItemKind, folder: &mut T) -> ItemKind { ItemKind::Enum(enum_definition, generics) => { let generics = folder.fold_generics(generics); let variants = enum_definition.variants.move_map(|x| folder.fold_variant(x)); - ItemKind::Enum(ast::EnumDef { variants: variants }, generics) + ItemKind::Enum(ast::EnumDef { variants }, generics) } ItemKind::Struct(struct_def, generics) => { let generics = folder.fold_generics(generics); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c7089a295fc3d..d97ad2aa8eb8b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6871,7 +6871,7 @@ impl<'a> Parser<'a> { _ => () } - Ok(ast::EnumDef { variants: variants }) + Ok(ast::EnumDef { variants }) } /// Parse an "enum" declaration From 9dba743a6acbf18e9fbec359778352ee95a8ee7c Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 3 Nov 2018 12:44:10 +0100 Subject: [PATCH 15/17] do not print wrapping ranges like normal ranges in diagnostics --- src/librustc_mir/interpret/validity.rs | 66 +++++++++++--------- src/test/ui/consts/const-eval/ub-enum.rs | 29 ++++++--- src/test/ui/consts/const-eval/ub-enum.stderr | 40 ++++++++---- 3 files changed, 85 insertions(+), 50 deletions(-) diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs index 8c8b3e2ca77c4..7efeaee6cce0a 100644 --- a/src/librustc_mir/interpret/validity.rs +++ b/src/librustc_mir/interpret/validity.rs @@ -10,6 +10,7 @@ use std::fmt::Write; use std::hash::Hash; +use std::ops::RangeInclusive; use syntax_pos::symbol::Symbol; use rustc::ty::layout::{self, Size, Align, TyLayout, LayoutOf}; @@ -122,6 +123,34 @@ fn path_format(path: &Vec) -> String { out } +// Test if a range that wraps at overflow contains `test` +fn wrapping_range_contains(r: &RangeInclusive, test: u128) -> bool { + let (lo, hi) = r.clone().into_inner(); + if lo > hi { + // Wrapped + (..=hi).contains(&test) || (lo..).contains(&test) + } else { + // Normal + r.contains(&test) + } +} + +// Formats such that a sentence like "expected something {}" to mean +// "expected something " makes sense. +fn wrapping_range_format(r: &RangeInclusive, max_hi: u128) -> String { + let (lo, hi) = r.clone().into_inner(); + debug_assert!(hi <= max_hi); + if lo > hi { + format!("less or equal to {}, or greater or equal to {}", hi, lo) + } else { + if hi == max_hi { + format!("greater or equal to {}", lo) + } else { + format!("in the range {:?}", r) + } + } +} + struct ValidityVisitor<'rt, 'a: 'rt, 'mir: 'rt, 'tcx: 'a+'rt+'mir, M: Machine<'a, 'mir, 'tcx>+'rt> { /// The `path` may be pushed to, but the part that is present when a function /// starts must not be changed! `visit_fields` and `visit_array` rely on @@ -428,8 +457,8 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> "a pointer", self.path, format!( - "something that cannot possibly be outside the (wrapping) range {:?}", - layout.valid_range + "something that cannot possibly fail to be {}", + wrapping_range_format(&layout.valid_range, max_hi) ) ); } @@ -440,33 +469,14 @@ impl<'rt, 'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> } }; // Now compare. This is slightly subtle because this is a special "wrap-around" range. - use std::ops::RangeInclusive; - let in_range = |bound: RangeInclusive| bound.contains(&bits); - if lo > hi { - // wrapping around - if in_range(0..=hi) || in_range(lo..=max_hi) { - Ok(()) - } else { - validation_failure!( - bits, - self.path, - format!("something in the range {:?} or {:?}", 0..=hi, lo..=max_hi) - ) - } + if wrapping_range_contains(&layout.valid_range, bits) { + Ok(()) } else { - if in_range(layout.valid_range.clone()) { - Ok(()) - } else { - validation_failure!( - bits, - self.path, - if hi == max_hi { - format!("something greater or equal to {}", lo) - } else { - format!("something in the range {:?}", layout.valid_range) - } - ) - } + validation_failure!( + bits, + self.path, + format!("something {}", wrapping_range_format(&layout.valid_range, max_hi)) + ) } } diff --git a/src/test/ui/consts/const-eval/ub-enum.rs b/src/test/ui/consts/const-eval/ub-enum.rs index 309627581d051..0aa15c8393879 100644 --- a/src/test/ui/consts/const-eval/ub-enum.rs +++ b/src/test/ui/consts/const-eval/ub-enum.rs @@ -17,39 +17,48 @@ enum Enum { } union TransmuteEnum { a: &'static u8, - b: Enum, + out: Enum, } // A pointer is guaranteed non-null -const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.b }; +const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.out }; //~^ ERROR is undefined behavior -// Invalid enum discriminant +// (Potentially) invalid enum discriminant #[repr(usize)] #[derive(Copy, Clone)] enum Enum2 { A = 2, } +#[repr(transparent)] +#[derive(Copy, Clone)] +struct Wrap(T); union TransmuteEnum2 { - a: usize, - b: Enum2, - c: (), + in1: usize, + in2: &'static u8, + in3: (), + out1: Enum2, + out2: Wrap, // something wrapping the enum so that we test layout first, not enum } -const BAD_ENUM2 : Enum2 = unsafe { TransmuteEnum2 { a: 0 }.b }; +const BAD_ENUM2: Enum2 = unsafe { TransmuteEnum2 { in1: 0 }.out1 }; +//~^ ERROR is undefined behavior +const BAD_ENUM3: Enum2 = unsafe { TransmuteEnum2 { in2: &0 }.out1 }; +//~^ ERROR is undefined behavior +const BAD_ENUM4: Wrap = unsafe { TransmuteEnum2 { in2: &0 }.out2 }; //~^ ERROR is undefined behavior // Undef enum discriminant. In an arry to avoid `Scalar` layout. -const BAD_ENUM3 : [Enum2; 2] = [unsafe { TransmuteEnum2 { c: () }.b }; 2]; +const BAD_ENUM_UNDEF: [Enum2; 2] = [unsafe { TransmuteEnum2 { in3: () }.out1 }; 2]; //~^ ERROR is undefined behavior -// Invalid enum field content (mostly to test printing of apths for enum tuple +// Invalid enum field content (mostly to test printing of paths for enum tuple // variants and tuples). union TransmuteChar { a: u32, b: char, } // Need to create something which does not clash with enum layout optimizations. -const BAD_ENUM_CHAR : Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b })); +const BAD_ENUM_CHAR: Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b })); //~^ ERROR is undefined behavior fn main() { diff --git a/src/test/ui/consts/const-eval/ub-enum.stderr b/src/test/ui/consts/const-eval/ub-enum.stderr index 57c41711536d9..7f1560558235f 100644 --- a/src/test/ui/consts/const-eval/ub-enum.stderr +++ b/src/test/ui/consts/const-eval/ub-enum.stderr @@ -1,35 +1,51 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/ub-enum.rs:24:1 | -LL | const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.b }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer, but expected a valid enum discriminant +LL | const BAD_ENUM: Enum = unsafe { TransmuteEnum { a: &1 }.out }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer, but expected a valid enum discriminant | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-enum.rs:38:1 + --> $DIR/ub-enum.rs:43:1 | -LL | const BAD_ENUM2 : Enum2 = unsafe { TransmuteEnum2 { a: 0 }.b }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 0, but expected a valid enum discriminant +LL | const BAD_ENUM2: Enum2 = unsafe { TransmuteEnum2 { in1: 0 }.out1 }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 0, but expected a valid enum discriminant | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-enum.rs:42:1 + --> $DIR/ub-enum.rs:45:1 | -LL | const BAD_ENUM3 : [Enum2; 2] = [unsafe { TransmuteEnum2 { c: () }.b }; 2]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempted to read undefined bytes +LL | const BAD_ENUM3: Enum2 = unsafe { TransmuteEnum2 { in2: &0 }.out1 }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer, but expected a valid enum discriminant | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-enum.rs:52:1 + --> $DIR/ub-enum.rs:47:1 | -LL | const BAD_ENUM_CHAR : Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b })); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 4294967295 at .Some.0.1, but expected something in the range 0..=1114111 +LL | const BAD_ENUM4: Wrap = unsafe { TransmuteEnum2 { in2: &0 }.out2 }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer, but expected something that cannot possibly fail to be in the range 2..=2 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior -error: aborting due to 4 previous errors +error[E0080]: it is undefined behavior to use this value + --> $DIR/ub-enum.rs:51:1 + | +LL | const BAD_ENUM_UNDEF: [Enum2; 2] = [unsafe { TransmuteEnum2 { in3: () }.out1 }; 2]; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempted to read undefined bytes + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior + +error[E0080]: it is undefined behavior to use this value + --> $DIR/ub-enum.rs:61:1 + | +LL | const BAD_ENUM_CHAR: Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b })); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 4294967295 at .Some.0.1, but expected something in the range 0..=1114111 + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior + +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0080`. From b42b9b34d54788899dce0a6cd9031a144438ca1e Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 3 Nov 2018 13:21:09 +0100 Subject: [PATCH 16/17] pretty-print scalar range that only has an upper bound --- src/librustc_mir/interpret/validity.rs | 5 ++++- src/test/ui/consts/const-eval/transmute-const.stderr | 2 +- src/test/ui/consts/const-eval/ub-enum.stderr | 2 +- src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr | 8 ++++---- src/test/ui/consts/const-eval/union-ub.stderr | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs index 7efeaee6cce0a..8fde0c9b8afd9 100644 --- a/src/librustc_mir/interpret/validity.rs +++ b/src/librustc_mir/interpret/validity.rs @@ -143,7 +143,10 @@ fn wrapping_range_format(r: &RangeInclusive, max_hi: u128) -> String { if lo > hi { format!("less or equal to {}, or greater or equal to {}", hi, lo) } else { - if hi == max_hi { + if lo == 0 { + debug_assert!(hi < max_hi, "should not be printing if the range covers everything"); + format!("less or equal to {}", hi) + } else if hi == max_hi { format!("greater or equal to {}", lo) } else { format!("in the range {:?}", r) diff --git a/src/test/ui/consts/const-eval/transmute-const.stderr b/src/test/ui/consts/const-eval/transmute-const.stderr index 91faa4684c392..cf87170a89d89 100644 --- a/src/test/ui/consts/const-eval/transmute-const.stderr +++ b/src/test/ui/consts/const-eval/transmute-const.stderr @@ -2,7 +2,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/transmute-const.rs:15:1 | LL | static FOO: bool = unsafe { mem::transmute(3u8) }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3, but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3, but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior diff --git a/src/test/ui/consts/const-eval/ub-enum.stderr b/src/test/ui/consts/const-eval/ub-enum.stderr index 7f1560558235f..804c9643d8ae3 100644 --- a/src/test/ui/consts/const-eval/ub-enum.stderr +++ b/src/test/ui/consts/const-eval/ub-enum.stderr @@ -42,7 +42,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/ub-enum.rs:61:1 | LL | const BAD_ENUM_CHAR: Option<(char, char)> = Some(('x', unsafe { TransmuteChar { a: !0 }.b })); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 4294967295 at .Some.0.1, but expected something in the range 0..=1114111 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 4294967295 at .Some.0.1, but expected something less or equal to 1114111 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior diff --git a/src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr b/src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr index 9a799b98cfc57..c21690754f62c 100644 --- a/src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr +++ b/src/test/ui/consts/const-eval/union-ub-fat-ptr.stderr @@ -66,7 +66,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/union-ub-fat-ptr.rs:117:1 | LL | const G: &Trait = &unsafe { BoolTransmute { val: 3 }.bl }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .., but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .., but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior @@ -74,7 +74,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/union-ub-fat-ptr.rs:121:1 | LL | const H: &[bool] = &[unsafe { BoolTransmute { val: 3 }.bl }]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .[0], but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at .[0], but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior @@ -82,7 +82,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/union-ub-fat-ptr.rs:127:1 | LL | const I2: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at ..0, but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at ..0, but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior @@ -90,7 +90,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/union-ub-fat-ptr.rs:130:1 | LL | const I3: &MySliceBool = &MySlice(true, [unsafe { BoolTransmute { val: 3 }.bl }]); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at ..1[0], but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 3 at ..1[0], but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior diff --git a/src/test/ui/consts/const-eval/union-ub.stderr b/src/test/ui/consts/const-eval/union-ub.stderr index 2b6f6a47cd92f..db78ead370b87 100644 --- a/src/test/ui/consts/const-eval/union-ub.stderr +++ b/src/test/ui/consts/const-eval/union-ub.stderr @@ -2,7 +2,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/union-ub.rs:38:1 | LL | const BAD_BOOL: bool = unsafe { DummyUnion { u8: 42 }.bool}; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 42, but expected something in the range 0..=1 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 42, but expected something less or equal to 1 | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior From 3ec89746ba8129c68ff8a278acc10fb12ad55939 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 3 Nov 2018 14:10:34 +0100 Subject: [PATCH 17/17] test diagnostics for more ranges --- src/test/ui/consts/const-eval/ub-nonnull.rs | 16 +++++++++++++++- .../ui/consts/const-eval/ub-nonnull.stderr | 18 +++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/test/ui/consts/const-eval/ub-nonnull.rs b/src/test/ui/consts/const-eval/ub-nonnull.rs index 8b83a1747cabd..113221959fb9c 100644 --- a/src/test/ui/consts/const-eval/ub-nonnull.rs +++ b/src/test/ui/consts/const-eval/ub-nonnull.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![feature(const_transmute)] +#![feature(rustc_attrs, const_transmute)] #![allow(const_err)] // make sure we cannot allow away the errors tested here use std::mem; @@ -23,4 +23,18 @@ const NULL_U8: NonZeroU8 = unsafe { mem::transmute(0u8) }; const NULL_USIZE: NonZeroUsize = unsafe { mem::transmute(0usize) }; //~^ ERROR it is undefined behavior to use this value +// Also test other uses of rustc_layout_scalar_valid_range_start + +#[rustc_layout_scalar_valid_range_start(10)] +#[rustc_layout_scalar_valid_range_end(30)] +struct RestrictedRange1(u32); +const BAD_RANGE1: RestrictedRange1 = unsafe { RestrictedRange1(42) }; +//~^ ERROR it is undefined behavior to use this value + +#[rustc_layout_scalar_valid_range_start(30)] +#[rustc_layout_scalar_valid_range_end(10)] +struct RestrictedRange2(u32); +const BAD_RANGE2: RestrictedRange2 = unsafe { RestrictedRange2(20) }; +//~^ ERROR it is undefined behavior to use this value + fn main() {} diff --git a/src/test/ui/consts/const-eval/ub-nonnull.stderr b/src/test/ui/consts/const-eval/ub-nonnull.stderr index 7c0ff851d8848..c50b0208f15ef 100644 --- a/src/test/ui/consts/const-eval/ub-nonnull.stderr +++ b/src/test/ui/consts/const-eval/ub-nonnull.stderr @@ -22,6 +22,22 @@ LL | const NULL_USIZE: NonZeroUsize = unsafe { mem::transmute(0usize) }; | = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior -error: aborting due to 3 previous errors +error[E0080]: it is undefined behavior to use this value + --> $DIR/ub-nonnull.rs:31:1 + | +LL | const BAD_RANGE1: RestrictedRange1 = unsafe { RestrictedRange1(42) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 42, but expected something in the range 10..=30 + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior + +error[E0080]: it is undefined behavior to use this value + --> $DIR/ub-nonnull.rs:37:1 + | +LL | const BAD_RANGE2: RestrictedRange2 = unsafe { RestrictedRange2(20) }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered 20, but expected something less or equal to 10, or greater or equal to 30 + | + = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rust compiler repository if you believe it should not be considered undefined behavior + +error: aborting due to 5 previous errors For more information about this error, try `rustc --explain E0080`.