mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #46130 - kennytm:rollup, r=kennytm
Rollup of 9 pull requests - Successful merges: #46082, #46088, #46092, #46107, #46119, #46121, #46122, #46124, #46128 - Failed merges:
This commit is contained in:
commit
1e44fee88d
@ -1328,7 +1328,7 @@ impl<T: ?Sized + fmt::Debug> fmt::Debug for Arc<T> {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: ?Sized> fmt::Pointer for Arc<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Pointer::fmt(&self.ptr, f)
|
||||
fmt::Pointer::fmt(&(&**self as *const T), f)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! Utilities for formatting and printing `String`s
|
||||
//! Utilities for formatting and printing `String`s.
|
||||
//!
|
||||
//! This module contains the runtime support for the [`format!`] syntax extension.
|
||||
//! This macro is implemented in the compiler to emit calls to this module in
|
||||
|
@ -1072,7 +1072,7 @@ impl<T: ?Sized + fmt::Debug> fmt::Debug for Rc<T> {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: ?Sized> fmt::Pointer for Rc<T> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Pointer::fmt(&self.ptr, f)
|
||||
fmt::Pointer::fmt(&(&**self as *const T), f)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1734,7 +1734,7 @@ impl str {
|
||||
/// A more complex pattern, using a closure:
|
||||
///
|
||||
/// ```
|
||||
/// assert_eq!("1fooX".trim_left_matches(|c| c == '1' || c == 'X'), "fooX");
|
||||
/// assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn trim_right_matches<'a, P: Pattern<'a>>(&'a self, pat: P) -> &'a str
|
||||
|
@ -361,7 +361,7 @@ macro_rules! try {
|
||||
})
|
||||
}
|
||||
|
||||
/// Write formatted data into a buffer
|
||||
/// Write formatted data into a buffer.
|
||||
///
|
||||
/// This macro accepts a format string, a list of arguments, and a 'writer'. Arguments will be
|
||||
/// formatted according to the specified format string and the result will be passed to the writer.
|
||||
|
@ -91,7 +91,7 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
|
||||
IllegalMoveOriginKind::Static =>
|
||||
tcx.cannot_move_out_of(span, "static item", origin),
|
||||
IllegalMoveOriginKind::BorrowedContent =>
|
||||
tcx.cannot_move_out_of(span, "borrowed_content", origin),
|
||||
tcx.cannot_move_out_of(span, "borrowed content", origin),
|
||||
IllegalMoveOriginKind::InteriorOfTypeWithDestructor { container_ty: ty } =>
|
||||
tcx.cannot_move_out_of_interior_of_drop(span, ty, origin),
|
||||
IllegalMoveOriginKind::InteriorOfSliceOrArray { ty, is_index } =>
|
||||
|
@ -9,8 +9,9 @@
|
||||
// except according to those terms.
|
||||
|
||||
//! This module provides constants which are specific to the implementation
|
||||
//! of the `f32` floating point data type. Mathematically significant
|
||||
//! numbers are provided in the `consts` sub-module.
|
||||
//! of the `f32` floating point data type.
|
||||
//!
|
||||
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||
//!
|
||||
//! *[See also the `f32` primitive type](../primitive.f32.html).*
|
||||
|
||||
|
@ -9,8 +9,9 @@
|
||||
// except according to those terms.
|
||||
|
||||
//! This module provides constants which are specific to the implementation
|
||||
//! of the `f64` floating point data type. Mathematically significant
|
||||
//! numbers are provided in the `consts` sub-module.
|
||||
//! of the `f64` floating point data type.
|
||||
//!
|
||||
//! Mathematically significant numbers are provided in the `consts` sub-module.
|
||||
//!
|
||||
//! *[See also the `f64` primitive type](../primitive.f64.html).*
|
||||
|
||||
|
@ -419,14 +419,8 @@ fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize>
|
||||
///
|
||||
/// [`File`]s implement `Read`:
|
||||
///
|
||||
/// [`read()`]: trait.Read.html#tymethod.read
|
||||
/// [`std::io`]: ../../std/io/index.html
|
||||
/// [`File`]: ../fs/struct.File.html
|
||||
/// [`BufRead`]: trait.BufRead.html
|
||||
/// [`BufReader`]: struct.BufReader.html
|
||||
///
|
||||
/// ```
|
||||
/// use std::io;
|
||||
/// # use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
@ -449,6 +443,32 @@ fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize>
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// Read from `&str` because [`&[u8]`] implements [`Read`]:
|
||||
///
|
||||
/// ```
|
||||
/// # use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut b = "This string will be read".as_bytes();
|
||||
/// let mut buffer = [0; 10];
|
||||
///
|
||||
/// // read up to 10 bytes
|
||||
/// b.read(&mut buffer)?;
|
||||
///
|
||||
/// // etc... it works exactly as a File does!
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// [`read()`]: trait.Read.html#tymethod.read
|
||||
/// [`std::io`]: ../../std/io/index.html
|
||||
/// [`File`]: ../fs/struct.File.html
|
||||
/// [`BufRead`]: trait.BufRead.html
|
||||
/// [`BufReader`]: struct.BufReader.html
|
||||
/// [`&[u8]`]: primitive.slice.html
|
||||
///
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub trait Read {
|
||||
/// Pull some bytes from this source into the specified buffer, returning
|
||||
|
@ -8,7 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
//! Panic support in the standard library
|
||||
//! Panic support in the standard library.
|
||||
|
||||
#![stable(feature = "std_panic", since = "1.9.0")]
|
||||
|
||||
|
@ -382,6 +382,17 @@ unsafe impl<#[may_dangle] T: ?Sized> Drop for Mutex<T> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "mutex_from", since = "1.22.0")]
|
||||
impl<T> From<T> for Mutex<T> {
|
||||
/// Creates a new mutex in an unlocked state ready for use.
|
||||
/// This is equivalent to [`Mutex::new`].
|
||||
///
|
||||
/// [`Mutex::new`]: #method.new
|
||||
fn from(t: T) -> Self {
|
||||
Mutex::new(t)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "mutex_default", since = "1.10.0")]
|
||||
impl<T: ?Sized + Default> Default for Mutex<T> {
|
||||
/// Creates a `Mutex<T>`, with the `Default` value for T.
|
||||
|
@ -457,6 +457,17 @@ impl<T: Default> Default for RwLock<T> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rw_lock_from", since = "1.22.0")]
|
||||
impl<T> From<T> for RwLock<T> {
|
||||
/// Creates a new instance of an `RwLock<T>` which is unlocked.
|
||||
/// This is equivalent to [`RwLock::new`].
|
||||
///
|
||||
/// [`RwLock::new`]: #method.new
|
||||
fn from(t: T) -> Self {
|
||||
RwLock::new(t)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'rwlock, T: ?Sized> RwLockReadGuard<'rwlock, T> {
|
||||
unsafe fn new(lock: &'rwlock RwLock<T>)
|
||||
-> LockResult<RwLockReadGuard<'rwlock, T>> {
|
||||
|
@ -213,3 +213,7 @@ pub fn exit(code: i32) -> ! {
|
||||
pub fn getpid() -> u32 {
|
||||
syscall::getpid().unwrap() as u32
|
||||
}
|
||||
|
||||
pub fn getppid() -> u32 {
|
||||
syscall::getppid().unwrap() as u32
|
||||
}
|
||||
|
@ -191,3 +191,9 @@ impl IntoRawFd for process::ChildStderr {
|
||||
self.into_inner().into_fd().into_raw()
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the OS-assigned process identifier associated with this process's parent.
|
||||
#[unstable(feature = "unix_ppid", issue = "46104")]
|
||||
pub fn parent_id() -> u32 {
|
||||
::sys::os::getppid()
|
||||
}
|
||||
|
@ -515,3 +515,7 @@ pub fn exit(code: i32) -> ! {
|
||||
pub fn getpid() -> u32 {
|
||||
unsafe { libc::getpid() as u32 }
|
||||
}
|
||||
|
||||
pub fn getppid() -> u32 {
|
||||
unsafe { libc::getppid() as u32 }
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ static Archive::Kind fromRust(LLVMRustArchiveKind Kind) {
|
||||
case LLVMRustArchiveKind::COFF:
|
||||
return Archive::K_COFF;
|
||||
default:
|
||||
llvm_unreachable("Bad ArchiveKind.");
|
||||
report_fatal_error("Bad ArchiveKind.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -235,7 +235,7 @@ static CodeModel::Model fromRust(LLVMRustCodeModel Model) {
|
||||
case LLVMRustCodeModel::Large:
|
||||
return CodeModel::Large;
|
||||
default:
|
||||
llvm_unreachable("Bad CodeModel.");
|
||||
report_fatal_error("Bad CodeModel.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -258,7 +258,7 @@ static CodeGenOpt::Level fromRust(LLVMRustCodeGenOptLevel Level) {
|
||||
case LLVMRustCodeGenOptLevel::Aggressive:
|
||||
return CodeGenOpt::Aggressive;
|
||||
default:
|
||||
llvm_unreachable("Bad CodeGenOptLevel.");
|
||||
report_fatal_error("Bad CodeGenOptLevel.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -302,7 +302,7 @@ static Optional<Reloc::Model> fromRust(LLVMRustRelocMode RustReloc) {
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
llvm_unreachable("Bad RelocModel.");
|
||||
report_fatal_error("Bad RelocModel.");
|
||||
}
|
||||
|
||||
#if LLVM_RUSTLLVM
|
||||
@ -511,7 +511,7 @@ static TargetMachine::CodeGenFileType fromRust(LLVMRustFileType Type) {
|
||||
case LLVMRustFileType::ObjectFile:
|
||||
return TargetMachine::CGFT_ObjectFile;
|
||||
default:
|
||||
llvm_unreachable("Bad FileType.");
|
||||
report_fatal_error("Bad FileType.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1197,7 +1197,7 @@ extern "C" bool
|
||||
LLVMRustWriteThinBitcodeToFile(LLVMPassManagerRef PMR,
|
||||
LLVMModuleRef M,
|
||||
const char *BcFile) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
struct LLVMRustThinLTOData {
|
||||
@ -1211,32 +1211,32 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
|
||||
int num_modules,
|
||||
const char **preserved_symbols,
|
||||
int num_symbols) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" bool
|
||||
LLVMRustPrepareThinLTORename(const LLVMRustThinLTOData *Data, LLVMModuleRef M) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" bool
|
||||
LLVMRustPrepareThinLTOResolveWeak(const LLVMRustThinLTOData *Data, LLVMModuleRef M) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" bool
|
||||
LLVMRustPrepareThinLTOInternalize(const LLVMRustThinLTOData *Data, LLVMModuleRef M) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" bool
|
||||
LLVMRustPrepareThinLTOImport(const LLVMRustThinLTOData *Data, LLVMModuleRef M) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
LLVMRustFreeThinLTOData(LLVMRustThinLTOData *Data) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
struct LLVMRustThinLTOBuffer {
|
||||
@ -1244,22 +1244,22 @@ struct LLVMRustThinLTOBuffer {
|
||||
|
||||
extern "C" LLVMRustThinLTOBuffer*
|
||||
LLVMRustThinLTOBufferCreate(LLVMModuleRef M) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
LLVMRustThinLTOBufferFree(LLVMRustThinLTOBuffer *Buffer) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" const void*
|
||||
LLVMRustThinLTOBufferPtr(const LLVMRustThinLTOBuffer *Buffer) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" size_t
|
||||
LLVMRustThinLTOBufferLen(const LLVMRustThinLTOBuffer *Buffer) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
|
||||
extern "C" LLVMModuleRef
|
||||
@ -1267,6 +1267,6 @@ LLVMRustParseBitcodeForThinLTO(LLVMContextRef Context,
|
||||
const char *data,
|
||||
size_t len,
|
||||
const char *identifier) {
|
||||
llvm_unreachable("ThinLTO not available");
|
||||
report_fatal_error("ThinLTO not available");
|
||||
}
|
||||
#endif // LLVM_VERSION_GE(4, 0)
|
||||
|
@ -54,7 +54,7 @@ static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {
|
||||
return AtomicOrdering::SequentiallyConsistent;
|
||||
}
|
||||
|
||||
llvm_unreachable("Invalid LLVMAtomicOrdering value!");
|
||||
report_fatal_error("Invalid LLVMAtomicOrdering value!");
|
||||
}
|
||||
|
||||
static LLVM_THREAD_LOCAL char *LastError;
|
||||
@ -161,7 +161,7 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
||||
case SanitizeMemory:
|
||||
return Attribute::SanitizeMemory;
|
||||
}
|
||||
llvm_unreachable("bad AttributeKind");
|
||||
report_fatal_error("bad AttributeKind");
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustAddCallSiteAttribute(LLVMValueRef Instr, unsigned Index,
|
||||
@ -356,7 +356,7 @@ static SyncScope::ID fromRust(LLVMRustSynchronizationScope Scope) {
|
||||
case LLVMRustSynchronizationScope::CrossThread:
|
||||
return SyncScope::System;
|
||||
default:
|
||||
llvm_unreachable("bad SynchronizationScope.");
|
||||
report_fatal_error("bad SynchronizationScope.");
|
||||
}
|
||||
}
|
||||
#else
|
||||
@ -367,7 +367,7 @@ static SynchronizationScope fromRust(LLVMRustSynchronizationScope Scope) {
|
||||
case LLVMRustSynchronizationScope::CrossThread:
|
||||
return CrossThread;
|
||||
default:
|
||||
llvm_unreachable("bad SynchronizationScope.");
|
||||
report_fatal_error("bad SynchronizationScope.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -397,7 +397,7 @@ static InlineAsm::AsmDialect fromRust(LLVMRustAsmDialect Dialect) {
|
||||
case LLVMRustAsmDialect::Intel:
|
||||
return InlineAsm::AD_Intel;
|
||||
default:
|
||||
llvm_unreachable("bad AsmDialect.");
|
||||
report_fatal_error("bad AsmDialect.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -748,7 +748,7 @@ extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateVariable(
|
||||
unwrapDI<DIType>(Ty), AlwaysPreserve, fromRust(Flags)
|
||||
#if LLVM_VERSION_GE(4, 0)
|
||||
,
|
||||
AlignInBits
|
||||
AlignInBits
|
||||
#endif
|
||||
));
|
||||
} else {
|
||||
@ -1149,7 +1149,7 @@ extern "C" LLVMTypeKind LLVMRustGetTypeKind(LLVMTypeRef Ty) {
|
||||
return LLVMTokenTypeKind;
|
||||
#endif
|
||||
}
|
||||
llvm_unreachable("Unhandled TypeID.");
|
||||
report_fatal_error("Unhandled TypeID.");
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustWriteDebugLocToString(LLVMContextRef C,
|
||||
@ -1370,7 +1370,7 @@ static LLVMRustLinkage toRust(LLVMLinkage Linkage) {
|
||||
case LLVMCommonLinkage:
|
||||
return LLVMRustLinkage::CommonLinkage;
|
||||
default:
|
||||
llvm_unreachable("Invalid LLVMRustLinkage value!");
|
||||
report_fatal_error("Invalid LLVMRustLinkage value!");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1399,7 +1399,7 @@ static LLVMLinkage fromRust(LLVMRustLinkage Linkage) {
|
||||
case LLVMRustLinkage::CommonLinkage:
|
||||
return LLVMCommonLinkage;
|
||||
}
|
||||
llvm_unreachable("Invalid LLVMRustLinkage value!");
|
||||
report_fatal_error("Invalid LLVMRustLinkage value!");
|
||||
}
|
||||
|
||||
extern "C" LLVMRustLinkage LLVMRustGetLinkage(LLVMValueRef V) {
|
||||
@ -1447,7 +1447,7 @@ static LLVMRustVisibility toRust(LLVMVisibility Vis) {
|
||||
case LLVMProtectedVisibility:
|
||||
return LLVMRustVisibility::Protected;
|
||||
}
|
||||
llvm_unreachable("Invalid LLVMRustVisibility value!");
|
||||
report_fatal_error("Invalid LLVMRustVisibility value!");
|
||||
}
|
||||
|
||||
static LLVMVisibility fromRust(LLVMRustVisibility Vis) {
|
||||
@ -1459,7 +1459,7 @@ static LLVMVisibility fromRust(LLVMRustVisibility Vis) {
|
||||
case LLVMRustVisibility::Protected:
|
||||
return LLVMProtectedVisibility;
|
||||
}
|
||||
llvm_unreachable("Invalid LLVMRustVisibility value!");
|
||||
report_fatal_error("Invalid LLVMRustVisibility value!");
|
||||
}
|
||||
|
||||
extern "C" LLVMRustVisibility LLVMRustGetVisibility(LLVMValueRef V) {
|
||||
|
@ -106,7 +106,7 @@ result is then compared against reference files named
|
||||
those files doesn't exist, the output must be empty. If the test run
|
||||
fails, we will print out the current output, but it is also saved in
|
||||
`build/<target-triple>/test/ui/hello_world/main.stdout` (this path is
|
||||
printed as part of the test failure mesage), so you can run `diff` and
|
||||
printed as part of the test failure message), so you can run `diff` and
|
||||
so forth.
|
||||
|
||||
### Editing and updating the reference files
|
||||
|
@ -57,7 +57,6 @@ fn filter_dirs(path: &Path) -> bool {
|
||||
"src/libbacktrace",
|
||||
"src/libcompiler_builtins",
|
||||
"src/compiler-rt",
|
||||
"src/rustllvm",
|
||||
"src/liblibc",
|
||||
"src/vendor",
|
||||
"src/rt/hoedown",
|
||||
|
@ -50,6 +50,11 @@ const UNEXPLAINED_IGNORE_DOCTEST_INFO: &str = r#"unexplained "```ignore" doctest
|
||||
|
||||
"#;
|
||||
|
||||
const LLVM_UNREACHABLE_INFO: &str = r"\
|
||||
C++ code used llvm_unreachable, which triggers undefined behavior
|
||||
when executed when assertions are disabled.
|
||||
Use llvm::report_fatal_error for increased robustness.";
|
||||
|
||||
/// Parser states for line_is_url.
|
||||
#[derive(PartialEq)]
|
||||
#[allow(non_camel_case_types)]
|
||||
@ -108,7 +113,7 @@ pub fn check(path: &Path, bad: &mut bool) {
|
||||
let mut contents = String::new();
|
||||
super::walk(path, &mut super::filter_dirs, &mut |file| {
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
let extensions = [".rs", ".py", ".js", ".sh", ".c", ".h"];
|
||||
let extensions = [".rs", ".py", ".js", ".sh", ".c", ".cpp", ".h"];
|
||||
if extensions.iter().all(|e| !filename.ends_with(e)) ||
|
||||
filename.starts_with(".#") {
|
||||
return
|
||||
@ -153,6 +158,9 @@ pub fn check(path: &Path, bad: &mut bool) {
|
||||
if line.ends_with("```ignore") || line.ends_with("```rust,ignore") {
|
||||
err(UNEXPLAINED_IGNORE_DOCTEST_INFO);
|
||||
}
|
||||
if filename.ends_with(".cpp") && line.contains("llvm_unreachable") {
|
||||
err(LLVM_UNREACHABLE_INFO);
|
||||
}
|
||||
}
|
||||
if !licenseck(file, &contents) {
|
||||
tidy_error!(bad, "{}: incorrect license", file.display());
|
||||
|
Loading…
Reference in New Issue
Block a user