mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Auto merge of #64816 - Centril:rollup-gbeqot4, r=Centril
Rollup of 5 pull requests Successful merges: - #64221 ( Rust 2015: No longer downgrade NLL errors) - #64772 (Remove tx_to_llvm_workers from TyCtxt) - #64783 (Fix issue #64732) - #64787 (Fix ExitStatus on Fuchsia) - #64812 (Add test for E0543) Failed merges: r? @ghost
This commit is contained in:
commit
0b1521ffb7
@ -64,7 +64,6 @@ use std::fmt;
|
||||
use std::mem;
|
||||
use std::ops::{Deref, Bound};
|
||||
use std::iter;
|
||||
use std::sync::mpsc;
|
||||
use std::sync::Arc;
|
||||
use rustc_target::spec::abi;
|
||||
use rustc_macros::HashStable;
|
||||
@ -1064,14 +1063,6 @@ pub struct GlobalCtxt<'tcx> {
|
||||
|
||||
layout_interner: ShardedHashMap<&'tcx LayoutDetails, ()>,
|
||||
|
||||
/// A general purpose channel to throw data out the back towards LLVM worker
|
||||
/// threads.
|
||||
///
|
||||
/// This is intended to only get used during the codegen phase of the compiler
|
||||
/// when satisfying the query for a particular codegen unit. Internally in
|
||||
/// the query it'll send data along this channel to get processed later.
|
||||
pub tx_to_llvm_workers: Lock<mpsc::Sender<Box<dyn Any + Send>>>,
|
||||
|
||||
output_filenames: Arc<OutputFilenames>,
|
||||
}
|
||||
|
||||
@ -1184,7 +1175,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
hir: hir_map::Map<'tcx>,
|
||||
on_disk_query_result_cache: query::OnDiskCache<'tcx>,
|
||||
crate_name: &str,
|
||||
tx: mpsc::Sender<Box<dyn Any + Send>>,
|
||||
output_filenames: &OutputFilenames,
|
||||
) -> GlobalCtxt<'tcx> {
|
||||
let data_layout = TargetDataLayout::parse(&s.target.target).unwrap_or_else(|err| {
|
||||
@ -1291,7 +1281,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
stability_interner: Default::default(),
|
||||
allocation_interner: Default::default(),
|
||||
alloc_map: Lock::new(interpret::AllocMap::new()),
|
||||
tx_to_llvm_workers: Lock::new(tx),
|
||||
output_filenames: Arc::new(output_filenames.clone()),
|
||||
}
|
||||
}
|
||||
|
@ -103,7 +103,11 @@ pub fn iter_globals(llmod: &'ll llvm::Module) -> ValueIter<'ll> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn compile_codegen_unit(tcx: TyCtxt<'tcx>, cgu_name: InternedString) {
|
||||
pub fn compile_codegen_unit(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
cgu_name: InternedString,
|
||||
tx_to_llvm_workers: &std::sync::mpsc::Sender<Box<dyn std::any::Any + Send>>,
|
||||
) {
|
||||
let start_time = Instant::now();
|
||||
|
||||
let dep_node = tcx.codegen_unit(cgu_name).codegen_dep_node(tcx);
|
||||
@ -121,7 +125,7 @@ pub fn compile_codegen_unit(tcx: TyCtxt<'tcx>, cgu_name: InternedString) {
|
||||
let cost = time_to_codegen.as_secs() * 1_000_000_000 +
|
||||
time_to_codegen.subsec_nanos() as u64;
|
||||
|
||||
submit_codegened_module_to_llvm(&LlvmCodegenBackend(()), tcx, module, cost);
|
||||
submit_codegened_module_to_llvm(&LlvmCodegenBackend(()), tx_to_llvm_workers, module, cost);
|
||||
|
||||
fn module_codegen(
|
||||
tcx: TyCtxt<'_>,
|
||||
|
@ -52,7 +52,7 @@ use syntax::ext::allocator::AllocatorKind;
|
||||
use syntax_pos::symbol::InternedString;
|
||||
pub use llvm_util::target_features;
|
||||
use std::any::Any;
|
||||
use std::sync::{mpsc, Arc};
|
||||
use std::sync::Arc;
|
||||
use std::ffi::CStr;
|
||||
|
||||
use rustc::dep_graph::DepGraph;
|
||||
@ -122,8 +122,12 @@ impl ExtraBackendMethods for LlvmCodegenBackend {
|
||||
) {
|
||||
unsafe { allocator::codegen(tcx, mods, kind) }
|
||||
}
|
||||
fn compile_codegen_unit(&self, tcx: TyCtxt<'_>, cgu_name: InternedString) {
|
||||
base::compile_codegen_unit(tcx, cgu_name);
|
||||
fn compile_codegen_unit(
|
||||
&self, tcx: TyCtxt<'_>,
|
||||
cgu_name: InternedString,
|
||||
tx: &std::sync::mpsc::Sender<Box<dyn Any + Send>>,
|
||||
) {
|
||||
base::compile_codegen_unit(tcx, cgu_name, tx);
|
||||
}
|
||||
fn target_machine_factory(
|
||||
&self,
|
||||
@ -284,10 +288,9 @@ impl CodegenBackend for LlvmCodegenBackend {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
metadata: EncodedMetadata,
|
||||
need_metadata_module: bool,
|
||||
rx: mpsc::Receiver<Box<dyn Any + Send>>,
|
||||
) -> Box<dyn Any> {
|
||||
box rustc_codegen_ssa::base::codegen_crate(
|
||||
LlvmCodegenBackend(()), tcx, metadata, need_metadata_module, rx)
|
||||
LlvmCodegenBackend(()), tcx, metadata, need_metadata_module)
|
||||
}
|
||||
|
||||
fn join_codegen_and_link(
|
||||
|
@ -376,9 +376,9 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
|
||||
backend: B,
|
||||
tcx: TyCtxt<'_>,
|
||||
metadata: EncodedMetadata,
|
||||
coordinator_receive: Receiver<Box<dyn Any + Send>>,
|
||||
total_cgus: usize,
|
||||
) -> OngoingCodegen<B> {
|
||||
let (coordinator_send, coordinator_receive) = channel();
|
||||
let sess = tcx.sess;
|
||||
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
||||
let crate_hash = tcx.crate_hash(LOCAL_CRATE);
|
||||
@ -500,7 +500,8 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
|
||||
sess.jobserver.clone(),
|
||||
Arc::new(modules_config),
|
||||
Arc::new(metadata_config),
|
||||
Arc::new(allocator_config));
|
||||
Arc::new(allocator_config),
|
||||
coordinator_send.clone());
|
||||
|
||||
OngoingCodegen {
|
||||
backend,
|
||||
@ -511,7 +512,7 @@ pub fn start_async_codegen<B: ExtraBackendMethods>(
|
||||
linker_info,
|
||||
crate_info,
|
||||
|
||||
coordinator_send: tcx.tx_to_llvm_workers.lock().clone(),
|
||||
coordinator_send,
|
||||
codegen_worker_receive,
|
||||
shared_emitter_main,
|
||||
future: coordinator_thread,
|
||||
@ -1005,8 +1006,9 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
||||
modules_config: Arc<ModuleConfig>,
|
||||
metadata_config: Arc<ModuleConfig>,
|
||||
allocator_config: Arc<ModuleConfig>,
|
||||
tx_to_llvm_workers: Sender<Box<dyn Any + Send>>,
|
||||
) -> thread::JoinHandle<Result<CompiledModules, ()>> {
|
||||
let coordinator_send = tcx.tx_to_llvm_workers.lock().clone();
|
||||
let coordinator_send = tx_to_llvm_workers;
|
||||
let sess = tcx.sess;
|
||||
|
||||
// Compute the set of symbols we need to retain when doing LTO (if we need to)
|
||||
@ -1857,7 +1859,7 @@ impl<B: ExtraBackendMethods> OngoingCodegen<B> {
|
||||
|
||||
// These are generally cheap and won't throw off scheduling.
|
||||
let cost = 0;
|
||||
submit_codegened_module_to_llvm(&self.backend, tcx, module, cost);
|
||||
submit_codegened_module_to_llvm(&self.backend, &self.coordinator_send, module, cost);
|
||||
}
|
||||
|
||||
pub fn codegen_finished(&self, tcx: TyCtxt<'_>) {
|
||||
@ -1899,12 +1901,12 @@ impl<B: ExtraBackendMethods> OngoingCodegen<B> {
|
||||
|
||||
pub fn submit_codegened_module_to_llvm<B: ExtraBackendMethods>(
|
||||
_backend: &B,
|
||||
tcx: TyCtxt<'_>,
|
||||
tx_to_llvm_workers: &Sender<Box<dyn Any + Send>>,
|
||||
module: ModuleCodegen<B::Module>,
|
||||
cost: u64,
|
||||
) {
|
||||
let llvm_work_item = WorkItem::Optimize(module);
|
||||
drop(tcx.tx_to_llvm_workers.lock().send(Box::new(Message::CodegenDone::<B> {
|
||||
drop(tx_to_llvm_workers.send(Box::new(Message::CodegenDone::<B> {
|
||||
llvm_work_item,
|
||||
cost,
|
||||
})));
|
||||
@ -1912,11 +1914,11 @@ pub fn submit_codegened_module_to_llvm<B: ExtraBackendMethods>(
|
||||
|
||||
pub fn submit_post_lto_module_to_llvm<B: ExtraBackendMethods>(
|
||||
_backend: &B,
|
||||
tcx: TyCtxt<'_>,
|
||||
tx_to_llvm_workers: &Sender<Box<dyn Any + Send>>,
|
||||
module: CachedModuleCodegen,
|
||||
) {
|
||||
let llvm_work_item = WorkItem::CopyPostLtoArtifacts(module);
|
||||
drop(tcx.tx_to_llvm_workers.lock().send(Box::new(Message::CodegenDone::<B> {
|
||||
drop(tx_to_llvm_workers.send(Box::new(Message::CodegenDone::<B> {
|
||||
llvm_work_item,
|
||||
cost: 0,
|
||||
})));
|
||||
@ -1925,6 +1927,7 @@ pub fn submit_post_lto_module_to_llvm<B: ExtraBackendMethods>(
|
||||
pub fn submit_pre_lto_module_to_llvm<B: ExtraBackendMethods>(
|
||||
_backend: &B,
|
||||
tcx: TyCtxt<'_>,
|
||||
tx_to_llvm_workers: &Sender<Box<dyn Any + Send>>,
|
||||
module: CachedModuleCodegen,
|
||||
) {
|
||||
let filename = pre_lto_bitcode_filename(&module.name);
|
||||
@ -1939,7 +1942,7 @@ pub fn submit_pre_lto_module_to_llvm<B: ExtraBackendMethods>(
|
||||
})
|
||||
};
|
||||
// Schedule the module to be loaded
|
||||
drop(tcx.tx_to_llvm_workers.lock().send(Box::new(Message::AddImportOnlyModule::<B> {
|
||||
drop(tx_to_llvm_workers.send(Box::new(Message::AddImportOnlyModule::<B> {
|
||||
module_data: SerializedModule::FromUncompressedFile(mmap),
|
||||
work_product: module.source,
|
||||
})));
|
||||
|
@ -43,11 +43,9 @@ use crate::mir;
|
||||
|
||||
use crate::traits::*;
|
||||
|
||||
use std::any::Any;
|
||||
use std::cmp;
|
||||
use std::ops::{Deref, DerefMut};
|
||||
use std::time::{Instant, Duration};
|
||||
use std::sync::mpsc;
|
||||
use syntax_pos::Span;
|
||||
use syntax::attr;
|
||||
use rustc::hir;
|
||||
@ -482,19 +480,13 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
metadata: EncodedMetadata,
|
||||
need_metadata_module: bool,
|
||||
rx: mpsc::Receiver<Box<dyn Any + Send>>,
|
||||
) -> OngoingCodegen<B> {
|
||||
check_for_rustc_errors_attr(tcx);
|
||||
|
||||
// Skip crate items and just output metadata in -Z no-codegen mode.
|
||||
if tcx.sess.opts.debugging_opts.no_codegen ||
|
||||
!tcx.sess.opts.output_types.should_codegen() {
|
||||
let ongoing_codegen = start_async_codegen(
|
||||
backend,
|
||||
tcx,
|
||||
metadata,
|
||||
rx,
|
||||
1);
|
||||
let ongoing_codegen = start_async_codegen(backend, tcx, metadata, 1);
|
||||
|
||||
ongoing_codegen.codegen_finished(tcx);
|
||||
|
||||
@ -523,12 +515,7 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
||||
}
|
||||
}
|
||||
|
||||
let ongoing_codegen = start_async_codegen(
|
||||
backend.clone(),
|
||||
tcx,
|
||||
metadata,
|
||||
rx,
|
||||
codegen_units.len());
|
||||
let ongoing_codegen = start_async_codegen(backend.clone(), tcx, metadata, codegen_units.len());
|
||||
let ongoing_codegen = AbortCodegenOnDrop::<B>(Some(ongoing_codegen));
|
||||
|
||||
// Codegen an allocator shim, if necessary.
|
||||
@ -614,20 +601,22 @@ pub fn codegen_crate<B: ExtraBackendMethods>(
|
||||
CguReuse::No => {
|
||||
tcx.sess.profiler(|p| p.start_activity(format!("codegen {}", cgu.name())));
|
||||
let start_time = Instant::now();
|
||||
backend.compile_codegen_unit(tcx, *cgu.name());
|
||||
backend.compile_codegen_unit(tcx, *cgu.name(), &ongoing_codegen.coordinator_send);
|
||||
total_codegen_time += start_time.elapsed();
|
||||
tcx.sess.profiler(|p| p.end_activity(format!("codegen {}", cgu.name())));
|
||||
false
|
||||
}
|
||||
CguReuse::PreLto => {
|
||||
submit_pre_lto_module_to_llvm(&backend, tcx, CachedModuleCodegen {
|
||||
submit_pre_lto_module_to_llvm(&backend, tcx, &ongoing_codegen.coordinator_send,
|
||||
CachedModuleCodegen {
|
||||
name: cgu.name().to_string(),
|
||||
source: cgu.work_product(tcx),
|
||||
});
|
||||
true
|
||||
}
|
||||
CguReuse::PostLto => {
|
||||
submit_post_lto_module_to_llvm(&backend, tcx, CachedModuleCodegen {
|
||||
submit_post_lto_module_to_llvm(&backend, &ongoing_codegen.coordinator_send,
|
||||
CachedModuleCodegen {
|
||||
name: cgu.name().to_string(),
|
||||
source: cgu.work_product(tcx),
|
||||
});
|
||||
|
@ -8,6 +8,7 @@ use rustc::session::{Session, config};
|
||||
use rustc::ty::TyCtxt;
|
||||
use rustc_codegen_utils::codegen_backend::CodegenBackend;
|
||||
use std::sync::Arc;
|
||||
use std::sync::mpsc;
|
||||
use syntax::ext::allocator::AllocatorKind;
|
||||
use syntax_pos::symbol::InternedString;
|
||||
|
||||
@ -44,7 +45,12 @@ pub trait ExtraBackendMethods: CodegenBackend + WriteBackendMethods + Sized + Se
|
||||
mods: &mut Self::Module,
|
||||
kind: AllocatorKind,
|
||||
);
|
||||
fn compile_codegen_unit(&self, tcx: TyCtxt<'_>, cgu_name: InternedString);
|
||||
fn compile_codegen_unit(
|
||||
&self,
|
||||
tcx: TyCtxt<'_>,
|
||||
cgu_name: InternedString,
|
||||
tx_to_llvm_workers: &mpsc::Sender<Box<dyn std::any::Any + Send>>,
|
||||
);
|
||||
// If find_features is true this won't access `sess.crate_types` by assuming
|
||||
// that `is_pie_binary` is false. When we discover LLVM target features
|
||||
// `sess.crate_types` is uninitialized so we cannot access it.
|
||||
|
@ -7,7 +7,6 @@
|
||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
|
||||
|
||||
use std::any::Any;
|
||||
use std::sync::mpsc;
|
||||
|
||||
use syntax::symbol::Symbol;
|
||||
use rustc::session::Session;
|
||||
@ -36,7 +35,6 @@ pub trait CodegenBackend {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
metadata: EncodedMetadata,
|
||||
need_metadata_module: bool,
|
||||
rx: mpsc::Receiver<Box<dyn Any + Send>>,
|
||||
) -> Box<dyn Any>;
|
||||
|
||||
/// This is called on the returned `Box<dyn Any>` from `codegen_backend`
|
||||
|
@ -54,7 +54,6 @@ use std::fs;
|
||||
use std::io::{self, Write};
|
||||
use std::iter;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::mpsc;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
@ -816,7 +815,6 @@ pub fn create_global_ctxt(
|
||||
defs: hir::map::Definitions,
|
||||
resolutions: Resolutions,
|
||||
outputs: OutputFilenames,
|
||||
tx: mpsc::Sender<Box<dyn Any + Send>>,
|
||||
crate_name: &str,
|
||||
) -> BoxedGlobalCtxt {
|
||||
let sess = compiler.session().clone();
|
||||
@ -858,7 +856,6 @@ pub fn create_global_ctxt(
|
||||
hir_map,
|
||||
query_result_on_disk_cache,
|
||||
&crate_name,
|
||||
tx,
|
||||
&outputs
|
||||
);
|
||||
|
||||
@ -1068,7 +1065,6 @@ fn encode_and_write_metadata(
|
||||
pub fn start_codegen<'tcx>(
|
||||
codegen_backend: &dyn CodegenBackend,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
rx: mpsc::Receiver<Box<dyn Any + Send>>,
|
||||
outputs: &OutputFilenames,
|
||||
) -> Box<dyn Any> {
|
||||
if log_enabled!(::log::Level::Info) {
|
||||
@ -1082,7 +1078,7 @@ pub fn start_codegen<'tcx>(
|
||||
|
||||
tcx.sess.profiler(|p| p.start_activity("codegen crate"));
|
||||
let codegen = time(tcx.sess, "codegen", move || {
|
||||
codegen_backend.codegen_crate(tcx, metadata, need_metadata_module, rx)
|
||||
codegen_backend.codegen_crate(tcx, metadata, need_metadata_module)
|
||||
});
|
||||
tcx.sess.profiler(|p| p.end_activity("codegen crate"));
|
||||
|
||||
|
@ -10,7 +10,6 @@ use rustc::ty::steal::Steal;
|
||||
use rustc::dep_graph::DepGraph;
|
||||
use std::cell::{Ref, RefMut, RefCell};
|
||||
use std::rc::Rc;
|
||||
use std::sync::mpsc;
|
||||
use std::any::Any;
|
||||
use std::mem;
|
||||
use syntax::{self, ast};
|
||||
@ -80,8 +79,6 @@ pub(crate) struct Queries {
|
||||
dep_graph: Query<DepGraph>,
|
||||
lower_to_hir: Query<(Steal<hir::map::Forest>, ExpansionResult)>,
|
||||
prepare_outputs: Query<OutputFilenames>,
|
||||
codegen_channel: Query<(Steal<mpsc::Sender<Box<dyn Any + Send>>>,
|
||||
Steal<mpsc::Receiver<Box<dyn Any + Send>>>)>,
|
||||
global_ctxt: Query<BoxedGlobalCtxt>,
|
||||
ongoing_codegen: Query<Box<dyn Any>>,
|
||||
link: Query<()>,
|
||||
@ -211,14 +208,6 @@ impl Compiler {
|
||||
})
|
||||
}
|
||||
|
||||
pub fn codegen_channel(&self) -> Result<&Query<(Steal<mpsc::Sender<Box<dyn Any + Send>>>,
|
||||
Steal<mpsc::Receiver<Box<dyn Any + Send>>>)>> {
|
||||
self.queries.codegen_channel.compute(|| {
|
||||
let (tx, rx) = mpsc::channel();
|
||||
Ok((Steal::new(tx), Steal::new(rx)))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn global_ctxt(&self) -> Result<&Query<BoxedGlobalCtxt>> {
|
||||
self.queries.global_ctxt.compute(|| {
|
||||
let crate_name = self.crate_name()?.peek().clone();
|
||||
@ -226,21 +215,18 @@ impl Compiler {
|
||||
let hir = self.lower_to_hir()?;
|
||||
let hir = hir.peek();
|
||||
let (ref hir_forest, ref expansion) = *hir;
|
||||
let tx = self.codegen_channel()?.peek().0.steal();
|
||||
Ok(passes::create_global_ctxt(
|
||||
self,
|
||||
hir_forest.steal(),
|
||||
expansion.defs.steal(),
|
||||
expansion.resolutions.steal(),
|
||||
outputs,
|
||||
tx,
|
||||
&crate_name))
|
||||
})
|
||||
}
|
||||
|
||||
pub fn ongoing_codegen(&self) -> Result<&Query<Box<dyn Any>>> {
|
||||
self.queries.ongoing_codegen.compute(|| {
|
||||
let rx = self.codegen_channel()?.peek().1.steal();
|
||||
let outputs = self.prepare_outputs()?;
|
||||
self.global_ctxt()?.peek_mut().enter(|tcx| {
|
||||
tcx.analysis(LOCAL_CRATE).ok();
|
||||
@ -251,7 +237,6 @@ impl Compiler {
|
||||
Ok(passes::start_codegen(
|
||||
&***self.codegen_backend(),
|
||||
tcx,
|
||||
rx,
|
||||
&*outputs.peek()
|
||||
))
|
||||
})
|
||||
|
@ -105,9 +105,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
format!("{} occurs due to use{}", desired_action.as_noun(), use_spans.describe()),
|
||||
);
|
||||
|
||||
// This error should not be downgraded to a warning,
|
||||
// even in migrate mode.
|
||||
self.disable_error_downgrading();
|
||||
err.buffer(&mut self.errors_buffer);
|
||||
} else {
|
||||
if let Some((reported_place, _)) = self.move_error_reported.get(&move_out_indices) {
|
||||
|
@ -7,7 +7,6 @@ use rustc::hir::def_id::DefId;
|
||||
use rustc::infer::InferCtxt;
|
||||
use rustc::lint::builtin::UNUSED_MUT;
|
||||
use rustc::lint::builtin::{MUTABLE_BORROW_RESERVATION_CONFLICT};
|
||||
use rustc::middle::borrowck::SignalledError;
|
||||
use rustc::mir::{AggregateKind, BasicBlock, BorrowCheckResult, BorrowKind};
|
||||
use rustc::mir::{
|
||||
ClearCrossCrate, Local, Location, Body, Mutability, Operand, Place, PlaceBase, PlaceElem,
|
||||
@ -18,7 +17,7 @@ use rustc::mir::{Terminator, TerminatorKind};
|
||||
use rustc::ty::query::Providers;
|
||||
use rustc::ty::{self, TyCtxt};
|
||||
|
||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, Level};
|
||||
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder};
|
||||
use rustc_data_structures::bit_set::BitSet;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_data_structures::graph::dominators::Dominators;
|
||||
@ -259,10 +258,6 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
move_error_reported: BTreeMap::new(),
|
||||
uninitialized_error_reported: Default::default(),
|
||||
errors_buffer,
|
||||
// Only downgrade errors on Rust 2015 and refuse to do so on Rust 2018.
|
||||
// FIXME(Centril): In Rust 1.40.0, refuse doing so on 2015 as well and
|
||||
// proceed to throwing out the migration infrastructure.
|
||||
disable_error_downgrading: body.span.rust_2018(),
|
||||
nonlexical_regioncx: regioncx,
|
||||
used_mut: Default::default(),
|
||||
used_mut_upvars: SmallVec::new(),
|
||||
@ -374,33 +369,6 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
if !mbcx.errors_buffer.is_empty() {
|
||||
mbcx.errors_buffer.sort_by_key(|diag| diag.span.primary_span());
|
||||
|
||||
if !mbcx.disable_error_downgrading && tcx.migrate_borrowck() {
|
||||
// When borrowck=migrate, check if AST-borrowck would
|
||||
// error on the given code.
|
||||
|
||||
// rust-lang/rust#55492, rust-lang/rust#58776 check the base def id
|
||||
// for errors. AST borrowck is responsible for aggregating
|
||||
// `signalled_any_error` from all of the nested closures here.
|
||||
let base_def_id = tcx.closure_base_def_id(def_id);
|
||||
|
||||
match tcx.borrowck(base_def_id).signalled_any_error {
|
||||
SignalledError::NoErrorsSeen => {
|
||||
// if AST-borrowck signalled no errors, then
|
||||
// downgrade all the buffered MIR-borrowck errors
|
||||
// to warnings.
|
||||
|
||||
for err in mbcx.errors_buffer.iter_mut() {
|
||||
downgrade_if_error(err);
|
||||
}
|
||||
}
|
||||
SignalledError::SawSomeError => {
|
||||
// if AST-borrowck signalled a (cancelled) error,
|
||||
// then we will just emit the buffered
|
||||
// MIR-borrowck errors as normal.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for diag in mbcx.errors_buffer.drain(..) {
|
||||
mbcx.infcx.tcx.sess.diagnostic().emit_diagnostic(&diag);
|
||||
}
|
||||
@ -416,21 +384,6 @@ fn do_mir_borrowck<'a, 'tcx>(
|
||||
result
|
||||
}
|
||||
|
||||
fn downgrade_if_error(diag: &mut Diagnostic) {
|
||||
if diag.is_error() {
|
||||
diag.level = Level::Warning;
|
||||
diag.warn(
|
||||
"this error has been downgraded to a warning for backwards \
|
||||
compatibility with previous releases",
|
||||
).warn(
|
||||
"this represents potential undefined behavior in your code and \
|
||||
this warning will become a hard error in the future",
|
||||
).note(
|
||||
"for more information, try `rustc --explain E0729`"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
crate struct MirBorrowckCtxt<'cx, 'tcx> {
|
||||
crate infcx: &'cx InferCtxt<'cx, 'tcx>,
|
||||
body: &'cx Body<'tcx>,
|
||||
@ -491,9 +444,6 @@ crate struct MirBorrowckCtxt<'cx, 'tcx> {
|
||||
uninitialized_error_reported: FxHashSet<PlaceRef<'cx, 'tcx>>,
|
||||
/// Errors to be reported buffer
|
||||
errors_buffer: Vec<Diagnostic>,
|
||||
/// If there are no errors reported by the HIR borrow checker, we downgrade
|
||||
/// all NLL errors to warnings. Setting this flag disables downgrading.
|
||||
disable_error_downgrading: bool,
|
||||
/// This field keeps track of all the local variables that are declared mut and are mutated.
|
||||
/// Used for the warning issued by an unused mutable local variable.
|
||||
used_mut: FxHashSet<Local>,
|
||||
@ -934,12 +884,6 @@ impl InitializationRequiringAction {
|
||||
}
|
||||
|
||||
impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
/// If there are no errors reported by the HIR borrow checker, we downgrade
|
||||
/// all NLL errors to warnings. Calling this disables downgrading.
|
||||
crate fn disable_error_downgrading(&mut self) {
|
||||
self.disable_error_downgrading = true;
|
||||
}
|
||||
|
||||
/// Checks an access to the given place to see if it is allowed. Examines the set of borrows
|
||||
/// that are in scope, as well as which paths have been initialized, to ensure that (a) the
|
||||
/// place is initialized and (b) it is not borrowed in some way that would prevent this
|
||||
|
@ -1,5 +1,5 @@
|
||||
pub use self::process_common::{Command, ExitStatus, ExitCode, Stdio, StdioPipes};
|
||||
pub use self::process_inner::Process;
|
||||
pub use self::process_common::{Command, ExitCode, Stdio, StdioPipes};
|
||||
pub use self::process_inner::{ExitStatus, Process};
|
||||
pub use crate::ffi::OsString as EnvKey;
|
||||
|
||||
mod process_common;
|
||||
|
@ -393,57 +393,6 @@ impl fmt::Debug for Command {
|
||||
}
|
||||
}
|
||||
|
||||
/// Unix exit statuses
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||
pub struct ExitStatus(c_int);
|
||||
|
||||
impl ExitStatus {
|
||||
pub fn new(status: c_int) -> ExitStatus {
|
||||
ExitStatus(status)
|
||||
}
|
||||
|
||||
fn exited(&self) -> bool {
|
||||
unsafe { libc::WIFEXITED(self.0) }
|
||||
}
|
||||
|
||||
pub fn success(&self) -> bool {
|
||||
self.code() == Some(0)
|
||||
}
|
||||
|
||||
pub fn code(&self) -> Option<i32> {
|
||||
if self.exited() {
|
||||
Some(unsafe { libc::WEXITSTATUS(self.0) })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn signal(&self) -> Option<i32> {
|
||||
if !self.exited() {
|
||||
Some(unsafe { libc::WTERMSIG(self.0) })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<c_int> for ExitStatus {
|
||||
fn from(a: c_int) -> ExitStatus {
|
||||
ExitStatus(a)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ExitStatus {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if let Some(code) = self.code() {
|
||||
write!(f, "exit code: {}", code)
|
||||
} else {
|
||||
let signal = self.signal().unwrap();
|
||||
write!(f, "signal: {}", signal)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||
pub struct ExitCode(u8);
|
||||
|
||||
|
@ -1,11 +1,13 @@
|
||||
use crate::convert::TryInto;
|
||||
use crate::io;
|
||||
use crate::fmt;
|
||||
use crate::mem;
|
||||
use crate::ptr;
|
||||
|
||||
use crate::sys::process::zircon::{Handle, zx_handle_t};
|
||||
use crate::sys::process::process_common::*;
|
||||
|
||||
use libc::size_t;
|
||||
use libc::{c_int, size_t};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Command
|
||||
@ -160,7 +162,7 @@ impl Process {
|
||||
return Err(io::Error::new(io::ErrorKind::InvalidData,
|
||||
"Failed to get exit status of process"));
|
||||
}
|
||||
Ok(ExitStatus::new(proc_info.rec.return_code))
|
||||
Ok(ExitStatus(proc_info.return_code))
|
||||
}
|
||||
|
||||
pub fn try_wait(&mut self) -> io::Result<Option<ExitStatus>> {
|
||||
@ -190,6 +192,36 @@ impl Process {
|
||||
return Err(io::Error::new(io::ErrorKind::InvalidData,
|
||||
"Failed to get exit status of process"));
|
||||
}
|
||||
Ok(Some(ExitStatus::new(proc_info.rec.return_code)))
|
||||
Ok(Some(ExitStatus(proc_info.return_code)))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||
pub struct ExitStatus(i64);
|
||||
|
||||
impl ExitStatus {
|
||||
pub fn success(&self) -> bool {
|
||||
self.code() == Some(0)
|
||||
}
|
||||
|
||||
pub fn code(&self) -> Option<i32> {
|
||||
// FIXME: support extracting return code as an i64
|
||||
self.0.try_into().ok()
|
||||
}
|
||||
|
||||
pub fn signal(&self) -> Option<i32> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl From<c_int> for ExitStatus {
|
||||
fn from(a: c_int) -> ExitStatus {
|
||||
ExitStatus(a as i64)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ExitStatus {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "exit code: {}", self.0)
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::fmt;
|
||||
use crate::io::{self, Error, ErrorKind};
|
||||
use crate::ptr;
|
||||
use crate::sys::cvt;
|
||||
@ -441,3 +442,54 @@ impl Process {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Unix exit statuses
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||
pub struct ExitStatus(c_int);
|
||||
|
||||
impl ExitStatus {
|
||||
pub fn new(status: c_int) -> ExitStatus {
|
||||
ExitStatus(status)
|
||||
}
|
||||
|
||||
fn exited(&self) -> bool {
|
||||
unsafe { libc::WIFEXITED(self.0) }
|
||||
}
|
||||
|
||||
pub fn success(&self) -> bool {
|
||||
self.code() == Some(0)
|
||||
}
|
||||
|
||||
pub fn code(&self) -> Option<i32> {
|
||||
if self.exited() {
|
||||
Some(unsafe { libc::WEXITSTATUS(self.0) })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn signal(&self) -> Option<i32> {
|
||||
if !self.exited() {
|
||||
Some(unsafe { libc::WTERMSIG(self.0) })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<c_int> for ExitStatus {
|
||||
fn from(a: c_int) -> ExitStatus {
|
||||
ExitStatus(a)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for ExitStatus {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if let Some(code) = self.code() {
|
||||
write!(f, "exit code: {}", code)
|
||||
} else {
|
||||
let signal = self.signal().unwrap();
|
||||
write!(f, "signal: {}", signal)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,29 +65,14 @@ impl Drop for Handle {
|
||||
}
|
||||
}
|
||||
|
||||
// Common ZX_INFO header
|
||||
#[derive(Default)]
|
||||
#[repr(C)]
|
||||
pub struct zx_info_header_t {
|
||||
pub topic: u32, // identifies the info struct
|
||||
pub avail_topic_size: u16, // “native” size of the struct
|
||||
pub topic_size: u16, // size of the returned struct (<=topic_size)
|
||||
pub avail_count: u32, // number of records the kernel has
|
||||
pub count: u32, // number of records returned (limited by buffer size)
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
#[repr(C)]
|
||||
pub struct zx_record_process_t {
|
||||
pub return_code: c_int,
|
||||
}
|
||||
|
||||
// Returned for topic ZX_INFO_PROCESS
|
||||
#[derive(Default)]
|
||||
#[repr(C)]
|
||||
pub struct zx_info_process_t {
|
||||
pub hdr: zx_info_header_t,
|
||||
pub rec: zx_record_process_t,
|
||||
pub return_code: i64,
|
||||
pub started: bool,
|
||||
pub exited: bool,
|
||||
pub debugger_attached: bool,
|
||||
}
|
||||
|
||||
extern {
|
||||
|
@ -47,6 +47,12 @@ pub(crate) fn emit_unescape_error(
|
||||
.emit();
|
||||
}
|
||||
EscapeError::MoreThanOneChar => {
|
||||
let msg = if mode.is_bytes() {
|
||||
"if you meant to write a byte string literal, use double quotes"
|
||||
} else {
|
||||
"if you meant to write a `str` literal, use double quotes"
|
||||
};
|
||||
|
||||
handler
|
||||
.struct_span_err(
|
||||
span_with_quotes,
|
||||
@ -54,7 +60,7 @@ pub(crate) fn emit_unescape_error(
|
||||
)
|
||||
.span_suggestion(
|
||||
span_with_quotes,
|
||||
"if you meant to write a `str` literal, use double quotes",
|
||||
msg,
|
||||
format!("\"{}\"", lit),
|
||||
Applicability::MachineApplicable,
|
||||
).emit()
|
||||
|
@ -64,7 +64,6 @@ impl CodegenBackend for TheBackend {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
_metadata: EncodedMetadata,
|
||||
_need_metadata_module: bool,
|
||||
_rx: mpsc::Receiver<Box<Any + Send>>
|
||||
) -> Box<Any> {
|
||||
use rustc::hir::def_id::LOCAL_CRATE;
|
||||
|
||||
|
@ -1,40 +0,0 @@
|
||||
error[E0503]: cannot use `y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:17:7
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
| --------- borrow of `y.0` occurs here
|
||||
...
|
||||
LL | Foo::Y(_, ref mut b) => b,
|
||||
| ^^^^^^^^^^^^^^^^^^^^ use of borrowed `y.0`
|
||||
...
|
||||
LL | *a += 1;
|
||||
| ------- borrow later used here
|
||||
|
||||
error[E0503]: cannot use `y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:37:7
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
| --------- borrow of `y.0` occurs here
|
||||
...
|
||||
LL | Foo::Y(ref mut b, _) => b,
|
||||
| ^^^^^^^^^^^^^^^^^^^^ use of borrowed `y.0`
|
||||
...
|
||||
LL | *a += 1;
|
||||
| ------- borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `y.0` as mutable more than once at a time
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:37:14
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
| --------- first mutable borrow occurs here
|
||||
...
|
||||
LL | Foo::Y(ref mut b, _) => b,
|
||||
| ^^^^^^^^^ second mutable borrow occurs here
|
||||
...
|
||||
LL | *a += 1;
|
||||
| ------- first borrow later used here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0499, E0503.
|
||||
For more information about an error, try `rustc --explain E0499`.
|
@ -15,9 +15,7 @@ fn distinct_variant() {
|
||||
// reference.
|
||||
let b = match y {
|
||||
Foo::Y(_, ref mut b) => b,
|
||||
//~^ WARNING cannot use `y`
|
||||
//~| WARNING this error has been downgraded to a warning
|
||||
//~| WARNING this warning will become a hard error in the future
|
||||
//~^ ERROR cannot use `y`
|
||||
Foo::X => panic!()
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
warning[E0503]: cannot use `y` because it was mutably borrowed
|
||||
error[E0503]: cannot use `y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:17:7
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
@ -9,13 +9,9 @@ LL | Foo::Y(_, ref mut b) => b,
|
||||
...
|
||||
LL | *a += 1;
|
||||
| ------- borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error[E0503]: cannot use `y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:37:7
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:35:7
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
| --------- borrow of `y.0` occurs here
|
||||
@ -27,7 +23,7 @@ LL | *a += 1;
|
||||
| ------- borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `y.0` as mutable more than once at a time
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:37:14
|
||||
--> $DIR/borrowck-anon-fields-variant.rs:35:14
|
||||
|
|
||||
LL | Foo::Y(ref mut a, _) => a,
|
||||
| --------- first mutable borrow occurs here
|
||||
@ -38,7 +34,7 @@ LL | Foo::Y(ref mut b, _) => b,
|
||||
LL | *a += 1;
|
||||
| ------- first borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0499, E0503.
|
||||
For more information about an error, try `rustc --explain E0499`.
|
||||
|
@ -1,366 +0,0 @@
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-describe-lvalue.rs:262:13
|
||||
|
|
||||
LL | let y = &mut x;
|
||||
| ------ first mutable borrow occurs here
|
||||
LL | &mut x;
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | *y = 1;
|
||||
| ------ first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-describe-lvalue.rs:272:20
|
||||
|
|
||||
LL | let y = &mut x;
|
||||
| ------ first mutable borrow occurs here
|
||||
LL | &mut x;
|
||||
| ^^^^^^ second mutable borrow occurs here
|
||||
LL | *y = 1;
|
||||
| ------ first borrow later used here
|
||||
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/borrowck-describe-lvalue.rs:270:16
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
LL | / || {
|
||||
LL | | let y = &mut x;
|
||||
LL | | &mut x;
|
||||
LL | | *y = 1;
|
||||
LL | | drop(y);
|
||||
LL | | }
|
||||
| |_________________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
|
||||
error[E0503]: cannot use `f.x` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:41:9
|
||||
|
|
||||
LL | let x = f.x();
|
||||
| - borrow of `f` occurs here
|
||||
LL | f.x;
|
||||
| ^^^ use of borrowed `f`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `g.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:48:9
|
||||
|
|
||||
LL | let x = g.x();
|
||||
| - borrow of `g` occurs here
|
||||
LL | g.0;
|
||||
| ^^^ use of borrowed `g`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `h.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:55:9
|
||||
|
|
||||
LL | let x = &mut h.0;
|
||||
| -------- borrow of `h.0` occurs here
|
||||
LL | h.0;
|
||||
| ^^^ use of borrowed `h.0`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `e.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:63:20
|
||||
|
|
||||
LL | let x = e.x();
|
||||
| - borrow of `e` occurs here
|
||||
LL | match e {
|
||||
LL | Baz::X(value) => value
|
||||
| ^^^^^ use of borrowed `e`
|
||||
LL | };
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `u.a` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:71:9
|
||||
|
|
||||
LL | let x = &mut u.a;
|
||||
| -------- borrow of `u.a` occurs here
|
||||
LL | u.a;
|
||||
| ^^^ use of borrowed `u.a`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `f.x` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:78:9
|
||||
|
|
||||
LL | let x = f.x();
|
||||
| - borrow of `*f` occurs here
|
||||
LL | f.x;
|
||||
| ^^^ use of borrowed `*f`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `g.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:85:9
|
||||
|
|
||||
LL | let x = g.x();
|
||||
| - borrow of `*g` occurs here
|
||||
LL | g.0;
|
||||
| ^^^ use of borrowed `*g`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `h.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:92:9
|
||||
|
|
||||
LL | let x = &mut h.0;
|
||||
| -------- borrow of `h.0` occurs here
|
||||
LL | h.0;
|
||||
| ^^^ use of borrowed `h.0`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `e.0` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:100:20
|
||||
|
|
||||
LL | let x = e.x();
|
||||
| - borrow of `*e` occurs here
|
||||
LL | match *e {
|
||||
LL | Baz::X(value) => value
|
||||
| ^^^^^ use of borrowed `*e`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `u.a` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:109:9
|
||||
|
|
||||
LL | let x = &mut u.a;
|
||||
| -------- borrow of `u.a` occurs here
|
||||
LL | u.a;
|
||||
| ^^^ use of borrowed `u.a`
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:117:15
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
LL | match v {
|
||||
LL | &[x, _, .., _, _] => println!("{}", x),
|
||||
| ^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:122:18
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[_, x, .., _, _] => println!("{}", x),
|
||||
| ^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:127:25
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[_, _, .., x, _] => println!("{}", x),
|
||||
| ^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:132:28
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[_, _, .., _, x] => println!("{}", x),
|
||||
| ^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:143:15
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
LL | match v {
|
||||
LL | &[x @ ..] => println!("{:?}", x),
|
||||
| ^^^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:148:18
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[_, x @ ..] => println!("{:?}", x),
|
||||
| ^^^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:153:15
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[x @ .., _] => println!("{:?}", x),
|
||||
| ^^^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[..]` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:158:18
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
...
|
||||
LL | &[_, x @ .., _] => println!("{:?}", x),
|
||||
| ^^^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `e` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:171:13
|
||||
|
|
||||
LL | let x = &mut e;
|
||||
| ------ borrow of `e` occurs here
|
||||
LL | match e {
|
||||
LL | E::A(ref ax) =>
|
||||
| ^^^^^^^^^^^^ use of borrowed `e`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `e.0` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:171:18
|
||||
|
|
||||
LL | let x = &mut e;
|
||||
| ------ mutable borrow occurs here
|
||||
LL | match e {
|
||||
LL | E::A(ref ax) =>
|
||||
| ^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `e.x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:175:23
|
||||
|
|
||||
LL | let x = &mut e;
|
||||
| ------ mutable borrow occurs here
|
||||
...
|
||||
LL | E::B { x: ref bx } =>
|
||||
| ^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `s.y.0` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:188:22
|
||||
|
|
||||
LL | let x = &mut s;
|
||||
| ------ mutable borrow occurs here
|
||||
LL | match s {
|
||||
LL | S { y: (ref y0, _), .. } =>
|
||||
| ^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `s.x.y` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:194:28
|
||||
|
|
||||
LL | let x = &mut s;
|
||||
| ------ mutable borrow occurs here
|
||||
...
|
||||
LL | S { x: F { y: ref x0, .. }, .. } =>
|
||||
| ^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0503]: cannot use `*v` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:240:9
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
LL | v[0].y;
|
||||
| ^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[_].y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:240:9
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
LL | v[0].y;
|
||||
| ^^^^^^ use of borrowed `v`
|
||||
...
|
||||
LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `v[..].x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:251:24
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ mutable borrow occurs here
|
||||
LL | match v {
|
||||
LL | &[_, F {x: ref xf, ..}] => println!("{}", xf),
|
||||
| ^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:210:29
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
LL | let p: &'a u8 = &*block.current;
|
||||
| ^^^^^^^^^^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:227:33
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
LL | let p : *const u8 = &*(*block).current;
|
||||
| ^^^^^^^^^^^^^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0382]: use of moved value: `x`
|
||||
--> $DIR/borrowck-describe-lvalue.rs:282:22
|
||||
|
|
||||
LL | drop(x);
|
||||
| - value moved here
|
||||
LL | drop(x);
|
||||
| ^ value used here after move
|
||||
|
|
||||
= note: move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
|
||||
|
||||
error: aborting due to 32 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0382, E0499, E0502, E0503.
|
||||
For more information about an error, try `rustc --explain E0382`.
|
@ -208,10 +208,8 @@ fn main() {
|
||||
fn bump<'a>(mut block: &mut Block<'a>) {
|
||||
let x = &mut block;
|
||||
let p: &'a u8 = &*block.current;
|
||||
//~^ WARNING cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
//~| this error has been downgraded
|
||||
//~| this warning will become a hard error in the future
|
||||
// Warning because of issue rust#38899
|
||||
//~^ ERROR cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
// See issue rust#38899
|
||||
drop(x);
|
||||
}
|
||||
}
|
||||
@ -225,10 +223,8 @@ fn main() {
|
||||
unsafe fn bump2(mut block: *mut Block2) {
|
||||
let x = &mut block;
|
||||
let p : *const u8 = &*(*block).current;
|
||||
//~^ WARNING cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
//~| this error has been downgraded
|
||||
//~| this warning will become a hard error in the future
|
||||
// Warning because of issue rust#38899
|
||||
//~^ ERROR cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
// See issue rust#38899
|
||||
drop(x);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-describe-lvalue.rs:262:13
|
||||
--> $DIR/borrowck-describe-lvalue.rs:258:13
|
||||
|
|
||||
LL | let y = &mut x;
|
||||
| ------ first mutable borrow occurs here
|
||||
@ -9,7 +9,7 @@ LL | *y = 1;
|
||||
| ------ first borrow later used here
|
||||
|
||||
error[E0499]: cannot borrow `x` as mutable more than once at a time
|
||||
--> $DIR/borrowck-describe-lvalue.rs:272:20
|
||||
--> $DIR/borrowck-describe-lvalue.rs:268:20
|
||||
|
|
||||
LL | let y = &mut x;
|
||||
| ------ first mutable borrow occurs here
|
||||
@ -19,7 +19,7 @@ LL | *y = 1;
|
||||
| ------ first borrow later used here
|
||||
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/borrowck-describe-lvalue.rs:270:16
|
||||
--> $DIR/borrowck-describe-lvalue.rs:266:16
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
@ -295,7 +295,7 @@ LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error[E0503]: cannot use `*v` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:240:9
|
||||
--> $DIR/borrowck-describe-lvalue.rs:236:9
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
@ -306,7 +306,7 @@ LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `v[_].y` because it was mutably borrowed
|
||||
--> $DIR/borrowck-describe-lvalue.rs:240:9
|
||||
--> $DIR/borrowck-describe-lvalue.rs:236:9
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ borrow of `v` occurs here
|
||||
@ -317,7 +317,7 @@ LL | drop(x);
|
||||
| - borrow later used here
|
||||
|
||||
error[E0502]: cannot borrow `v[..].x` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:251:24
|
||||
--> $DIR/borrowck-describe-lvalue.rs:247:24
|
||||
|
|
||||
LL | let x = &mut v;
|
||||
| ------ mutable borrow occurs here
|
||||
@ -328,7 +328,7 @@ LL | &[_, F {x: ref xf, ..}] => println!("{}", xf),
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
warning[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:210:29
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
@ -338,13 +338,9 @@ LL | let p: &'a u8 = &*block.current;
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
warning[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:227:33
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-describe-lvalue.rs:225:33
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
@ -353,13 +349,9 @@ LL | let p : *const u8 = &*(*block).current;
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error[E0382]: use of moved value: `x`
|
||||
--> $DIR/borrowck-describe-lvalue.rs:282:22
|
||||
--> $DIR/borrowck-describe-lvalue.rs:278:22
|
||||
|
|
||||
LL | drop(x);
|
||||
| - value moved here
|
||||
@ -368,7 +360,7 @@ LL | drop(x);
|
||||
|
|
||||
= note: move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
|
||||
|
||||
error: aborting due to 30 previous errors
|
||||
error: aborting due to 32 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0382, E0499, E0502, E0503.
|
||||
For more information about an error, try `rustc --explain E0382`.
|
||||
|
@ -1,14 +0,0 @@
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-migrate-to-nll.rs:29:21
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
LL | let p: &'a u8 = &*block.current;
|
||||
| ^^^^^^^^^^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0502`.
|
@ -1,36 +0,0 @@
|
||||
// This is a test of the borrowck migrate mode. It leverages #38899, a
|
||||
// bug that is fixed by NLL: this code is (unsoundly) accepted by
|
||||
// AST-borrowck, but is correctly rejected by the NLL borrowck.
|
||||
//
|
||||
// Therefore, for backwards-compatiblity, under borrowck=migrate the
|
||||
// NLL checks will be emitted as *warnings*.
|
||||
//
|
||||
// In Rust 2018, no errors will be downgraded to warnings.
|
||||
|
||||
// NLL mode makes this compile-fail; we cannot currently encode a
|
||||
// test that is run-pass or compile-fail based on compare-mode. So
|
||||
// just ignore it instead:
|
||||
|
||||
// ignore-compare-mode-nll
|
||||
// ignore-compare-mode-polonius
|
||||
|
||||
// revisions: zflag edition
|
||||
//[zflag]compile-flags: -Z borrowck=migrate
|
||||
//[edition]edition:2018
|
||||
//[zflag] check-pass
|
||||
|
||||
pub struct Block<'a> {
|
||||
current: &'a u8,
|
||||
unrelated: &'a u8,
|
||||
}
|
||||
|
||||
fn bump<'a>(mut block: &mut Block<'a>) {
|
||||
let x = &mut block;
|
||||
let p: &'a u8 = &*block.current;
|
||||
//[edition]~^ ERROR cannot borrow `*block.current` as immutable
|
||||
// (use `x` and `p` so enabling NLL doesn't assign overly short lifetimes)
|
||||
drop(x);
|
||||
drop(p);
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,15 +0,0 @@
|
||||
warning[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowck-migrate-to-nll.rs:29:21
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
LL | let p: &'a u8 = &*block.current;
|
||||
| ^^^^^^^^^^^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL | drop(x);
|
||||
| - mutable borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
@ -0,0 +1,7 @@
|
||||
fn main() {
|
||||
let f = move || {};
|
||||
let _action = move || {
|
||||
|| f() // The `nested` closure
|
||||
//~^ ERROR lifetime may not live long enough
|
||||
};
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-53432-nested-closure-outlives-borrowed-value.rs:4:9
|
||||
|
|
||||
LL | let _action = move || {
|
||||
| -------
|
||||
| | |
|
||||
| | return type of closure is [closure@$DIR/issue-53432-nested-closure-outlives-borrowed-value.rs:4:9: 4:15 f:&'2 [closure@$DIR/issue-53432-nested-closure-outlives-borrowed-value.rs:2:13: 2:23]]
|
||||
| lifetime `'1` represents this closure's body
|
||||
LL | || f() // The `nested` closure
|
||||
| ^^^^^^ returning this value requires that `'1` must outlive `'2`
|
||||
|
|
||||
= note: closure implements `Fn`, so references to captured variables can't escape the closure
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,328 +0,0 @@
|
||||
error[E0493]: destructors cannot be evaluated at compile-time
|
||||
--> $DIR/min_const_fn.rs:37:25
|
||||
|
|
||||
LL | const fn into_inner(self) -> T { self.0 }
|
||||
| ^^^^ constant functions cannot evaluate destructors
|
||||
|
||||
error[E0723]: mutable references in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:39:36
|
||||
|
|
||||
LL | const fn get_mut(&mut self) -> &mut T { &mut self.0 }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0493]: destructors cannot be evaluated at compile-time
|
||||
--> $DIR/min_const_fn.rs:44:28
|
||||
|
|
||||
LL | const fn into_inner_lt(self) -> T { self.0 }
|
||||
| ^^^^ constant functions cannot evaluate destructors
|
||||
|
||||
error[E0723]: mutable references in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:46:42
|
||||
|
|
||||
LL | const fn get_mut_lt(&'a mut self) -> &mut T { &mut self.0 }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0493]: destructors cannot be evaluated at compile-time
|
||||
--> $DIR/min_const_fn.rs:51:27
|
||||
|
|
||||
LL | const fn into_inner_s(self) -> T { self.0 }
|
||||
| ^^^^ constant functions cannot evaluate destructors
|
||||
|
||||
error[E0723]: mutable references in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:53:38
|
||||
|
|
||||
LL | const fn get_mut_s(&mut self) -> &mut T { &mut self.0 }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: mutable references in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:58:39
|
||||
|
|
||||
LL | const fn get_mut_sq(&mut self) -> &mut T { &mut self.0 }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:76:16
|
||||
|
|
||||
LL | const fn foo11<T: std::fmt::Display>(t: T) -> T { t }
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:78:18
|
||||
|
|
||||
LL | const fn foo11_2<T: Send>(t: T) -> T { t }
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:80:33
|
||||
|
|
||||
LL | const fn foo19(f: f32) -> f32 { f * 2.0 }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:82:35
|
||||
|
|
||||
LL | const fn foo19_2(f: f32) -> f32 { 2.0 - f }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int and `bool` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:84:35
|
||||
|
|
||||
LL | const fn foo19_3(f: f32) -> f32 { -f }
|
||||
| ^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:86:43
|
||||
|
|
||||
LL | const fn foo19_4(f: f32, g: f32) -> f32 { f / g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: cannot access `static` items in const fn
|
||||
--> $DIR/min_const_fn.rs:90:27
|
||||
|
|
||||
LL | const fn foo25() -> u32 { BAR }
|
||||
| ^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: cannot access `static` items in const fn
|
||||
--> $DIR/min_const_fn.rs:91:36
|
||||
|
|
||||
LL | const fn foo26() -> &'static u32 { &BAR }
|
||||
| ^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: casting pointers to ints is unstable in const fn
|
||||
--> $DIR/min_const_fn.rs:92:42
|
||||
|
|
||||
LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: casting pointers to ints is unstable in const fn
|
||||
--> $DIR/min_const_fn.rs:94:63
|
||||
|
|
||||
LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: casting pointers to ints is unstable in const fn
|
||||
--> $DIR/min_const_fn.rs:96:42
|
||||
|
|
||||
LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: casting pointers to ints is unstable in const fn
|
||||
--> $DIR/min_const_fn.rs:98:63
|
||||
|
|
||||
LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: loops and conditional expressions are not stable in const fn
|
||||
--> $DIR/min_const_fn.rs:100:38
|
||||
|
|
||||
LL | const fn foo30_4(b: bool) -> usize { if b { 1 } else { 42 } }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: loops are not allowed in const fn
|
||||
--> $DIR/min_const_fn.rs:102:29
|
||||
|
|
||||
LL | const fn foo30_5(b: bool) { while b { } }
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: loops and conditional expressions are not stable in const fn
|
||||
--> $DIR/min_const_fn.rs:105:44
|
||||
|
|
||||
LL | const fn foo36(a: bool, b: bool) -> bool { a && b }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: loops and conditional expressions are not stable in const fn
|
||||
--> $DIR/min_const_fn.rs:107:44
|
||||
|
|
||||
LL | const fn foo37(a: bool, b: bool) -> bool { a || b }
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: mutable references in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:109:14
|
||||
|
|
||||
LL | const fn inc(x: &mut i32) { *x += 1 }
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:114:6
|
||||
|
|
||||
LL | impl<T: std::fmt::Debug> Foo<T> {
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:119:6
|
||||
|
|
||||
LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:124:6
|
||||
|
|
||||
LL | impl<T: Sync + Sized> Foo<T> {
|
||||
| ^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: `impl Trait` in const fn is unstable
|
||||
--> $DIR/min_const_fn.rs:130:24
|
||||
|
|
||||
LL | const fn no_rpit2() -> AlanTuring<impl std::fmt::Debug> { AlanTuring(0) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:132:34
|
||||
|
|
||||
LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:134:22
|
||||
|
|
||||
LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: `impl Trait` in const fn is unstable
|
||||
--> $DIR/min_const_fn.rs:135:23
|
||||
|
|
||||
LL | const fn no_rpit() -> impl std::fmt::Debug {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:136:23
|
||||
|
|
||||
LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
||||
| ^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:137:32
|
||||
|
|
||||
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0515]: cannot return reference to temporary value
|
||||
--> $DIR/min_const_fn.rs:137:63
|
||||
|
|
||||
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
| ^--
|
||||
| ||
|
||||
| |temporary value created here
|
||||
| returns a reference to data owned by the current function
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:145:41
|
||||
|
|
||||
LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:148:21
|
||||
|
|
||||
LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||
| ^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:150:27
|
||||
|
|
||||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
| ^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 37 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0515, E0723.
|
||||
For more information about an error, try `rustc --explain E0515`.
|
@ -136,9 +136,7 @@ const fn no_rpit() -> impl std::fmt::Debug {} //~ ERROR `impl Trait` in const fn
|
||||
const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {} //~ ERROR trait bounds other than `Sized`
|
||||
const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
//~^ ERROR trait bounds other than `Sized`
|
||||
//~| WARNING cannot return reference to temporary value
|
||||
//~| WARNING this error has been downgraded to a warning
|
||||
//~| WARNING this warning will become a hard error in the future
|
||||
//~| ERROR cannot return reference to temporary value
|
||||
|
||||
const fn no_unsafe() { unsafe {} }
|
||||
|
||||
|
@ -286,7 +286,7 @@ LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
warning[E0515]: cannot return reference to temporary value
|
||||
error[E0515]: cannot return reference to temporary value
|
||||
--> $DIR/min_const_fn.rs:137:63
|
||||
|
|
||||
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
@ -294,13 +294,9 @@ LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
| ||
|
||||
| |temporary value created here
|
||||
| returns a reference to data owned by the current function
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:145:41
|
||||
--> $DIR/min_const_fn.rs:143:41
|
||||
|
|
||||
LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -309,7 +305,7 @@ LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:148:21
|
||||
--> $DIR/min_const_fn.rs:146:21
|
||||
|
|
||||
LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||
| ^^
|
||||
@ -318,7 +314,7 @@ LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:150:27
|
||||
--> $DIR/min_const_fn.rs:148:27
|
||||
|
|
||||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
| ^^^^
|
||||
@ -326,7 +322,7 @@ LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 36 previous errors
|
||||
error: aborting due to 37 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0515, E0723.
|
||||
For more information about an error, try `rustc --explain E0515`.
|
||||
|
@ -1,31 +0,0 @@
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn_dyn.rs:9:5
|
||||
|
|
||||
LL | x.0.field;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn_dyn.rs:12:66
|
||||
|
|
||||
LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
| ^^
|
||||
|
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/min_const_fn_dyn.rs:12:67
|
||||
|
|
||||
LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
| -^ - temporary value is freed at the end of this statement
|
||||
| ||
|
||||
| |creates a temporary which is freed while still in use
|
||||
| cast requires that borrow lasts for `'static`
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0716, E0723.
|
||||
For more information about an error, try `rustc --explain E0716`.
|
@ -11,8 +11,6 @@ const fn no_inner_dyn_trait2(x: Hide) {
|
||||
}
|
||||
const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
//~^ ERROR trait bounds other than `Sized`
|
||||
//~| WARNING temporary value dropped while borrowed
|
||||
//~| WARNING this error has been downgraded to a warning
|
||||
//~| WARNING this warning will become a hard error in the future
|
||||
//~| ERROR temporary value dropped while borrowed
|
||||
|
||||
fn main() {}
|
||||
|
@ -16,7 +16,7 @@ LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
= note: for more information, see issue https://github.com/rust-lang/rust/issues/57563
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
warning[E0716]: temporary value dropped while borrowed
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/min_const_fn_dyn.rs:12:67
|
||||
|
|
||||
LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
@ -24,12 +24,8 @@ LL | const fn no_inner_dyn_trait_ret() -> Hide { Hide(HasDyn { field: &0 }) }
|
||||
| ||
|
||||
| |creates a temporary which is freed while still in use
|
||||
| cast requires that borrow lasts for `'static`
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0716, E0723.
|
||||
For more information about an error, try `rustc --explain E0716`.
|
||||
|
@ -1,20 +1,18 @@
|
||||
// There isn't a great way to test feature(nll), since it just disables migrate
|
||||
// mode and changes some error messages. We just test for migrate mode.
|
||||
// mode and changes some error messages.
|
||||
|
||||
// FIXME(Centril): This test is probably obsolete now and `nll` should become
|
||||
// `accepted`.
|
||||
|
||||
// Don't use compare-mode=nll, since that turns on NLL.
|
||||
// ignore-compare-mode-nll
|
||||
// ignore-compare-mode-polonius
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_error]
|
||||
fn main() { //~ ERROR compilation successful
|
||||
fn main() {
|
||||
let mut x = (33, &0);
|
||||
|
||||
let m = &mut x;
|
||||
let p = &*x.1;
|
||||
//~^ WARNING cannot borrow
|
||||
//~| WARNING this error has been downgraded to a warning
|
||||
//~| WARNING this warning will become a hard error in the future
|
||||
//~^ ERROR cannot borrow
|
||||
m;
|
||||
}
|
||||
|
@ -1,29 +1,13 @@
|
||||
warning[E0502]: cannot borrow `*x.1` as immutable because it is also borrowed as mutable
|
||||
error[E0502]: cannot borrow `*x.1` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/feature-gate-nll.rs:15:13
|
||||
|
|
||||
LL | let m = &mut x;
|
||||
| ------ mutable borrow occurs here
|
||||
LL | let p = &*x.1;
|
||||
| ^^^^^ immutable borrow occurs here
|
||||
...
|
||||
LL |
|
||||
LL | m;
|
||||
| - mutable borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: compilation successful
|
||||
--> $DIR/feature-gate-nll.rs:11:1
|
||||
|
|
||||
LL | / fn main() {
|
||||
LL | | let mut x = (33, &0);
|
||||
LL | |
|
||||
LL | | let m = &mut x;
|
||||
... |
|
||||
LL | | m;
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,8 +7,6 @@
|
||||
// reaches the panic code when executed, despite the compiler warning
|
||||
// about that match arm being unreachable.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
fn main() {
|
||||
let b = &mut true;
|
||||
match b {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0382]: use of moved value: `b`
|
||||
--> $DIR/issue-27282-move-match-input-into-guard.rs:18:14
|
||||
--> $DIR/issue-27282-move-match-input-into-guard.rs:16:14
|
||||
|
|
||||
LL | let b = &mut true;
|
||||
| - move occurs because `b` has type `&mut bool`, which does not implement the `Copy` trait
|
||||
|
@ -1,11 +1,6 @@
|
||||
// Issue 27282: Example 1: This sidesteps the AST checks disallowing
|
||||
// mutable borrows in match guards by hiding the mutable borrow in a
|
||||
// guard behind a move (of the ref mut pattern id) within a closure.
|
||||
//
|
||||
// This example is not rejected by AST borrowck (and then reliably
|
||||
// segfaults when executed).
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
fn main() {
|
||||
match Some(&4) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0507]: cannot move out of `foo` in pattern guard
|
||||
--> $DIR/issue-27282-move-ref-mut-into-guard.rs:14:19
|
||||
--> $DIR/issue-27282-move-ref-mut-into-guard.rs:9:19
|
||||
|
|
||||
LL | if { (|| { let bar = foo; bar.take() })(); false } => {},
|
||||
| ^^ ---
|
||||
|
@ -9,8 +9,6 @@
|
||||
// diverges, and therefore a single final fake-read at the very end
|
||||
// after the final match arm would not suffice.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
struct ForceFnOnce;
|
||||
|
||||
fn main() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0510]: cannot mutably borrow `x` in match guard
|
||||
--> $DIR/issue-27282-mutate-before-diverging-arm-1.rs:23:14
|
||||
--> $DIR/issue-27282-mutate-before-diverging-arm-1.rs:21:14
|
||||
|
|
||||
LL | match x {
|
||||
| - value is immutable in match guard
|
||||
|
@ -13,8 +13,6 @@
|
||||
// occurs in the pattern-match itself, and not in the guard
|
||||
// expression.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
struct ForceFnOnce;
|
||||
|
||||
fn main() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0510]: cannot mutably borrow `x` in match guard
|
||||
--> $DIR/issue-27282-mutate-before-diverging-arm-2.rs:28:18
|
||||
--> $DIR/issue-27282-mutate-before-diverging-arm-2.rs:26:18
|
||||
|
|
||||
LL | match x {
|
||||
| - value is immutable in match guard
|
||||
|
@ -8,7 +8,7 @@
|
||||
// This case is interesting because a borrow of **x is untracked, because **x is
|
||||
// immutable. However, for matches we care that **x refers to the same value
|
||||
// until we have chosen a match arm.
|
||||
#![feature(nll)]
|
||||
|
||||
struct ForceFnOnce;
|
||||
fn main() {
|
||||
let mut x = &mut &Some(&2);
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(nll)]
|
||||
|
||||
// test for https://github.com/rust-lang/rust/issues/29723
|
||||
|
||||
fn main() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0382]: use of moved value: `s`
|
||||
--> $DIR/issue-29723.rs:12:13
|
||||
--> $DIR/issue-29723.rs:10:13
|
||||
|
|
||||
LL | let s = String::new();
|
||||
| - move occurs because `s` has type `std::string::String`, which does not implement the `Copy` trait
|
||||
|
@ -1,4 +1,4 @@
|
||||
warning: captured variable cannot escape `FnMut` closure body
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-1.rs:11:9
|
||||
|
|
||||
LL | || {
|
||||
@ -8,15 +8,6 @@ LL | &mut x
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: compilation successful
|
||||
--> $DIR/issue-40510-1.rs:20:1
|
||||
|
|
||||
LL | fn main() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,13 +0,0 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-1.rs:11:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
LL | &mut x
|
||||
| ^^^^^^ returns a reference to a captured variable which escapes the closure body
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,21 +1,12 @@
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(unused)]
|
||||
|
||||
// revisions: migrate nll
|
||||
#![cfg_attr(nll, feature(nll))]
|
||||
|
||||
fn f() {
|
||||
let mut x: Box<()> = Box::new(());
|
||||
|
||||
|| {
|
||||
&mut x
|
||||
};
|
||||
//[migrate]~^^ WARNING captured variable cannot escape `FnMut` closure body
|
||||
//[migrate]~| WARNING this error has been downgraded to a warning
|
||||
//[migrate]~| WARNING this warning will become a hard error in the future
|
||||
//[nll]~^^^^^ ERROR captured variable cannot escape `FnMut` closure body
|
||||
//~^^ ERROR captured variable cannot escape `FnMut` closure body
|
||||
}
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {}
|
||||
//[migrate]~^ ERROR
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-1.rs:11:9
|
||||
--> $DIR/issue-40510-1.rs:7:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
@ -1,4 +1,4 @@
|
||||
warning: captured variable cannot escape `FnMut` closure body
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-3.rs:11:9
|
||||
|
|
||||
LL | || {
|
||||
@ -10,15 +10,6 @@ LL | | }
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: compilation successful
|
||||
--> $DIR/issue-40510-3.rs:22:1
|
||||
|
|
||||
LL | fn main() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-3.rs:11:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
LL | / || {
|
||||
LL | | x.push(())
|
||||
LL | | }
|
||||
| |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,9 +1,5 @@
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(unused)]
|
||||
|
||||
// revisions: migrate nll
|
||||
#![cfg_attr(nll, feature(nll))]
|
||||
|
||||
fn f() {
|
||||
let mut x: Vec<()> = Vec::new();
|
||||
|
||||
@ -11,13 +7,8 @@ fn f() {
|
||||
|| {
|
||||
x.push(())
|
||||
}
|
||||
//[migrate]~^^^ WARNING captured variable cannot escape `FnMut` closure body
|
||||
//[migrate]~| WARNING this error has been downgraded to a warning
|
||||
//[migrate]~| WARNING this warning will become a hard error in the future
|
||||
//[nll]~^^^^^^ ERROR captured variable cannot escape `FnMut` closure body
|
||||
//~^^^ ERROR captured variable cannot escape `FnMut` closure body
|
||||
};
|
||||
}
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {}
|
||||
//[migrate]~^ ERROR
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-40510-3.rs:11:9
|
||||
--> $DIR/issue-40510-3.rs:7:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
@ -1,5 +1,4 @@
|
||||
#![allow(unused)]
|
||||
#![feature(nll)]
|
||||
|
||||
// ignore-tidy-linelength
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0502]: cannot borrow `u` (via `u.z.c`) as immutable because it is also borrowed as mutable (via `u.s.a`)
|
||||
--> $DIR/issue-45157.rs:29:20
|
||||
--> $DIR/issue-45157.rs:28:20
|
||||
|
|
||||
LL | let mref = &mut u.s.a;
|
||||
| ---------- mutable borrow occurs here (via `u.s.a`)
|
||||
|
@ -1,60 +0,0 @@
|
||||
warning[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:52:5
|
||||
|
|
||||
LL | fn scribbled<'a>(s: Scribble<'a>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *s.0
|
||||
| ^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
warning[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:63:5
|
||||
|
|
||||
LL | fn boxed_scribbled<'a>(s: Box<Scribble<'a>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(*s).0
|
||||
| ^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
warning[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:74:5
|
||||
|
|
||||
LL | fn boxed_boxed_scribbled<'a>(s: Box<Box<Scribble<'a>>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(**s).0
|
||||
| ^^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: compilation successful
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:81:1
|
||||
|
|
||||
LL | / fn main() {
|
||||
LL | | let mut x = 1;
|
||||
LL | | {
|
||||
LL | | let mut long_lived = Scribble(&mut x);
|
||||
... |
|
||||
LL | | *boxed_boxed_scribbled(Box::new(Box::new(Scribble(&mut x)))) += 10;
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0713`.
|
@ -1,33 +1,30 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:52:5
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:34:5
|
||||
|
|
||||
LL | fn scribbled<'a>(s: Scribble<'a>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *s.0
|
||||
| ^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:63:5
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:39:5
|
||||
|
|
||||
LL | fn boxed_scribbled<'a>(s: Box<Scribble<'a>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(*s).0
|
||||
| ^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:74:5
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:44:5
|
||||
|
|
||||
LL | fn boxed_boxed_scribbled<'a>(s: Box<Box<Scribble<'a>>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(**s).0
|
||||
| ^^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
|
@ -1,28 +1,14 @@
|
||||
// rust-lang/rust#45696: This test is checking that we *cannot* return
|
||||
// mutable borrows that would be scribbled over by destructors before
|
||||
// the return occurs.
|
||||
//
|
||||
// We will explicitly test NLL, and migration modes;
|
||||
// thus we will also skip the automated compare-mode=nll.
|
||||
|
||||
// revisions: nll migrate
|
||||
// ignore-compare-mode-nll
|
||||
// ignore-compare-mode-polonius
|
||||
|
||||
// This test is going to pass in the migrate revision, because the AST-borrowck
|
||||
// accepted this code in the past (see notes below). So we use `#[rustc_error]`
|
||||
// to keep the outcome as an error in all scenarios, and rely on the stderr
|
||||
// files to show what the actual behavior is. (See rust-lang/rust#49855.)
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#![cfg_attr(nll, feature(nll))]
|
||||
|
||||
struct Scribble<'a>(&'a mut u32);
|
||||
|
||||
impl<'a> Drop for Scribble<'a> { fn drop(&mut self) { *self.0 = 42; } }
|
||||
|
||||
// this is okay, in both AST-borrowck and NLL: The `Scribble` here *has*
|
||||
// to strictly outlive `'a`
|
||||
// this is okay: The `Scribble` here *has* to strictly outlive `'a`
|
||||
fn borrowed_scribble<'a>(s: &'a mut Scribble) -> &'a mut u32 {
|
||||
&mut *s.0
|
||||
}
|
||||
@ -44,41 +30,21 @@ fn boxed_boxed_borrowed_scribble<'a>(s: Box<Box<&'a mut Scribble>>) -> &'a mut u
|
||||
// * (Maybe in the future the two-phase borrows system will be
|
||||
// extended to support this case. But for now, it is an error in
|
||||
// NLL, even with two-phase borrows.)
|
||||
//
|
||||
// In any case, the AST-borrowck was not smart enough to know that
|
||||
// this should be an error. (Which is perhaps the essence of why
|
||||
// rust-lang/rust#45696 arose in the first place.)
|
||||
fn scribbled<'a>(s: Scribble<'a>) -> &'a mut u32 {
|
||||
&mut *s.0 //[nll]~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~^ WARNING borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~| WARNING this error has been downgraded to a warning for backwards compatibility
|
||||
//[migrate]~| WARNING this represents potential undefined behavior in your code
|
||||
&mut *s.0 //~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
}
|
||||
|
||||
// This, by analogy to previous case, is *also* not okay.
|
||||
//
|
||||
// (But again, AST-borrowck was not smart enogh to know that this
|
||||
// should be an error.)
|
||||
fn boxed_scribbled<'a>(s: Box<Scribble<'a>>) -> &'a mut u32 {
|
||||
&mut *(*s).0 //[nll]~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~^ WARNING borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~| WARNING this error has been downgraded to a warning for backwards compatibility
|
||||
//[migrate]~| WARNING this represents potential undefined behavior in your code
|
||||
&mut *(*s).0 //~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
}
|
||||
|
||||
// This, by analogy to previous case, is *also* not okay.
|
||||
//
|
||||
// (But again, AST-borrowck was not smart enogh to know that this
|
||||
// should be an error.)
|
||||
fn boxed_boxed_scribbled<'a>(s: Box<Box<Scribble<'a>>>) -> &'a mut u32 {
|
||||
&mut *(**s).0 //[nll]~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~^ WARNING borrow may still be in use when destructor runs [E0713]
|
||||
//[migrate]~| WARNING this error has been downgraded to a warning for backwards compatibility
|
||||
//[migrate]~| WARNING this represents potential undefined behavior in your code
|
||||
&mut *(**s).0 //~ ERROR borrow may still be in use when destructor runs [E0713]
|
||||
}
|
||||
|
||||
#[rustc_error]
|
||||
fn main() { //[migrate]~ ERROR compilation successful
|
||||
fn main() {
|
||||
let mut x = 1;
|
||||
{
|
||||
let mut long_lived = Scribble(&mut x);
|
||||
|
@ -0,0 +1,33 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:34:5
|
||||
|
|
||||
LL | fn scribbled<'a>(s: Scribble<'a>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *s.0
|
||||
| ^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:39:5
|
||||
|
|
||||
LL | fn boxed_scribbled<'a>(s: Box<Scribble<'a>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(*s).0
|
||||
| ^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-45696-scribble-on-boxed-borrow.rs:44:5
|
||||
|
|
||||
LL | fn boxed_boxed_scribbled<'a>(s: Box<Box<Scribble<'a>>>) -> &'a mut u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | &mut *(**s).0
|
||||
| ^^^^^^^^^^^^^ returning this value requires that `*s.0` is borrowed for `'a`
|
||||
LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.0`, because the type `Scribble<'_>` implements the `Drop` trait
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0713`.
|
@ -1,18 +0,0 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-49824.rs:10:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
LL | / || {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | let _y = &mut x;
|
||||
LL | | }
|
||||
| |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,16 +1,8 @@
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
// This test checks that a warning occurs with migrate mode.
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {
|
||||
//~^ ERROR compilation successful
|
||||
let mut x = 0;
|
||||
|| {
|
||||
|| {
|
||||
//~^ WARNING captured variable cannot escape `FnMut` closure body
|
||||
//~| WARNING this error has been downgraded to a warning
|
||||
//~| WARNING this warning will become a hard error in the future
|
||||
//~^ ERROR captured variable cannot escape `FnMut` closure body
|
||||
let _y = &mut x;
|
||||
}
|
||||
};
|
||||
|
@ -1,33 +1,16 @@
|
||||
warning: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-49824.rs:10:9
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-49824.rs:4:9
|
||||
|
|
||||
LL | || {
|
||||
| - inferred to be a `FnMut` closure
|
||||
LL | / || {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | let _y = &mut x;
|
||||
LL | | }
|
||||
| |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body
|
||||
|
|
||||
= note: `FnMut` closures only have access to their captured variables while they are executing...
|
||||
= note: ...therefore, they cannot allow references to captured variables to escape
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: compilation successful
|
||||
--> $DIR/issue-49824.rs:6:1
|
||||
|
|
||||
LL | / fn main() {
|
||||
LL | |
|
||||
LL | | let mut x = 0;
|
||||
LL | | || {
|
||||
... |
|
||||
LL | | };
|
||||
LL | | }
|
||||
| |_^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
9
src/test/ui/issues/issue-64732.rs
Normal file
9
src/test/ui/issues/issue-64732.rs
Normal file
@ -0,0 +1,9 @@
|
||||
#![allow(unused)]
|
||||
fn main() {
|
||||
let _foo = b'hello\0';
|
||||
//~^ ERROR character literal may only contain one codepoint
|
||||
//~| HELP if you meant to write a byte string literal, use double quotes
|
||||
let _bar = 'hello';
|
||||
//~^ ERROR character literal may only contain one codepoint
|
||||
//~| HELP if you meant to write a `str` literal, use double quotes
|
||||
}
|
22
src/test/ui/issues/issue-64732.stderr
Normal file
22
src/test/ui/issues/issue-64732.stderr
Normal file
@ -0,0 +1,22 @@
|
||||
error: character literal may only contain one codepoint
|
||||
--> $DIR/issue-64732.rs:3:17
|
||||
|
|
||||
LL | let _foo = b'hello\0';
|
||||
| ^^^^^^^^^
|
||||
help: if you meant to write a byte string literal, use double quotes
|
||||
|
|
||||
LL | let _foo = b"hello\0";
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: character literal may only contain one codepoint
|
||||
--> $DIR/issue-64732.rs:6:16
|
||||
|
|
||||
LL | let _bar = 'hello';
|
||||
| ^^^^^^^
|
||||
help: if you meant to write a `str` literal, use double quotes
|
||||
|
|
||||
LL | let _bar = "hello";
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -1,7 +1,5 @@
|
||||
// Regression test for issue #45045
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
enum Xyz {
|
||||
A,
|
||||
B,
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0503]: cannot use `e` because it was mutably borrowed
|
||||
--> $DIR/borrowed-match-issue-45045.rs:15:9
|
||||
--> $DIR/borrowed-match-issue-45045.rs:13:9
|
||||
|
|
||||
LL | let f = &mut e;
|
||||
| ------ borrow of `e` occurs here
|
||||
|
@ -1,7 +1,5 @@
|
||||
// Regression test for issue #38899
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
pub struct Block<'a> {
|
||||
current: &'a u8,
|
||||
unrelated: &'a u8,
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0502]: cannot borrow `*block.current` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/borrowed-referent-issue-38899.rs:13:21
|
||||
--> $DIR/borrowed-referent-issue-38899.rs:11:21
|
||||
|
|
||||
LL | let x = &mut block;
|
||||
| ---------- mutable borrow occurs here
|
||||
|
@ -1,7 +1,5 @@
|
||||
// Test that the 'static bound from the Copy impl is respected. Regression test for #29149.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
#[derive(Clone)] struct Foo<'a>(&'a u32);
|
||||
impl Copy for Foo<'static> {}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0597]: `s` does not live long enough
|
||||
--> $DIR/do-not-ignore-lifetime-bounds-in-copy.rs:10:17
|
||||
--> $DIR/do-not-ignore-lifetime-bounds-in-copy.rs:8:17
|
||||
|
|
||||
LL | let a = Foo(&s);
|
||||
| ^^ borrowed value does not live long enough
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(nll)]
|
||||
|
||||
enum DropOption<T> {
|
||||
Some(T),
|
||||
None,
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/enum-drop-access.rs:15:31
|
||||
--> $DIR/enum-drop-access.rs:13:31
|
||||
|
|
||||
LL | fn drop_enum(opt: DropOption<&mut i32>) -> Option<&mut i32> {
|
||||
| - let's call the lifetime of this reference `'1`
|
||||
@ -13,7 +13,7 @@ LL | }
|
||||
| - here, drop of `opt` needs exclusive access to `*opt.0`, because the type `DropOption<&mut i32>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/enum-drop-access.rs:24:36
|
||||
--> $DIR/enum-drop-access.rs:22:36
|
||||
|
|
||||
LL | fn optional_drop_enum(opt: Option<DropOption<&mut i32>>) -> Option<&mut i32> {
|
||||
| - let's call the lifetime of this reference `'1`
|
||||
|
@ -12,8 +12,6 @@
|
||||
// tests that are meant to continue failing to compile once
|
||||
// rust-lang/rust#54987 is implemented.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
struct S<Y> {
|
||||
x: u32,
|
||||
|
||||
|
@ -1,17 +1,17 @@
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `s`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:99:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:97:5
|
||||
|
|
||||
LL | s.x = 10; s.y = Box::new(20);
|
||||
| ^^^^^^^^ use of possibly-uninitialized `s`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `t`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:106:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:104:5
|
||||
|
|
||||
LL | t.0 = 10; t.1 = Box::new(20);
|
||||
| ^^^^^^^^ use of possibly-uninitialized `t`
|
||||
|
||||
error[E0382]: assign to part of moved value: `s`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:113:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:111:5
|
||||
|
|
||||
LL | let mut s: S<B> = S::new(); drop(s);
|
||||
| ----- - value moved here
|
||||
@ -21,7 +21,7 @@ LL | s.x = 10; s.y = Box::new(20);
|
||||
| ^^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0382]: assign to part of moved value: `t`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:120:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:118:5
|
||||
|
|
||||
LL | let mut t: T = (0, Box::new(0)); drop(t);
|
||||
| ----- - value moved here
|
||||
@ -31,19 +31,19 @@ LL | t.0 = 10; t.1 = Box::new(20);
|
||||
| ^^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `s`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:127:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:125:5
|
||||
|
|
||||
LL | s.x = 10;
|
||||
| ^^^^^^^^ use of possibly-uninitialized `s`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `t`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:134:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:132:5
|
||||
|
|
||||
LL | t.0 = 10;
|
||||
| ^^^^^^^^ use of possibly-uninitialized `t`
|
||||
|
||||
error[E0382]: assign to part of moved value: `s`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:141:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:139:5
|
||||
|
|
||||
LL | let mut s: S<B> = S::new(); drop(s);
|
||||
| ----- - value moved here
|
||||
@ -53,7 +53,7 @@ LL | s.x = 10;
|
||||
| ^^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0382]: assign to part of moved value: `t`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:148:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:146:5
|
||||
|
|
||||
LL | let mut t: T = (0, Box::new(0)); drop(t);
|
||||
| ----- - value moved here
|
||||
@ -63,31 +63,31 @@ LL | t.0 = 10;
|
||||
| ^^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `s`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:155:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:153:5
|
||||
|
|
||||
LL | s.x = 10;
|
||||
| ^^^^^^^^ use of possibly-uninitialized `s`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `t`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:162:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:160:5
|
||||
|
|
||||
LL | t.0 = 10;
|
||||
| ^^^^^^^^ use of possibly-uninitialized `t`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:178:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:176:5
|
||||
|
|
||||
LL | q.r.f.x = 10; q.r.f.y = Box::new(20);
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:185:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:183:5
|
||||
|
|
||||
LL | q.r.f.0 = 10; q.r.f.1 = Box::new(20);
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0382]: assign to part of moved value: `q.r`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:192:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:190:5
|
||||
|
|
||||
LL | let mut q: Q<S<B>> = Q::new(S::new()); drop(q.r);
|
||||
| --- value moved here
|
||||
@ -97,7 +97,7 @@ LL | q.r.f.x = 10; q.r.f.y = Box::new(20);
|
||||
= note: move occurs because `q.r` has type `R<S<std::boxed::Box<u32>>>`, which does not implement the `Copy` trait
|
||||
|
||||
error[E0382]: assign to part of moved value: `q.r`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:199:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:197:5
|
||||
|
|
||||
LL | let mut q: Q<T> = Q::new((0, Box::new(0))); drop(q.r);
|
||||
| --- value moved here
|
||||
@ -107,19 +107,19 @@ LL | q.r.f.0 = 10; q.r.f.1 = Box::new(20);
|
||||
= note: move occurs because `q.r` has type `R<(u32, std::boxed::Box<u32>)>`, which does not implement the `Copy` trait
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:206:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:204:5
|
||||
|
|
||||
LL | q.r.f.x = 10;
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:213:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:211:5
|
||||
|
|
||||
LL | q.r.f.0 = 10;
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0382]: assign to part of moved value: `q.r`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:220:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:218:5
|
||||
|
|
||||
LL | let mut q: Q<S<B>> = Q::new(S::new()); drop(q.r);
|
||||
| --- value moved here
|
||||
@ -129,7 +129,7 @@ LL | q.r.f.x = 10;
|
||||
= note: move occurs because `q.r` has type `R<S<std::boxed::Box<u32>>>`, which does not implement the `Copy` trait
|
||||
|
||||
error[E0382]: assign to part of moved value: `q.r`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:227:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:225:5
|
||||
|
|
||||
LL | let mut q: Q<T> = Q::new((0, Box::new(0))); drop(q.r);
|
||||
| --- value moved here
|
||||
@ -139,19 +139,19 @@ LL | q.r.f.0 = 10;
|
||||
= note: move occurs because `q.r` has type `R<(u32, std::boxed::Box<u32>)>`, which does not implement the `Copy` trait
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:234:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:232:5
|
||||
|
|
||||
LL | q.r.f.x = 10;
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0381]: assign to part of possibly-uninitialized variable: `q`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:241:5
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:239:5
|
||||
|
|
||||
LL | q.r.f.0 = 10;
|
||||
| ^^^^^^^^^^^^ use of possibly-uninitialized `q.r.f`
|
||||
|
||||
error[E0382]: assign to part of moved value: `c`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:259:13
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:257:13
|
||||
|
|
||||
LL | let mut c = (1, "".to_owned());
|
||||
| ----- move occurs because `c` has type `(i32, std::string::String)`, which does not implement the `Copy` trait
|
||||
@ -162,7 +162,7 @@ LL | c.0 = 2;
|
||||
| ^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0382]: assign to part of moved value: `c`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:269:13
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:267:13
|
||||
|
|
||||
LL | let mut c = (1, (1, "".to_owned()));
|
||||
| ----- move occurs because `c` has type `(i32, (i32, std::string::String))`, which does not implement the `Copy` trait
|
||||
@ -173,7 +173,7 @@ LL | (c.1).0 = 2;
|
||||
| ^^^^^^^^^^^ value partially assigned here after move
|
||||
|
||||
error[E0382]: assign to part of moved value: `c.1`
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:277:13
|
||||
--> $DIR/issue-21232-partial-init-and-use.rs:275:13
|
||||
|
|
||||
LL | c2 => {
|
||||
| -- value moved here
|
||||
|
@ -1,7 +1,5 @@
|
||||
// Regression test for issue #27868
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
use std::ops::AddAssign;
|
||||
|
||||
struct MyVec<T>(Vec<T>);
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0506]: cannot assign to `vecvec` because it is borrowed
|
||||
--> $DIR/issue-27868.rs:26:9
|
||||
--> $DIR/issue-27868.rs:24:9
|
||||
|
|
||||
LL | vecvec[0] += {
|
||||
| ------
|
||||
|
@ -2,8 +2,6 @@
|
||||
// causing region relations not to be enforced at all the places where
|
||||
// they have to be enforced.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
struct VecWrapper<'a>(&'a mut S);
|
||||
|
||||
struct S(Box<u32>);
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-31567.rs:12:26
|
||||
--> $DIR/issue-31567.rs:10:26
|
||||
|
|
||||
LL | fn get_dangling<'a>(v: VecWrapper<'a>) -> &'a u32 {
|
||||
| -- lifetime `'a` defined here
|
||||
|
@ -1,7 +1,5 @@
|
||||
// Regression test for issue #48238
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
fn use_val<'a>(val: &'a u8) -> &'a u8 {
|
||||
val
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-48238.rs:11:13
|
||||
--> $DIR/issue-48238.rs:9:13
|
||||
|
|
||||
LL | move || use_val(&orig);
|
||||
| ------- ^^^^^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
|
||||
|
@ -3,8 +3,6 @@
|
||||
// one of its fields, it is useful to be reminded of the significance
|
||||
// of the fact that the type implements Drop.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
pub struct S<'a> { url: &'a mut String }
|
||||
|
||||
impl<'a> Drop for S<'a> { fn drop(&mut self) { } }
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:13:5
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:11:5
|
||||
|
|
||||
LL | fn finish_1(s: S) -> &mut String {
|
||||
| - has type `S<'1>`
|
||||
@ -9,7 +9,7 @@ LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.url`, because the type `S<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:18:13
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:16:13
|
||||
|
|
||||
LL | fn finish_2(s: S) -> &mut String {
|
||||
| - has type `S<'1>`
|
||||
@ -19,7 +19,7 @@ LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.url`, because the type `S<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:23:21
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:21:21
|
||||
|
|
||||
LL | fn finish_3(s: S) -> &mut String {
|
||||
| - has type `S<'1>`
|
||||
@ -29,7 +29,7 @@ LL | }
|
||||
| - here, drop of `s` needs exclusive access to `*s.url`, because the type `S<'_>` implements the `Drop` trait
|
||||
|
||||
error[E0509]: cannot move out of type `S<'_>`, which implements the `Drop` trait
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:28:13
|
||||
--> $DIR/issue-52059-report-when-borrow-and-drop-conflict.rs:26:13
|
||||
|
|
||||
LL | let p = s.url; p
|
||||
| ^^^^^
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(nll)]
|
||||
|
||||
fn main() {
|
||||
let mut v: Vec<()> = Vec::new();
|
||||
|| &mut v;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/issue-53040.rs:5:8
|
||||
--> $DIR/issue-53040.rs:3:8
|
||||
|
|
||||
LL | || &mut v;
|
||||
| - ^^^^^^ returns a reference to a captured variable which escapes the closure body
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(nll)]
|
||||
|
||||
struct Archive;
|
||||
struct ArchiveIterator<'a> {
|
||||
x: &'a Archive,
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0713]: borrow may still be in use when destructor runs
|
||||
--> $DIR/issue-53773.rs:43:22
|
||||
--> $DIR/issue-53773.rs:41:22
|
||||
|
|
||||
LL | members.push(child.raw);
|
||||
| ^^^^^^^^^
|
||||
|
@ -1,5 +1,4 @@
|
||||
#![allow(unused)]
|
||||
#![feature(nll)]
|
||||
|
||||
// ignore-tidy-linelength
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0502]: cannot borrow `r.r2_union.f3_union` (via `r.r2_union.f3_union.s2_leaf.l1_u8`) as immutable because it is also borrowed as mutable (via `r.r2_union.f3_union.s1_leaf.l1_u8`)
|
||||
--> $DIR/issue-57100.rs:44:20
|
||||
--> $DIR/issue-57100.rs:43:20
|
||||
|
|
||||
LL | let mref = &mut r.r2_union.f3_union.s1_leaf.l1_u8;
|
||||
| -------------------------------------- mutable borrow occurs here (via `r.r2_union.f3_union.s1_leaf.l1_u8`)
|
||||
@ -13,7 +13,7 @@ LL | println!("{} {}", mref, nref)
|
||||
= note: `r.r2_union.f3_union.s2_leaf.l1_u8` is a field of the union `Second`, so it overlaps the field `r.r2_union.f3_union.s1_leaf.l1_u8`
|
||||
|
||||
error[E0502]: cannot borrow `r.r2_union` (via `r.r2_union.f1_leaf.l1_u8`) as immutable because it is also borrowed as mutable (via `r.r2_union.f2_leaf.l1_u8`)
|
||||
--> $DIR/issue-57100.rs:62:20
|
||||
--> $DIR/issue-57100.rs:61:20
|
||||
|
|
||||
LL | let mref = &mut r.r2_union.f2_leaf.l1_u8;
|
||||
| ----------------------------- mutable borrow occurs here (via `r.r2_union.f2_leaf.l1_u8`)
|
||||
|
@ -1,5 +1,3 @@
|
||||
#![feature(nll)]
|
||||
|
||||
// Here is arielb1's basic example from rust-lang/rust#27282
|
||||
// that AST borrowck is flummoxed by:
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0507]: cannot move out of `foo` in pattern guard
|
||||
--> $DIR/match-guards-always-borrow.rs:10:14
|
||||
--> $DIR/match-guards-always-borrow.rs:8:14
|
||||
|
|
||||
LL | (|| { let bar = foo; bar.take() })();
|
||||
| ^^ ---
|
||||
|
@ -5,8 +5,6 @@
|
||||
// Test that we don't allow mutating the value being matched on in a way that
|
||||
// changes which patterns it matches, until we have chosen an arm.
|
||||
|
||||
#![feature(nll)]
|
||||
|
||||
struct A(i32, i32);
|
||||
|
||||
fn struct_example(mut a: A) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0503]: cannot use `e` because it was mutably borrowed
|
||||
--> $DIR/match-on-borrowed.rs:51:9
|
||||
--> $DIR/match-on-borrowed.rs:49:9
|
||||
|
|
||||
LL | E::V(ref mut x, _) => x,
|
||||
| --------- borrow of `e.0` occurs here
|
||||
@ -11,7 +11,7 @@ LL | x;
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `*f` because it was mutably borrowed
|
||||
--> $DIR/match-on-borrowed.rs:64:9
|
||||
--> $DIR/match-on-borrowed.rs:62:9
|
||||
|
|
||||
LL | E::V(ref mut x, _) => x,
|
||||
| --------- borrow of `f.0` occurs here
|
||||
@ -23,7 +23,7 @@ LL | x;
|
||||
| - borrow later used here
|
||||
|
||||
error[E0503]: cannot use `t` because it was mutably borrowed
|
||||
--> $DIR/match-on-borrowed.rs:82:9
|
||||
--> $DIR/match-on-borrowed.rs:80:9
|
||||
|
|
||||
LL | let x = &mut t;
|
||||
| ------ borrow of `t` occurs here
|
||||
@ -35,7 +35,7 @@ LL | x;
|
||||
| - borrow later used here
|
||||
|
||||
error[E0381]: use of possibly-uninitialized variable: `n`
|
||||
--> $DIR/match-on-borrowed.rs:92:11
|
||||
--> $DIR/match-on-borrowed.rs:90:11
|
||||
|
|
||||
LL | match n {}
|
||||
| ^ use of possibly-uninitialized `n`
|
||||
|
@ -1,22 +0,0 @@
|
||||
error[E0303]: pattern bindings are not allowed after an `@`
|
||||
--> $DIR/pattern-bindings-after-at.rs:8:31
|
||||
|
|
||||
LL | ref mut z @ &mut Some(ref a) => {
|
||||
| ^^^^^ not allowed after `@`
|
||||
|
||||
error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/pattern-bindings-after-at.rs:8:31
|
||||
|
|
||||
LL | ref mut z @ &mut Some(ref a) => {
|
||||
| ----------------------^^^^^-
|
||||
| | |
|
||||
| | immutable borrow occurs here
|
||||
| mutable borrow occurs here
|
||||
...
|
||||
LL | **z = None;
|
||||
| ---------- mutable borrow later used here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0303, E0502.
|
||||
For more information about an error, try `rustc --explain E0303`.
|
@ -7,9 +7,7 @@ fn main() {
|
||||
match &mut Some(1) {
|
||||
ref mut z @ &mut Some(ref a) => {
|
||||
//~^ ERROR pattern bindings are not allowed after an `@`
|
||||
//~| WARN cannot borrow `_` as immutable because it is also borrowed as mutable
|
||||
//~| WARN this error has been downgraded to a warning for backwards compatibility
|
||||
//~| WARN this represents potential undefined behavior in your code and this warning will
|
||||
//~| ERROR cannot borrow `_` as immutable because it is also borrowed as mutable
|
||||
**z = None;
|
||||
println!("{}", *a);
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ error[E0303]: pattern bindings are not allowed after an `@`
|
||||
LL | ref mut z @ &mut Some(ref a) => {
|
||||
| ^^^^^ not allowed after `@`
|
||||
|
||||
warning[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
|
||||
error[E0502]: cannot borrow `_` as immutable because it is also borrowed as mutable
|
||||
--> $DIR/pattern-bindings-after-at.rs:8:31
|
||||
|
|
||||
LL | ref mut z @ &mut Some(ref a) => {
|
||||
@ -15,12 +15,8 @@ LL | ref mut z @ &mut Some(ref a) => {
|
||||
...
|
||||
LL | **z = None;
|
||||
| ---------- mutable borrow later used here
|
||||
|
|
||||
= warning: this error has been downgraded to a warning for backwards compatibility with previous releases
|
||||
= warning: this represents potential undefined behavior in your code and this warning will become a hard error in the future
|
||||
= note: for more information, try `rustc --explain E0729`
|
||||
|
||||
error: aborting due to previous error
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0303, E0502.
|
||||
For more information about an error, try `rustc --explain E0303`.
|
||||
|
@ -39,6 +39,10 @@ mod missing_version {
|
||||
#[stable(feature = "a", since = "b")]
|
||||
#[rustc_deprecated(reason = "a")] //~ ERROR missing 'since' [E0542]
|
||||
fn f2() { }
|
||||
|
||||
#[stable(feature = "a", since = "b")]
|
||||
#[rustc_deprecated(since = "a")] //~ ERROR missing 'reason' [E0543]
|
||||
fn f3() { }
|
||||
}
|
||||
|
||||
#[unstable(feature = "b", issue = "0")]
|
||||
|
@ -58,48 +58,54 @@ error[E0542]: missing 'since'
|
||||
LL | #[rustc_deprecated(reason = "a")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0543]: missing 'reason'
|
||||
--> $DIR/stability-attribute-sanity.rs:44:5
|
||||
|
|
||||
LL | #[rustc_deprecated(since = "a")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0544]: multiple stability levels
|
||||
--> $DIR/stability-attribute-sanity.rs:45:1
|
||||
--> $DIR/stability-attribute-sanity.rs:49:1
|
||||
|
|
||||
LL | #[stable(feature = "a", since = "b")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0544]: multiple stability levels
|
||||
--> $DIR/stability-attribute-sanity.rs:49:1
|
||||
--> $DIR/stability-attribute-sanity.rs:53:1
|
||||
|
|
||||
LL | #[unstable(feature = "b", issue = "0")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0544]: multiple stability levels
|
||||
--> $DIR/stability-attribute-sanity.rs:53:1
|
||||
--> $DIR/stability-attribute-sanity.rs:57:1
|
||||
|
|
||||
LL | #[stable(feature = "a", since = "b")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0540]: multiple rustc_deprecated attributes
|
||||
--> $DIR/stability-attribute-sanity.rs:61:1
|
||||
--> $DIR/stability-attribute-sanity.rs:65:1
|
||||
|
|
||||
LL | pub const fn multiple4() { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0553]: multiple rustc_const_unstable attributes
|
||||
--> $DIR/stability-attribute-sanity.rs:61:1
|
||||
--> $DIR/stability-attribute-sanity.rs:65:1
|
||||
|
|
||||
LL | pub const fn multiple4() { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: Invalid stability or deprecation version found
|
||||
--> $DIR/stability-attribute-sanity.rs:61:1
|
||||
--> $DIR/stability-attribute-sanity.rs:65:1
|
||||
|
|
||||
LL | pub const fn multiple4() { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0549]: rustc_deprecated attribute must be paired with either stable or unstable attribute
|
||||
--> $DIR/stability-attribute-sanity.rs:66:1
|
||||
--> $DIR/stability-attribute-sanity.rs:70:1
|
||||
|
|
||||
LL | fn deprecated_without_unstable_or_stable() { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 17 previous errors
|
||||
error: aborting due to 18 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0541`.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user