Auto merge of #36166 - jonathandturner:rollup, r=jonathandturner
Rollup of 16 pull requests - Successful merges: #35758, #35926, #36050, #36079, #36085, #36089, #36101, #36130, #36134, #36135, #36136, #36140, #36141, #36147, #36148, #36165 - Failed merges:
This commit is contained in:
commit
7a187c39c7
@ -383,7 +383,7 @@ impl PartialOrd for Ordering {
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// You may also find it useful to use `partial_cmp()` on your type`s fields. Here
|
||||
/// You may also find it useful to use `partial_cmp()` on your type's fields. Here
|
||||
/// is an example of `Person` types who have a floating-point `height` field that
|
||||
/// is the only field to be used for sorting:
|
||||
///
|
||||
|
@ -263,14 +263,12 @@ impl<A: Step> ops::RangeFrom<A> {
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// # #![feature(step_by)]
|
||||
///
|
||||
/// for i in (0u8..).step_by(2).take(10) {
|
||||
/// println!("{}", i);
|
||||
/// #![feature(step_by)]
|
||||
/// fn main() {
|
||||
/// let result: Vec<_> = (0..).step_by(2).take(5).collect();
|
||||
/// assert_eq!(result, vec![0, 2, 4, 6, 8]);
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// This prints the first ten even natural integers (0 to 18).
|
||||
#[unstable(feature = "step_by", reason = "recent addition",
|
||||
issue = "27741")]
|
||||
pub fn step_by(self, by: A) -> StepBy<A, Self> {
|
||||
@ -291,8 +289,10 @@ impl<A: Step> ops::Range<A> {
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(step_by)]
|
||||
/// let result: Vec<_> = (0..10).step_by(2).collect();
|
||||
/// assert_eq!(result, vec![0, 2, 4, 6, 8]);
|
||||
/// fn main() {
|
||||
/// let result: Vec<_> = (0..10).step_by(2).collect();
|
||||
/// assert_eq!(result, vec![0, 2, 4, 6, 8]);
|
||||
/// }
|
||||
/// ```
|
||||
#[unstable(feature = "step_by", reason = "recent addition",
|
||||
issue = "27741")]
|
||||
@ -315,20 +315,8 @@ impl<A: Step> ops::RangeInclusive<A> {
|
||||
/// ```
|
||||
/// #![feature(step_by, inclusive_range_syntax)]
|
||||
///
|
||||
/// for i in (0...10).step_by(2) {
|
||||
/// println!("{}", i);
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// This prints:
|
||||
///
|
||||
/// ```text
|
||||
/// 0
|
||||
/// 2
|
||||
/// 4
|
||||
/// 6
|
||||
/// 8
|
||||
/// 10
|
||||
/// let result: Vec<_> = (0...10).step_by(2).collect();
|
||||
/// assert_eq!(result, vec![0, 2, 4, 6, 8, 10]);
|
||||
/// ```
|
||||
#[unstable(feature = "step_by", reason = "recent addition",
|
||||
issue = "27741")]
|
||||
|
@ -948,25 +948,55 @@ bitand_impl! { bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 }
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A trivial implementation of `BitOr`. When `Foo | Foo` happens, it ends up
|
||||
/// calling `bitor`, and therefore, `main` prints `Bitwise Or-ing!`.
|
||||
/// In this example, the `|` operator is lifted to a trivial `Scalar` type.
|
||||
///
|
||||
/// ```
|
||||
/// use std::ops::BitOr;
|
||||
///
|
||||
/// struct Foo;
|
||||
/// #[derive(Debug, PartialEq)]
|
||||
/// struct Scalar(bool);
|
||||
///
|
||||
/// impl BitOr for Foo {
|
||||
/// type Output = Foo;
|
||||
/// impl BitOr for Scalar {
|
||||
/// type Output = Self;
|
||||
///
|
||||
/// fn bitor(self, _rhs: Foo) -> Foo {
|
||||
/// println!("Bitwise Or-ing!");
|
||||
/// self
|
||||
/// // rhs is the "right-hand side" of the expression `a | b`
|
||||
/// fn bitor(self, rhs: Self) -> Self {
|
||||
/// Scalar(self.0 | rhs.0)
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// Foo | Foo;
|
||||
/// assert_eq!(Scalar(true) | Scalar(true), Scalar(true));
|
||||
/// assert_eq!(Scalar(true) | Scalar(false), Scalar(true));
|
||||
/// assert_eq!(Scalar(false) | Scalar(true), Scalar(true));
|
||||
/// assert_eq!(Scalar(false) | Scalar(false), Scalar(false));
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// In this example, the `BitOr` trait is implemented for a `BooleanVector`
|
||||
/// struct.
|
||||
///
|
||||
/// ```
|
||||
/// use std::ops::BitOr;
|
||||
///
|
||||
/// #[derive(Debug, PartialEq)]
|
||||
/// struct BooleanVector(Vec<bool>);
|
||||
///
|
||||
/// impl BitOr for BooleanVector {
|
||||
/// type Output = Self;
|
||||
///
|
||||
/// fn bitor(self, BooleanVector(rhs): Self) -> Self {
|
||||
/// let BooleanVector(lhs) = self;
|
||||
/// assert_eq!(lhs.len(), rhs.len());
|
||||
/// BooleanVector(lhs.iter().zip(rhs.iter()).map(|(x, y)| *x || *y).collect())
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let bv1 = BooleanVector(vec![true, true, false, false]);
|
||||
/// let bv2 = BooleanVector(vec![true, false, true, false]);
|
||||
/// let expected = BooleanVector(vec![true, true, true, false]);
|
||||
/// assert_eq!(bv1 | bv2, expected);
|
||||
/// }
|
||||
/// ```
|
||||
#[lang = "bitor"]
|
||||
@ -1001,25 +1031,58 @@ bitor_impl! { bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 }
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// A trivial implementation of `BitXor`. When `Foo ^ Foo` happens, it ends up
|
||||
/// calling `bitxor`, and therefore, `main` prints `Bitwise Xor-ing!`.
|
||||
/// In this example, the `^` operator is lifted to a trivial `Scalar` type.
|
||||
///
|
||||
/// ```
|
||||
/// use std::ops::BitXor;
|
||||
///
|
||||
/// struct Foo;
|
||||
/// #[derive(Debug, PartialEq)]
|
||||
/// struct Scalar(bool);
|
||||
///
|
||||
/// impl BitXor for Foo {
|
||||
/// type Output = Foo;
|
||||
/// impl BitXor for Scalar {
|
||||
/// type Output = Self;
|
||||
///
|
||||
/// fn bitxor(self, _rhs: Foo) -> Foo {
|
||||
/// println!("Bitwise Xor-ing!");
|
||||
/// self
|
||||
/// // rhs is the "right-hand side" of the expression `a ^ b`
|
||||
/// fn bitxor(self, rhs: Self) -> Self {
|
||||
/// Scalar(self.0 ^ rhs.0)
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// Foo ^ Foo;
|
||||
/// assert_eq!(Scalar(true) ^ Scalar(true), Scalar(false));
|
||||
/// assert_eq!(Scalar(true) ^ Scalar(false), Scalar(true));
|
||||
/// assert_eq!(Scalar(false) ^ Scalar(true), Scalar(true));
|
||||
/// assert_eq!(Scalar(false) ^ Scalar(false), Scalar(false));
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// In this example, the `BitXor` trait is implemented for a `BooleanVector`
|
||||
/// struct.
|
||||
///
|
||||
/// ```
|
||||
/// use std::ops::BitXor;
|
||||
///
|
||||
/// #[derive(Debug, PartialEq)]
|
||||
/// struct BooleanVector(Vec<bool>);
|
||||
///
|
||||
/// impl BitXor for BooleanVector {
|
||||
/// type Output = Self;
|
||||
///
|
||||
/// fn bitxor(self, BooleanVector(rhs): Self) -> Self {
|
||||
/// let BooleanVector(lhs) = self;
|
||||
/// assert_eq!(lhs.len(), rhs.len());
|
||||
/// BooleanVector(lhs.iter()
|
||||
/// .zip(rhs.iter())
|
||||
/// .map(|(x, y)| (*x || *y) && !(*x && *y))
|
||||
/// .collect())
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let bv1 = BooleanVector(vec![true, true, false, false]);
|
||||
/// let bv2 = BooleanVector(vec![true, false, true, false]);
|
||||
/// let expected = BooleanVector(vec![false, true, true, false]);
|
||||
/// assert_eq!(bv1 ^ bv2, expected);
|
||||
/// }
|
||||
/// ```
|
||||
#[lang = "bitxor"]
|
||||
|
@ -126,7 +126,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
|
||||
idstack: Vec::new(),
|
||||
}
|
||||
}
|
||||
fn with_item_id_pushed<F>(&mut self, id: ast::NodeId, f: F)
|
||||
fn with_item_id_pushed<F>(&mut self, id: ast::NodeId, f: F, span: Span)
|
||||
where F: Fn(&mut Self)
|
||||
{
|
||||
if self.idstack.iter().any(|&x| x == id) {
|
||||
@ -150,7 +150,9 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
|
||||
"recursive static");
|
||||
}
|
||||
} else {
|
||||
span_err!(self.sess, *self.root_span, E0265, "recursive constant");
|
||||
struct_span_err!(self.sess, span, E0265, "recursive constant")
|
||||
.span_label(span, &format!("recursion not allowed in constant"))
|
||||
.emit();
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -203,7 +205,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> {
|
||||
|
||||
impl<'a, 'ast: 'a> Visitor<'ast> for CheckItemRecursionVisitor<'a, 'ast> {
|
||||
fn visit_item(&mut self, it: &'ast hir::Item) {
|
||||
self.with_item_id_pushed(it.id, |v| intravisit::walk_item(v, it));
|
||||
self.with_item_id_pushed(it.id, |v| intravisit::walk_item(v, it), it.span);
|
||||
}
|
||||
|
||||
fn visit_enum_def(&mut self,
|
||||
@ -233,16 +235,16 @@ impl<'a, 'ast: 'a> Visitor<'ast> for CheckItemRecursionVisitor<'a, 'ast> {
|
||||
// If `maybe_expr` is `None`, that's because no discriminant is
|
||||
// specified that affects this variant. Thus, no risk of recursion.
|
||||
if let Some(expr) = maybe_expr {
|
||||
self.with_item_id_pushed(expr.id, |v| intravisit::walk_expr(v, expr));
|
||||
self.with_item_id_pushed(expr.id, |v| intravisit::walk_expr(v, expr), expr.span);
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_trait_item(&mut self, ti: &'ast hir::TraitItem) {
|
||||
self.with_item_id_pushed(ti.id, |v| intravisit::walk_trait_item(v, ti));
|
||||
self.with_item_id_pushed(ti.id, |v| intravisit::walk_trait_item(v, ti), ti.span);
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, ii: &'ast hir::ImplItem) {
|
||||
self.with_item_id_pushed(ii.id, |v| intravisit::walk_impl_item(v, ii));
|
||||
self.with_item_id_pushed(ii.id, |v| intravisit::walk_impl_item(v, ii), ii.span);
|
||||
}
|
||||
|
||||
fn visit_expr(&mut self, e: &'ast hir::Expr) {
|
||||
|
@ -1270,7 +1270,42 @@ trait Foo {}
|
||||
|
||||
impl Foo for i32 {}
|
||||
```
|
||||
"##
|
||||
"##,
|
||||
|
||||
E0530: r##"
|
||||
A binding shadowed something it shouldn't.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0530
|
||||
static TEST: i32 = 0;
|
||||
|
||||
let r: (i32, i32) = (0, 0);
|
||||
match r {
|
||||
TEST => {} // error: match bindings cannot shadow statics
|
||||
}
|
||||
```
|
||||
|
||||
To fix this error, just change the binding's name in order to avoid shadowing
|
||||
one of the following:
|
||||
|
||||
* struct name
|
||||
* struct/enum variant
|
||||
* static
|
||||
* const
|
||||
* associated const
|
||||
|
||||
Fixed example:
|
||||
|
||||
```
|
||||
static TEST: i32 = 0;
|
||||
|
||||
let r: (i32, i32) = (0, 0);
|
||||
match r {
|
||||
something => {} // ok!
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
}
|
||||
|
||||
@ -1289,7 +1324,6 @@ register_diagnostics! {
|
||||
// E0419, merged into 531
|
||||
// E0420, merged into 532
|
||||
// E0421, merged into 531
|
||||
E0530, // X bindings cannot shadow Ys
|
||||
E0531, // unresolved pattern path kind `name`
|
||||
E0532, // expected pattern path kind, found another pattern path kind
|
||||
// E0427, merged into 530
|
||||
|
@ -242,6 +242,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||
MethodError::Ambiguity(sources) => {
|
||||
let mut err = struct_span_err!(self.sess(), span, E0034,
|
||||
"multiple applicable items in scope");
|
||||
err.span_label(span, &format!("multiple `{}` found", item_name));
|
||||
|
||||
report_candidates(&mut err, sources);
|
||||
err.emit();
|
||||
|
@ -903,14 +903,18 @@ fn report_forbidden_specialization<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
{
|
||||
let mut err = struct_span_err!(
|
||||
tcx.sess, impl_item.span, E0520,
|
||||
"item `{}` is provided by an `impl` that specializes \
|
||||
another, but the item in the parent `impl` is not \
|
||||
marked `default` and so it cannot be specialized.",
|
||||
"`{}` specializes an item from a parent `impl`, but \
|
||||
neither that item nor the `impl` are marked `default`",
|
||||
impl_item.name);
|
||||
err.span_label(impl_item.span, &format!("cannot specialize default item `{}`",
|
||||
impl_item.name));
|
||||
|
||||
match tcx.span_of_impl(parent_impl) {
|
||||
Ok(span) => {
|
||||
err.span_note(span, "parent implementation is here:");
|
||||
err.span_label(span, &"parent `impl` is here");
|
||||
err.note(&format!("to specialize, either the parent `impl` or `{}` \
|
||||
in the parent `impl` must be marked `default`",
|
||||
impl_item.name));
|
||||
}
|
||||
Err(cname) => {
|
||||
err.note(&format!("parent implementation is in crate `{}`", cname));
|
||||
@ -1204,7 +1208,9 @@ pub fn check_simd<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, sp: Span, id: ast::Node
|
||||
}
|
||||
let e = fields[0].ty(tcx, substs);
|
||||
if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
|
||||
span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous");
|
||||
struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
|
||||
.span_label(sp, &format!("SIMD elements must have the same type"))
|
||||
.emit();
|
||||
return;
|
||||
}
|
||||
match e.sty {
|
||||
|
@ -16,7 +16,7 @@ use middle::region::{CodeExtent};
|
||||
use rustc::infer::TypeOrigin;
|
||||
use rustc::traits;
|
||||
use rustc::ty::{self, Ty, TyCtxt};
|
||||
use rustc::util::nodemap::FnvHashSet;
|
||||
use rustc::util::nodemap::{FnvHashSet, FnvHashMap};
|
||||
|
||||
use syntax::ast;
|
||||
use syntax_pos::Span;
|
||||
@ -519,11 +519,26 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
|
||||
|
||||
fn reject_shadowing_type_parameters(tcx: TyCtxt, span: Span, generics: &ty::Generics) {
|
||||
let parent = tcx.lookup_generics(generics.parent.unwrap());
|
||||
let impl_params: FnvHashSet<_> = parent.types.iter().map(|tp| tp.name).collect();
|
||||
let impl_params: FnvHashMap<_, _> = parent.types
|
||||
.iter()
|
||||
.map(|tp| (tp.name, tp.def_id))
|
||||
.collect();
|
||||
|
||||
for method_param in &generics.types {
|
||||
if impl_params.contains(&method_param.name) {
|
||||
error_194(tcx, span, method_param.name);
|
||||
if impl_params.contains_key(&method_param.name) {
|
||||
// Tighten up the span to focus on only the shadowing type
|
||||
let shadow_node_id = tcx.map.as_local_node_id(method_param.def_id).unwrap();
|
||||
let type_span = match tcx.map.opt_span(shadow_node_id) {
|
||||
Some(osp) => osp,
|
||||
None => span
|
||||
};
|
||||
|
||||
// The expectation here is that the original trait declaration is
|
||||
// local so it should be okay to just unwrap everything.
|
||||
let trait_def_id = impl_params.get(&method_param.name).unwrap();
|
||||
let trait_node_id = tcx.map.as_local_node_id(*trait_def_id).unwrap();
|
||||
let trait_decl_span = tcx.map.opt_span(trait_node_id).unwrap();
|
||||
error_194(tcx, type_span, trait_decl_span, method_param.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -630,10 +645,11 @@ fn error_392<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, span: Span, param_name: ast::N
|
||||
err
|
||||
}
|
||||
|
||||
fn error_194(tcx: TyCtxt, span: Span, name: ast::Name) {
|
||||
fn error_194(tcx: TyCtxt, span: Span, trait_decl_span: Span, name: ast::Name) {
|
||||
struct_span_err!(tcx.sess, span, E0194,
|
||||
"type parameter `{}` shadows another type parameter of the same name",
|
||||
name)
|
||||
.span_label(span, &format!("`{}` shadows another type parameter", name))
|
||||
.span_label(span, &format!("shadows another type parameter"))
|
||||
.span_label(trait_decl_span, &format!("first `{}` declared here", name))
|
||||
.emit();
|
||||
}
|
||||
|
@ -347,15 +347,19 @@ impl<'cx, 'tcx> OrphanChecker<'cx, 'tcx> {
|
||||
return;
|
||||
}
|
||||
}
|
||||
hir::ItemDefaultImpl(..) => {
|
||||
hir::ItemDefaultImpl(_, ref item_trait_ref) => {
|
||||
// "Trait" impl
|
||||
debug!("coherence2::orphan check: default trait impl {}",
|
||||
self.tcx.map.node_to_string(item.id));
|
||||
let trait_ref = self.tcx.impl_trait_ref(def_id).unwrap();
|
||||
if trait_ref.def_id.krate != LOCAL_CRATE {
|
||||
span_err!(self.tcx.sess, item.span, E0318,
|
||||
struct_span_err!(self.tcx.sess, item_trait_ref.path.span, E0318,
|
||||
"cannot create default implementations for traits outside the \
|
||||
crate they're defined in; define a new trait instead");
|
||||
crate they're defined in; define a new trait instead")
|
||||
.span_label(item_trait_ref.path.span,
|
||||
&format!("`{}` trait not defined in this crate",
|
||||
item_trait_ref.path))
|
||||
.emit();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -45,7 +45,6 @@ pub struct TcpStream(net_imp::TcpStream);
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::net::{TcpListener, TcpStream};
|
||||
/// use std::thread;
|
||||
///
|
||||
/// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
|
||||
///
|
||||
@ -57,17 +56,11 @@ pub struct TcpStream(net_imp::TcpStream);
|
||||
/// for stream in listener.incoming() {
|
||||
/// match stream {
|
||||
/// Ok(stream) => {
|
||||
/// thread::spawn(move|| {
|
||||
/// // connection succeeded
|
||||
/// handle_client(stream)
|
||||
/// });
|
||||
/// handle_client(stream);
|
||||
/// }
|
||||
/// Err(e) => { /* connection failed */ }
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// // close the socket server
|
||||
/// drop(listener);
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct TcpListener(net_imp::TcpListener);
|
||||
|
@ -639,6 +639,25 @@ pub struct Iter<'a> {
|
||||
inner: Components<'a>,
|
||||
}
|
||||
|
||||
#[stable(feature = "path_components_debug", since = "1.13.0")]
|
||||
impl<'a> fmt::Debug for Components<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
struct DebugHelper<'a>(&'a Path);
|
||||
|
||||
impl<'a> fmt::Debug for DebugHelper<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_list()
|
||||
.entries(self.0.components())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
f.debug_tuple("Components")
|
||||
.field(&DebugHelper(self.as_path()))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Components<'a> {
|
||||
// how long is the prefix, if any?
|
||||
#[inline]
|
||||
@ -818,6 +837,25 @@ impl<'a> AsRef<OsStr> for Components<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "path_iter_debug", since = "1.13.0")]
|
||||
impl<'a> fmt::Debug for Iter<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
struct DebugHelper<'a>(&'a Path);
|
||||
|
||||
impl<'a> fmt::Debug for DebugHelper<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_list()
|
||||
.entries(self.0.iter())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
f.debug_tuple("Iter")
|
||||
.field(&DebugHelper(self.as_path()))
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Iter<'a> {
|
||||
/// Extracts a slice corresponding to the portion of the path remaining for iteration.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -3483,4 +3521,47 @@ mod tests {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_components_debug() {
|
||||
let path = Path::new("/tmp");
|
||||
|
||||
let mut components = path.components();
|
||||
|
||||
let expected = "Components([RootDir, Normal(\"tmp\")])";
|
||||
let actual = format!("{:?}", components);
|
||||
assert_eq!(expected, actual);
|
||||
|
||||
let _ = components.next().unwrap();
|
||||
let expected = "Components([Normal(\"tmp\")])";
|
||||
let actual = format!("{:?}", components);
|
||||
assert_eq!(expected, actual);
|
||||
|
||||
let _ = components.next().unwrap();
|
||||
let expected = "Components([])";
|
||||
let actual = format!("{:?}", components);
|
||||
assert_eq!(expected, actual);
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
#[test]
|
||||
fn test_iter_debug() {
|
||||
let path = Path::new("/tmp");
|
||||
|
||||
let mut iter = path.iter();
|
||||
|
||||
let expected = "Iter([\"/\", \"tmp\"])";
|
||||
let actual = format!("{:?}", iter);
|
||||
assert_eq!(expected, actual);
|
||||
|
||||
let _ = iter.next().unwrap();
|
||||
let expected = "Iter([\"tmp\"])";
|
||||
let actual = format!("{:?}", iter);
|
||||
assert_eq!(expected, actual);
|
||||
|
||||
let _ = iter.next().unwrap();
|
||||
let expected = "Iter([])";
|
||||
let actual = format!("{:?}", iter);
|
||||
assert_eq!(expected, actual);
|
||||
}
|
||||
}
|
||||
|
@ -18,9 +18,17 @@ trait Trait2 {
|
||||
fn foo();
|
||||
}
|
||||
|
||||
impl Trait1 for Test { fn foo() {} }
|
||||
impl Trait2 for Test { fn foo() {} }
|
||||
impl Trait1 for Test {
|
||||
fn foo() {}
|
||||
//~^ NOTE candidate #1 is defined in an impl of the trait `Trait1` for the type `Test`
|
||||
}
|
||||
|
||||
impl Trait2 for Test {
|
||||
fn foo() {}
|
||||
//~^ NOTE candidate #2 is defined in an impl of the trait `Trait2` for the type `Test`
|
||||
}
|
||||
|
||||
fn main() {
|
||||
Test::foo() //~ ERROR E0034
|
||||
Test::foo() //~ ERROR multiple applicable items in scope
|
||||
//~| NOTE multiple `foo` found
|
||||
}
|
||||
|
@ -11,7 +11,9 @@
|
||||
#![feature(repr_simd)]
|
||||
|
||||
#[repr(simd)]
|
||||
struct Bad(u16, u32, u32); //~ ERROR E0076
|
||||
struct Bad(u16, u32, u32);
|
||||
//~^ ERROR E0076
|
||||
//~| NOTE SIMD elements must have the same type
|
||||
|
||||
fn main() {
|
||||
}
|
||||
|
@ -8,11 +8,11 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
trait Foo<T> {
|
||||
trait Foo<T> { //~ NOTE first `T` declared here
|
||||
fn do_something(&self) -> T;
|
||||
fn do_something_else<T: Clone>(&self, bar: T);
|
||||
//~^ ERROR E0194
|
||||
//~| NOTE `T` shadows another type parameter
|
||||
//~| NOTE shadows another type parameter
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -19,11 +19,15 @@ impl<T> SpaceLlama for T {
|
||||
}
|
||||
|
||||
impl<T: Clone> SpaceLlama for T {
|
||||
//~^ NOTE parent `impl` is here
|
||||
fn fly(&self) {}
|
||||
}
|
||||
|
||||
impl SpaceLlama for i32 {
|
||||
default fn fly(&self) {} //~ ERROR E0520
|
||||
default fn fly(&self) {}
|
||||
//~^ ERROR E0520
|
||||
//~| NOTE cannot specialize default item `fly`
|
||||
//~| NOTE either the parent `impl` or `fly` in the parent `impl` must be marked `default`
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
19
src/test/compile-fail/E0528.rs
Normal file
19
src/test/compile-fail/E0528.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(slice_patterns)]
|
||||
|
||||
fn main() {
|
||||
let r = &[1, 2];
|
||||
match r {
|
||||
&[a, b, c, rest..] => { //~ ERROR E0528
|
||||
}
|
||||
}
|
||||
}
|
19
src/test/compile-fail/E0529.rs
Normal file
19
src/test/compile-fail/E0529.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(slice_patterns)]
|
||||
|
||||
fn main() {
|
||||
let r: f32 = 1.0;
|
||||
match r {
|
||||
[a, b] => { //~ ERROR E0529
|
||||
}
|
||||
}
|
||||
}
|
18
src/test/compile-fail/E0530.rs
Normal file
18
src/test/compile-fail/E0530.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
fn main() {
|
||||
static TEST: i32 = 0;
|
||||
|
||||
let r: (i32, i32) = (0, 0);
|
||||
match r {
|
||||
TEST => {} //~ ERROR E0530
|
||||
}
|
||||
}
|
14
src/test/compile-fail/E0534.rs
Normal file
14
src/test/compile-fail/E0534.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[inline()] //~ ERROR E0534
|
||||
pub fn something() {}
|
||||
|
||||
fn main() {}
|
14
src/test/compile-fail/E0535.rs
Normal file
14
src/test/compile-fail/E0535.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[inline(unknown)] //~ ERROR E0535
|
||||
pub fn something() {}
|
||||
|
||||
fn main() {}
|
14
src/test/compile-fail/E0536.rs
Normal file
14
src/test/compile-fail/E0536.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[cfg(not())] //~ ERROR E0536
|
||||
pub fn something() {}
|
||||
|
||||
pub fn main() {}
|
14
src/test/compile-fail/E0537.rs
Normal file
14
src/test/compile-fail/E0537.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[cfg(unknown())] //~ ERROR E0537
|
||||
pub fn something() {}
|
||||
|
||||
pub fn main() {}
|
14
src/test/compile-fail/E0558.rs
Normal file
14
src/test/compile-fail/E0558.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[export_name] //~ ERROR E0558
|
||||
pub fn something() {}
|
||||
|
||||
fn main() {}
|
17
src/test/compile-fail/E0559.rs
Normal file
17
src/test/compile-fail/E0559.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
enum Field {
|
||||
Fool { x: u32 },
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let s = Field::Fool { joke: 0 }; //~ ERROR E0559
|
||||
}
|
17
src/test/compile-fail/E560.rs
Normal file
17
src/test/compile-fail/E560.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
struct Simba {
|
||||
mother: u32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let s = Simba { mother: 1, father: 0 }; //~ ERROR E0560
|
||||
}
|
@ -12,13 +12,21 @@
|
||||
// the appropriate error (rather than, say, blowing the stack).
|
||||
enum X {
|
||||
A = X::A as isize, //~ ERROR E0265
|
||||
//~^ NOTE recursion not allowed in constant
|
||||
}
|
||||
|
||||
// Since `Y::B` here defaults to `Y::A+1`, this is also a
|
||||
// recursive definition.
|
||||
enum Y {
|
||||
A = Y::B as isize, //~ ERROR E0265
|
||||
//~^ NOTE recursion not allowed in constant
|
||||
B,
|
||||
}
|
||||
|
||||
const A: i32 = B; //~ ERROR E0265
|
||||
//~^ NOTE recursion not allowed in constant
|
||||
|
||||
const B: i32 = A; //~ ERROR E0265
|
||||
//~^ NOTE recursion not allowed in constant
|
||||
|
||||
fn main() { }
|
||||
|
27
src/test/compile-fail/issue-24204.rs
Normal file
27
src/test/compile-fail/issue-24204.rs
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![allow(dead_code)]
|
||||
|
||||
trait MultiDispatch<T> {
|
||||
type O;
|
||||
}
|
||||
|
||||
trait Trait: Sized {
|
||||
type A: MultiDispatch<Self::B, O = Self>;
|
||||
type B;
|
||||
|
||||
fn new<U>(u: U) -> <Self::A as MultiDispatch<U>>::O where Self::A : MultiDispatch<U>;
|
||||
}
|
||||
|
||||
fn test<T: Trait<B=i32>>(b: i32) -> T where T::A: MultiDispatch<i32> { T::new(b) }
|
||||
//~^ ERROR type mismatch resolving
|
||||
|
||||
fn main() {}
|
@ -10,7 +10,6 @@
|
||||
|
||||
#![feature(optin_builtin_traits)]
|
||||
|
||||
impl Copy for .. {}
|
||||
//~^ ERROR E0318
|
||||
|
||||
impl Copy for .. {} //~ ERROR E0318
|
||||
//~^ NOTE `Copy` trait not defined in this crate
|
||||
fn main() {}
|
||||
|
43
src/test/run-pass/issue-14875.rs
Normal file
43
src/test/run-pass/issue-14875.rs
Normal file
@ -0,0 +1,43 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// Check that values are not leaked when a dtor panics (#14875)
|
||||
|
||||
use std::panic::{self, UnwindSafe};
|
||||
|
||||
struct SetInnerOnDrop<'a>(&'a mut bool);
|
||||
|
||||
impl<'a> UnwindSafe for SetInnerOnDrop<'a> {}
|
||||
|
||||
impl<'a> Drop for SetInnerOnDrop<'a> {
|
||||
fn drop(&mut self) {
|
||||
*self.0 = true;
|
||||
}
|
||||
}
|
||||
|
||||
struct PanicOnDrop;
|
||||
impl Drop for PanicOnDrop {
|
||||
fn drop(&mut self) {
|
||||
panic!("test panic");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn main() {
|
||||
let mut set_on_drop = false;
|
||||
{
|
||||
let set_inner_on_drop = SetInnerOnDrop(&mut set_on_drop);
|
||||
let _ = panic::catch_unwind(|| {
|
||||
let _set_inner_on_drop = set_inner_on_drop;
|
||||
let _panic_on_drop = PanicOnDrop;
|
||||
});
|
||||
}
|
||||
assert!(set_on_drop);
|
||||
}
|
23
src/test/run-pass/issue-34053.rs
Normal file
23
src/test/run-pass/issue-34053.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright 2016 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![feature(drop_types_in_const)]
|
||||
|
||||
struct A(i32);
|
||||
|
||||
impl Drop for A {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
static FOO: A = A(123);
|
||||
|
||||
fn main() {
|
||||
println!("{}", &FOO.0);
|
||||
}
|
@ -61,9 +61,9 @@ fn write_toc(book: &Book, current_page: &BookItem, out: &mut Write) -> io::Resul
|
||||
section,
|
||||
item.title)?;
|
||||
if !item.children.is_empty() {
|
||||
writeln!(out, "<ul class='section'>")?;
|
||||
writeln!(out, "<ol class='section'>")?;
|
||||
let _ = walk_items(&item.children[..], section, current_page, out);
|
||||
writeln!(out, "</ul>")?;
|
||||
writeln!(out, "</ol>")?;
|
||||
}
|
||||
writeln!(out, "</li>")?;
|
||||
|
||||
@ -71,9 +71,9 @@ fn write_toc(book: &Book, current_page: &BookItem, out: &mut Write) -> io::Resul
|
||||
}
|
||||
|
||||
writeln!(out, "<div id='toc' class='mobile-hidden'>")?;
|
||||
writeln!(out, "<ul class='chapter'>")?;
|
||||
writeln!(out, "<ol class='chapter'>")?;
|
||||
walk_items(&book.chapters[..], "", ¤t_page, out)?;
|
||||
writeln!(out, "</ul>")?;
|
||||
writeln!(out, "</ol>")?;
|
||||
writeln!(out, "</div>")?;
|
||||
|
||||
Ok(())
|
||||
|
Loading…
x
Reference in New Issue
Block a user