mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #48294 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 8 pull requests - Successful merges: #48095, #48152, #48234, #48239, #48243, #48260, #48284, #48286 - Failed merges:
This commit is contained in:
commit
f6216b2d55
@ -231,9 +231,9 @@ use Bound::{Excluded, Included, Unbounded};
|
||||
///
|
||||
/// If a `Vec` *has* allocated memory, then the memory it points to is on the heap
|
||||
/// (as defined by the allocator Rust is configured to use by default), and its
|
||||
/// pointer points to [`len`] initialized elements in order (what you would see
|
||||
/// if you coerced it to a slice), followed by [`capacity`]` - `[`len`]
|
||||
/// logically uninitialized elements.
|
||||
/// pointer points to [`len`] initialized, contiguous elements in order (what
|
||||
/// you would see if you coerced it to a slice), followed by [`capacity`]` -
|
||||
/// `[`len`] logically uninitialized, contiguous elements.
|
||||
///
|
||||
/// `Vec` will never perform a "small optimization" where elements are actually
|
||||
/// stored on the stack for two reasons:
|
||||
@ -281,8 +281,8 @@ use Bound::{Excluded, Included, Unbounded};
|
||||
/// not break, however: using `unsafe` code to write to the excess capacity,
|
||||
/// and then increasing the length to match, is always valid.
|
||||
///
|
||||
/// `Vec` does not currently guarantee the order in which elements are dropped
|
||||
/// (the order has changed in the past, and may change again).
|
||||
/// `Vec` does not currently guarantee the order in which elements are dropped.
|
||||
/// The order has changed in the past and may change again.
|
||||
///
|
||||
/// [`vec!`]: ../../std/macro.vec.html
|
||||
/// [`Index`]: ../../std/ops/trait.Index.html
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -324,7 +324,7 @@ unsafe impl<'a> Searcher<'a> for CharSearcher<'a> {
|
||||
// the second byte when searching for the third.
|
||||
//
|
||||
// However, this is totally okay. While we have the invariant that
|
||||
// self.finger is on a UTF8 boundary, this invariant is not relid upon
|
||||
// self.finger is on a UTF8 boundary, this invariant is not relied upon
|
||||
// within this method (it is relied upon in CharSearcher::next()).
|
||||
//
|
||||
// We only exit this method when we reach the end of the string, or if we
|
||||
|
@ -97,9 +97,10 @@ use fmt;
|
||||
/// Save power or switch hyperthreads in a busy-wait spin-loop.
|
||||
///
|
||||
/// This function is deliberately more primitive than
|
||||
/// `std::thread::yield_now` and does not directly yield to the
|
||||
/// system's scheduler. In some cases it might be useful to use a
|
||||
/// combination of both functions. Careful benchmarking is advised.
|
||||
/// [`std::thread::yield_now`](../../../std/thread/fn.yield_now.html) and
|
||||
/// does not directly yield to the system's scheduler.
|
||||
/// In some cases it might be useful to use a combination of both functions.
|
||||
/// Careful benchmarking is advised.
|
||||
///
|
||||
/// On some platforms this function may not do anything at all.
|
||||
#[inline]
|
||||
|
@ -345,6 +345,7 @@ pub fn make_test(s: &str,
|
||||
opts: &TestOptions)
|
||||
-> (String, usize) {
|
||||
let (crate_attrs, everything_else) = partition_source(s);
|
||||
let everything_else = everything_else.trim();
|
||||
let mut line_offset = 0;
|
||||
let mut prog = String::new();
|
||||
|
||||
@ -392,12 +393,11 @@ pub fn make_test(s: &str,
|
||||
.any(|code| code.contains("fn main"));
|
||||
|
||||
if dont_insert_main || already_has_main {
|
||||
prog.push_str(&everything_else);
|
||||
prog.push_str(everything_else);
|
||||
} else {
|
||||
prog.push_str("fn main() {\n");
|
||||
line_offset += 1;
|
||||
prog.push_str(&everything_else);
|
||||
prog = prog.trim().into();
|
||||
prog.push_str(everything_else);
|
||||
prog.push_str("\n}");
|
||||
}
|
||||
|
||||
@ -753,3 +753,217 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirCollector<'a, 'hir> {
|
||||
self.visit_testable(macro_def.name.to_string(), ¯o_def.attrs, |_| ());
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{TestOptions, make_test};
|
||||
|
||||
#[test]
|
||||
fn make_test_basic() {
|
||||
//basic use: wraps with `fn main`, adds `#![allow(unused)]`
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, None, false, &opts);
|
||||
assert_eq!(output, (expected.clone(), 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_crate_name_no_use() {
|
||||
//if you give a crate name but *don't* use it within the test, it won't bother inserting
|
||||
//the `extern crate` statement
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_crate_name() {
|
||||
//if you give a crate name and use it within the test, it will insert an `extern crate`
|
||||
//statement before `fn main`
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"use asdf::qwop;
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
extern crate asdf;
|
||||
fn main() {
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 3));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_no_crate_inject() {
|
||||
//even if you do use the crate within the test, setting `opts.no_crate_inject` will skip
|
||||
//adding it anyway
|
||||
let opts = TestOptions {
|
||||
no_crate_inject: true,
|
||||
attrs: vec![],
|
||||
};
|
||||
let input =
|
||||
"use asdf::qwop;
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_ignore_std() {
|
||||
//even if you include a crate name, and use it in the doctest, we still won't include an
|
||||
//`extern crate` statement if the crate is "std" - that's included already by the compiler!
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"use std::*;
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
use std::*;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("std"), false, &opts);
|
||||
assert_eq!(output, (expected, 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_manual_extern_crate() {
|
||||
//when you manually include an `extern crate` statement in your doctest, make_test assumes
|
||||
//you've included one for your own crate too
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"extern crate asdf;
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
extern crate asdf;
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_opts_attrs() {
|
||||
//if you supplied some doctest attributes with #![doc(test(attr(...)))], it will use those
|
||||
//instead of the stock #![allow(unused)]
|
||||
let mut opts = TestOptions::default();
|
||||
opts.attrs.push("feature(sick_rad)".to_string());
|
||||
let input =
|
||||
"use asdf::qwop;
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![feature(sick_rad)]
|
||||
extern crate asdf;
|
||||
fn main() {
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 3));
|
||||
|
||||
//adding more will also bump the returned line offset
|
||||
opts.attrs.push("feature(hella_dope)".to_string());
|
||||
let expected =
|
||||
"#![feature(sick_rad)]
|
||||
#![feature(hella_dope)]
|
||||
extern crate asdf;
|
||||
fn main() {
|
||||
use asdf::qwop;
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, Some("asdf"), false, &opts);
|
||||
assert_eq!(output, (expected, 4));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_crate_attrs() {
|
||||
//including inner attributes in your doctest will apply them to the whole "crate", pasting
|
||||
//them outside the generated main function
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"#![feature(sick_rad)]
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
#![feature(sick_rad)]
|
||||
fn main() {
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, None, false, &opts);
|
||||
assert_eq!(output, (expected, 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_with_main() {
|
||||
//including your own `fn main` wrapper lets the test use it verbatim
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"fn main() {
|
||||
assert_eq!(2+2, 4);
|
||||
}";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, None, false, &opts);
|
||||
assert_eq!(output, (expected, 1));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_fake_main() {
|
||||
//...but putting it in a comment will still provide a wrapper
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"//Ceci n'est pas une `fn main`
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
fn main() {
|
||||
//Ceci n'est pas une `fn main`
|
||||
assert_eq!(2+2, 4);
|
||||
}".to_string();
|
||||
let output = make_test(input, None, false, &opts);
|
||||
assert_eq!(output, (expected.clone(), 2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn make_test_dont_insert_main() {
|
||||
//even with that, if you set `dont_insert_main`, it won't create the `fn main` wrapper
|
||||
let opts = TestOptions::default();
|
||||
let input =
|
||||
"//Ceci n'est pas une `fn main`
|
||||
assert_eq!(2+2, 4);";
|
||||
let expected =
|
||||
"#![allow(unused)]
|
||||
//Ceci n'est pas une `fn main`
|
||||
assert_eq!(2+2, 4);".to_string();
|
||||
let output = make_test(input, None, true, &opts);
|
||||
assert_eq!(output, (expected.clone(), 1));
|
||||
}
|
||||
}
|
||||
|
@ -1437,8 +1437,6 @@ pub trait BufRead: Read {
|
||||
///
|
||||
/// If successful, this function will return the total number of bytes read.
|
||||
///
|
||||
/// An empty buffer returned indicates that the stream has reached EOF.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will ignore all instances of [`ErrorKind::Interrupted`] and
|
||||
|
@ -720,10 +720,6 @@ mod prim_f64 { }
|
||||
/// The 8-bit signed integer type.
|
||||
///
|
||||
/// *[See also the `std::i8` module](i8/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `i64` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_i8 { }
|
||||
|
||||
@ -732,10 +728,6 @@ mod prim_i8 { }
|
||||
/// The 16-bit signed integer type.
|
||||
///
|
||||
/// *[See also the `std::i16` module](i16/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `i32` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_i16 { }
|
||||
|
||||
@ -744,10 +736,6 @@ mod prim_i16 { }
|
||||
/// The 32-bit signed integer type.
|
||||
///
|
||||
/// *[See also the `std::i32` module](i32/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `i16` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_i32 { }
|
||||
|
||||
@ -756,10 +744,6 @@ mod prim_i32 { }
|
||||
/// The 64-bit signed integer type.
|
||||
///
|
||||
/// *[See also the `std::i64` module](i64/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `i8` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_i64 { }
|
||||
|
||||
@ -768,10 +752,6 @@ mod prim_i64 { }
|
||||
/// The 128-bit signed integer type.
|
||||
///
|
||||
/// *[See also the `std::i128` module](i128/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `i8` in there.
|
||||
///
|
||||
#[unstable(feature = "i128", issue="35118")]
|
||||
mod prim_i128 { }
|
||||
|
||||
@ -780,10 +760,6 @@ mod prim_i128 { }
|
||||
/// The 8-bit unsigned integer type.
|
||||
///
|
||||
/// *[See also the `std::u8` module](u8/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `u64` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_u8 { }
|
||||
|
||||
@ -792,10 +768,6 @@ mod prim_u8 { }
|
||||
/// The 16-bit unsigned integer type.
|
||||
///
|
||||
/// *[See also the `std::u16` module](u16/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `u32` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_u16 { }
|
||||
|
||||
@ -804,10 +776,6 @@ mod prim_u16 { }
|
||||
/// The 32-bit unsigned integer type.
|
||||
///
|
||||
/// *[See also the `std::u32` module](u32/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `u16` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_u32 { }
|
||||
|
||||
@ -816,10 +784,6 @@ mod prim_u32 { }
|
||||
/// The 64-bit unsigned integer type.
|
||||
///
|
||||
/// *[See also the `std::u64` module](u64/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `u8` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_u64 { }
|
||||
|
||||
@ -828,10 +792,6 @@ mod prim_u64 { }
|
||||
/// The 128-bit unsigned integer type.
|
||||
///
|
||||
/// *[See also the `std::u128` module](u128/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `u8` in there.
|
||||
///
|
||||
#[unstable(feature = "i128", issue="35118")]
|
||||
mod prim_u128 { }
|
||||
|
||||
@ -844,10 +804,6 @@ mod prim_u128 { }
|
||||
/// and on a 64 bit target, this is 8 bytes.
|
||||
///
|
||||
/// *[See also the `std::isize` module](isize/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `usize` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_isize { }
|
||||
|
||||
@ -860,10 +816,6 @@ mod prim_isize { }
|
||||
/// and on a 64 bit target, this is 8 bytes.
|
||||
///
|
||||
/// *[See also the `std::usize` module](usize/index.html).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
/// types. So it's normal if you see usage of types like `isize` in there.
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
mod prim_usize { }
|
||||
|
||||
|
@ -47,11 +47,13 @@ impl WaitTimeoutResult {
|
||||
///
|
||||
/// thread::spawn(move|| {
|
||||
/// let &(ref lock, ref cvar) = &*pair2;
|
||||
///
|
||||
/// // Let's wait 20 milliseconds before notifying the condvar.
|
||||
/// thread::sleep(Duration::from_millis(20));
|
||||
///
|
||||
/// let mut started = lock.lock().unwrap();
|
||||
/// // We update the boolean value.
|
||||
/// *started = true;
|
||||
/// // Let's wait 20 milliseconds before notifying the condvar.
|
||||
/// thread::sleep(Duration::from_millis(20));
|
||||
/// cvar.notify_one();
|
||||
/// });
|
||||
///
|
||||
|
@ -317,10 +317,10 @@ impl CodeMap {
|
||||
|
||||
pub fn mk_substr_filename(&self, sp: Span) -> String {
|
||||
let pos = self.lookup_char_pos(sp.lo());
|
||||
(format!("<{}:{}:{}>",
|
||||
format!("<{}:{}:{}>",
|
||||
pos.file.name,
|
||||
pos.line,
|
||||
pos.col.to_usize() + 1)).to_string()
|
||||
pos.col.to_usize() + 1)
|
||||
}
|
||||
|
||||
// If there is a doctest_offset, apply it to the line
|
||||
@ -462,12 +462,12 @@ impl CodeMap {
|
||||
|
||||
let lo = self.lookup_char_pos_adj(sp.lo());
|
||||
let hi = self.lookup_char_pos_adj(sp.hi());
|
||||
return (format!("{}:{}:{}: {}:{}",
|
||||
format!("{}:{}:{}: {}:{}",
|
||||
lo.filename,
|
||||
lo.line,
|
||||
lo.col.to_usize() + 1,
|
||||
hi.line,
|
||||
hi.col.to_usize() + 1)).to_string()
|
||||
hi.col.to_usize() + 1)
|
||||
}
|
||||
|
||||
pub fn span_to_filename(&self, sp: Span) -> FileName {
|
||||
|
@ -34,6 +34,6 @@
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
// @matches foo/index.html '//a[@class="test-arrow"][@href="https://www.example.com/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0A%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%7D%0A"]' "Run"
|
||||
// @matches foo/index.html '//a[@class="test-arrow"][@href="https://www.example.com/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0A%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%7D"]' "Run"
|
||||
// @matches foo/index.html '//a[@class="test-arrow"][@href="https://www.example.com/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0Aprintln!(%22Hello%2C%20world!%22)%3B%0A%7D"]' "Run"
|
||||
// @matches foo/index.html '//a[@class="test-arrow"][@href="https://www.example.com/?code=%23!%5Ballow(unused)%5D%0A%23!%5Bfeature(something)%5D%0A%0Afn%20main()%20%7B%0A%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%7D%0A&version=nightly"]' "Run"
|
||||
// @matches foo/index.html '//a[@class="test-arrow"][@href="https://www.example.com/?code=%23!%5Ballow(unused)%5D%0A%23!%5Bfeature(something)%5D%0A%0Afn%20main()%20%7B%0A%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%7D&version=nightly"]' "Run"
|
||||
|
Loading…
Reference in New Issue
Block a user