mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #111452 - matthiaskrgr:rollup-uic8dgy, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #108705 (Prevent ICE with broken borrow in closure) - #111292 (Fix mishandled `--check-cfg` arguments order) - #111382 (Isolate coverage FFI type layouts from their underlying LLVM C++ types) - #111385 (vec-shrink-panik: update expectations to work on LLVM 17) - #111389 (Add esp-idf platform-support page) - #111432 (Use visit_assign to detect SSA locals.) - #111448 (Use proper impl self type for alias impl in rustdoc) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
4d941cd981
@ -680,7 +680,9 @@ pub type InlineAsmDiagHandlerTy = unsafe extern "C" fn(&SMDiagnostic, *const c_v
|
|||||||
pub mod coverageinfo {
|
pub mod coverageinfo {
|
||||||
use super::coverage_map;
|
use super::coverage_map;
|
||||||
|
|
||||||
/// Aligns with [llvm::coverage::CounterMappingRegion::RegionKind](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L209-L230)
|
/// Corresponds to enum `llvm::coverage::CounterMappingRegion::RegionKind`.
|
||||||
|
///
|
||||||
|
/// Must match the layout of `LLVMRustCounterMappingRegionKind`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub enum RegionKind {
|
pub enum RegionKind {
|
||||||
@ -714,7 +716,9 @@ pub mod coverageinfo {
|
|||||||
/// array", encoded separately), and source location (start and end positions of the represented
|
/// array", encoded separately), and source location (start and end positions of the represented
|
||||||
/// code region).
|
/// code region).
|
||||||
///
|
///
|
||||||
/// Matches LLVMRustCounterMappingRegion.
|
/// Corresponds to struct `llvm::coverage::CounterMappingRegion`.
|
||||||
|
///
|
||||||
|
/// Must match the layout of `LLVMRustCounterMappingRegion`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct CounterMappingRegion {
|
pub struct CounterMappingRegion {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use rustc_middle::mir::coverage::{CounterValueReference, MappedExpressionIndex};
|
use rustc_middle::mir::coverage::{CounterValueReference, MappedExpressionIndex};
|
||||||
|
|
||||||
/// Aligns with [llvm::coverage::Counter::CounterKind](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L95)
|
/// Must match the layout of `LLVMRustCounterKind`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub enum CounterKind {
|
pub enum CounterKind {
|
||||||
@ -17,8 +17,10 @@ pub enum CounterKind {
|
|||||||
/// `instrprof.increment()`)
|
/// `instrprof.increment()`)
|
||||||
/// * For `CounterKind::Expression`, `id` is the index into the coverage map's array of
|
/// * For `CounterKind::Expression`, `id` is the index into the coverage map's array of
|
||||||
/// counter expressions.
|
/// counter expressions.
|
||||||
/// Aligns with [llvm::coverage::Counter](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L102-L103)
|
///
|
||||||
/// Important: The Rust struct layout (order and types of fields) must match its C++ counterpart.
|
/// Corresponds to struct `llvm::coverage::Counter`.
|
||||||
|
///
|
||||||
|
/// Must match the layout of `LLVMRustCounter`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct Counter {
|
pub struct Counter {
|
||||||
@ -59,7 +61,9 @@ impl Counter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Aligns with [llvm::coverage::CounterExpression::ExprKind](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L150)
|
/// Corresponds to enum `llvm::coverage::CounterExpression::ExprKind`.
|
||||||
|
///
|
||||||
|
/// Must match the layout of `LLVMRustCounterExprKind`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub enum ExprKind {
|
pub enum ExprKind {
|
||||||
@ -67,9 +71,9 @@ pub enum ExprKind {
|
|||||||
Add = 1,
|
Add = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Aligns with [llvm::coverage::CounterExpression](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L151-L152)
|
/// Corresponds to struct `llvm::coverage::CounterExpression`.
|
||||||
/// Important: The Rust struct layout (order and types of fields) must match its C++
|
///
|
||||||
/// counterpart.
|
/// Must match the layout of `LLVMRustCounterExpression`.
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct CounterExpression {
|
pub struct CounterExpression {
|
||||||
|
@ -173,12 +173,21 @@ pub fn parse_check_cfg(specs: Vec<String>) -> CheckCfg {
|
|||||||
let expected_values = check_cfg
|
let expected_values = check_cfg
|
||||||
.expecteds
|
.expecteds
|
||||||
.entry(ident.name.to_string())
|
.entry(ident.name.to_string())
|
||||||
|
.and_modify(|expected_values| match expected_values {
|
||||||
|
ExpectedValues::Some(_) => {}
|
||||||
|
ExpectedValues::Any => {
|
||||||
|
// handle the case where names(...) was done
|
||||||
|
// before values by changing to a list
|
||||||
|
*expected_values =
|
||||||
|
ExpectedValues::Some(FxHashSet::default());
|
||||||
|
}
|
||||||
|
})
|
||||||
.or_insert_with(|| {
|
.or_insert_with(|| {
|
||||||
ExpectedValues::Some(FxHashSet::default())
|
ExpectedValues::Some(FxHashSet::default())
|
||||||
});
|
});
|
||||||
|
|
||||||
let ExpectedValues::Some(expected_values) = expected_values else {
|
let ExpectedValues::Some(expected_values) = expected_values else {
|
||||||
bug!("shoudn't be possible")
|
bug!("`expected_values` should be a list a values")
|
||||||
};
|
};
|
||||||
|
|
||||||
for val in values {
|
for val in values {
|
||||||
|
@ -8,18 +8,100 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
// FFI equivalent of enum `llvm::coverage::Counter::CounterKind`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L97-L99
|
||||||
|
enum class LLVMRustCounterKind {
|
||||||
|
Zero = 0,
|
||||||
|
CounterValueReference = 1,
|
||||||
|
Expression = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
// FFI equivalent of struct `llvm::coverage::Counter`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L94-L149
|
||||||
|
struct LLVMRustCounter {
|
||||||
|
LLVMRustCounterKind CounterKind;
|
||||||
|
uint32_t ID;
|
||||||
|
};
|
||||||
|
|
||||||
|
static coverage::Counter fromRust(LLVMRustCounter Counter) {
|
||||||
|
switch (Counter.CounterKind) {
|
||||||
|
case LLVMRustCounterKind::Zero:
|
||||||
|
return coverage::Counter::getZero();
|
||||||
|
case LLVMRustCounterKind::CounterValueReference:
|
||||||
|
return coverage::Counter::getCounter(Counter.ID);
|
||||||
|
case LLVMRustCounterKind::Expression:
|
||||||
|
return coverage::Counter::getExpression(Counter.ID);
|
||||||
|
}
|
||||||
|
report_fatal_error("Bad LLVMRustCounterKind!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// FFI equivalent of enum `llvm::coverage::CounterMappingRegion::RegionKind`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L213-L234
|
||||||
|
enum class LLVMRustCounterMappingRegionKind {
|
||||||
|
CodeRegion = 0,
|
||||||
|
ExpansionRegion = 1,
|
||||||
|
SkippedRegion = 2,
|
||||||
|
GapRegion = 3,
|
||||||
|
BranchRegion = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static coverage::CounterMappingRegion::RegionKind
|
||||||
|
fromRust(LLVMRustCounterMappingRegionKind Kind) {
|
||||||
|
switch (Kind) {
|
||||||
|
case LLVMRustCounterMappingRegionKind::CodeRegion:
|
||||||
|
return coverage::CounterMappingRegion::CodeRegion;
|
||||||
|
case LLVMRustCounterMappingRegionKind::ExpansionRegion:
|
||||||
|
return coverage::CounterMappingRegion::ExpansionRegion;
|
||||||
|
case LLVMRustCounterMappingRegionKind::SkippedRegion:
|
||||||
|
return coverage::CounterMappingRegion::SkippedRegion;
|
||||||
|
case LLVMRustCounterMappingRegionKind::GapRegion:
|
||||||
|
return coverage::CounterMappingRegion::GapRegion;
|
||||||
|
case LLVMRustCounterMappingRegionKind::BranchRegion:
|
||||||
|
return coverage::CounterMappingRegion::BranchRegion;
|
||||||
|
}
|
||||||
|
report_fatal_error("Bad LLVMRustCounterMappingRegionKind!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// FFI equivalent of struct `llvm::coverage::CounterMappingRegion`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L211-L304
|
||||||
struct LLVMRustCounterMappingRegion {
|
struct LLVMRustCounterMappingRegion {
|
||||||
coverage::Counter Count;
|
LLVMRustCounter Count;
|
||||||
coverage::Counter FalseCount;
|
LLVMRustCounter FalseCount;
|
||||||
uint32_t FileID;
|
uint32_t FileID;
|
||||||
uint32_t ExpandedFileID;
|
uint32_t ExpandedFileID;
|
||||||
uint32_t LineStart;
|
uint32_t LineStart;
|
||||||
uint32_t ColumnStart;
|
uint32_t ColumnStart;
|
||||||
uint32_t LineEnd;
|
uint32_t LineEnd;
|
||||||
uint32_t ColumnEnd;
|
uint32_t ColumnEnd;
|
||||||
coverage::CounterMappingRegion::RegionKind Kind;
|
LLVMRustCounterMappingRegionKind Kind;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// FFI equivalent of enum `llvm::coverage::CounterExpression::ExprKind`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L154
|
||||||
|
enum class LLVMRustCounterExprKind {
|
||||||
|
Subtract = 0,
|
||||||
|
Add = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
// FFI equivalent of struct `llvm::coverage::CounterExpression`
|
||||||
|
// https://github.com/rust-lang/llvm-project/blob/ea6fa9c2/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L151-L160
|
||||||
|
struct LLVMRustCounterExpression {
|
||||||
|
LLVMRustCounterExprKind Kind;
|
||||||
|
LLVMRustCounter LHS;
|
||||||
|
LLVMRustCounter RHS;
|
||||||
|
};
|
||||||
|
|
||||||
|
static coverage::CounterExpression::ExprKind
|
||||||
|
fromRust(LLVMRustCounterExprKind Kind) {
|
||||||
|
switch (Kind) {
|
||||||
|
case LLVMRustCounterExprKind::Subtract:
|
||||||
|
return coverage::CounterExpression::Subtract;
|
||||||
|
case LLVMRustCounterExprKind::Add:
|
||||||
|
return coverage::CounterExpression::Add;
|
||||||
|
}
|
||||||
|
report_fatal_error("Bad LLVMRustCounterExprKind!");
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
|
extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
|
||||||
const char* const Filenames[],
|
const char* const Filenames[],
|
||||||
size_t FilenamesLen,
|
size_t FilenamesLen,
|
||||||
@ -37,9 +119,9 @@ extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
|
|||||||
extern "C" void LLVMRustCoverageWriteMappingToBuffer(
|
extern "C" void LLVMRustCoverageWriteMappingToBuffer(
|
||||||
const unsigned *VirtualFileMappingIDs,
|
const unsigned *VirtualFileMappingIDs,
|
||||||
unsigned NumVirtualFileMappingIDs,
|
unsigned NumVirtualFileMappingIDs,
|
||||||
const coverage::CounterExpression *Expressions,
|
const LLVMRustCounterExpression *RustExpressions,
|
||||||
unsigned NumExpressions,
|
unsigned NumExpressions,
|
||||||
LLVMRustCounterMappingRegion *RustMappingRegions,
|
const LLVMRustCounterMappingRegion *RustMappingRegions,
|
||||||
unsigned NumMappingRegions,
|
unsigned NumMappingRegions,
|
||||||
RustStringRef BufferOut) {
|
RustStringRef BufferOut) {
|
||||||
// Convert from FFI representation to LLVM representation.
|
// Convert from FFI representation to LLVM representation.
|
||||||
@ -48,13 +130,24 @@ extern "C" void LLVMRustCoverageWriteMappingToBuffer(
|
|||||||
for (const auto &Region : ArrayRef<LLVMRustCounterMappingRegion>(
|
for (const auto &Region : ArrayRef<LLVMRustCounterMappingRegion>(
|
||||||
RustMappingRegions, NumMappingRegions)) {
|
RustMappingRegions, NumMappingRegions)) {
|
||||||
MappingRegions.emplace_back(
|
MappingRegions.emplace_back(
|
||||||
Region.Count, Region.FalseCount, Region.FileID, Region.ExpandedFileID,
|
fromRust(Region.Count), fromRust(Region.FalseCount),
|
||||||
|
Region.FileID, Region.ExpandedFileID,
|
||||||
Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
|
Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
|
||||||
Region.Kind);
|
fromRust(Region.Kind));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<coverage::CounterExpression> Expressions;
|
||||||
|
Expressions.reserve(NumExpressions);
|
||||||
|
for (const auto &Expression :
|
||||||
|
ArrayRef<LLVMRustCounterExpression>(RustExpressions, NumExpressions)) {
|
||||||
|
Expressions.emplace_back(fromRust(Expression.Kind),
|
||||||
|
fromRust(Expression.LHS),
|
||||||
|
fromRust(Expression.RHS));
|
||||||
|
}
|
||||||
|
|
||||||
auto CoverageMappingWriter = coverage::CoverageMappingWriter(
|
auto CoverageMappingWriter = coverage::CoverageMappingWriter(
|
||||||
ArrayRef<unsigned>(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
|
ArrayRef<unsigned>(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
|
||||||
ArrayRef<coverage::CounterExpression>(Expressions, NumExpressions),
|
Expressions,
|
||||||
MappingRegions);
|
MappingRegions);
|
||||||
RawRustStringOstream OS(BufferOut);
|
RawRustStringOstream OS(BufferOut);
|
||||||
CoverageMappingWriter.write(OS);
|
CoverageMappingWriter.write(OS);
|
||||||
|
@ -1016,7 +1016,7 @@ rustc_queries! {
|
|||||||
desc { "converting literal to mir constant" }
|
desc { "converting literal to mir constant" }
|
||||||
}
|
}
|
||||||
|
|
||||||
query check_match(key: LocalDefId) {
|
query check_match(key: LocalDefId) -> Result<(), rustc_errors::ErrorGuaranteed> {
|
||||||
desc { |tcx| "match-checking `{}`", tcx.def_path_str(key) }
|
desc { |tcx| "match-checking `{}`", tcx.def_path_str(key) }
|
||||||
cache_on_disk_if { true }
|
cache_on_disk_if { true }
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,9 @@ fn mir_build(tcx: TyCtxt<'_>, def: LocalDefId) -> Body<'_> {
|
|||||||
// Ensure unsafeck and abstract const building is ran before we steal the THIR.
|
// Ensure unsafeck and abstract const building is ran before we steal the THIR.
|
||||||
tcx.ensure_with_value().thir_check_unsafety(def);
|
tcx.ensure_with_value().thir_check_unsafety(def);
|
||||||
tcx.ensure_with_value().thir_abstract_const(def);
|
tcx.ensure_with_value().thir_abstract_const(def);
|
||||||
tcx.ensure_with_value().check_match(def);
|
if let Err(e) = tcx.check_match(def) {
|
||||||
|
return construct_error(tcx, def, e);
|
||||||
|
}
|
||||||
|
|
||||||
let body = match tcx.thir_body(def) {
|
let body = match tcx.thir_body(def) {
|
||||||
Err(error_reported) => construct_error(tcx, def, error_reported),
|
Err(error_reported) => construct_error(tcx, def, error_reported),
|
||||||
|
@ -26,8 +26,8 @@ use rustc_session::Session;
|
|||||||
use rustc_span::hygiene::DesugaringKind;
|
use rustc_span::hygiene::DesugaringKind;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
pub(crate) fn check_match(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
pub(crate) fn check_match(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
|
||||||
let Ok((thir, expr)) = tcx.thir_body(def_id) else { return };
|
let (thir, expr) = tcx.thir_body(def_id)?;
|
||||||
let thir = thir.borrow();
|
let thir = thir.borrow();
|
||||||
let pattern_arena = TypedArena::default();
|
let pattern_arena = TypedArena::default();
|
||||||
let mut visitor = MatchVisitor {
|
let mut visitor = MatchVisitor {
|
||||||
@ -37,13 +37,16 @@ pub(crate) fn check_match(tcx: TyCtxt<'_>, def_id: LocalDefId) {
|
|||||||
lint_level: tcx.hir().local_def_id_to_hir_id(def_id),
|
lint_level: tcx.hir().local_def_id_to_hir_id(def_id),
|
||||||
let_source: LetSource::None,
|
let_source: LetSource::None,
|
||||||
pattern_arena: &pattern_arena,
|
pattern_arena: &pattern_arena,
|
||||||
|
error: Ok(()),
|
||||||
};
|
};
|
||||||
visitor.visit_expr(&thir[expr]);
|
visitor.visit_expr(&thir[expr]);
|
||||||
|
|
||||||
for param in thir.params.iter() {
|
for param in thir.params.iter() {
|
||||||
if let Some(box ref pattern) = param.pat {
|
if let Some(box ref pattern) = param.pat {
|
||||||
visitor.check_irrefutable(pattern, "function argument", None);
|
visitor.check_irrefutable(pattern, "function argument", None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
visitor.error
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_e0004(
|
fn create_e0004(
|
||||||
@ -77,6 +80,7 @@ struct MatchVisitor<'a, 'p, 'tcx> {
|
|||||||
lint_level: HirId,
|
lint_level: HirId,
|
||||||
let_source: LetSource,
|
let_source: LetSource,
|
||||||
pattern_arena: &'p TypedArena<DeconstructedPat<'p, 'tcx>>,
|
pattern_arena: &'p TypedArena<DeconstructedPat<'p, 'tcx>>,
|
||||||
|
error: Result<(), ErrorGuaranteed>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> Visitor<'a, 'tcx> for MatchVisitor<'a, '_, 'tcx> {
|
impl<'a, 'tcx> Visitor<'a, 'tcx> for MatchVisitor<'a, '_, 'tcx> {
|
||||||
@ -276,9 +280,9 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> {
|
|||||||
let [pat_field] = &subpatterns[..] else { bug!() };
|
let [pat_field] = &subpatterns[..] else { bug!() };
|
||||||
self.check_irrefutable(&pat_field.pattern, "`for` loop binding", None);
|
self.check_irrefutable(&pat_field.pattern, "`for` loop binding", None);
|
||||||
} else {
|
} else {
|
||||||
non_exhaustive_match(
|
self.error = Err(non_exhaustive_match(
|
||||||
&cx, self.thir, scrut_ty, scrut.span, witnesses, arms, expr_span,
|
&cx, self.thir, scrut_ty, scrut.span, witnesses, arms, expr_span,
|
||||||
);
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -406,7 +410,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "trace", skip(self))]
|
#[instrument(level = "trace", skip(self))]
|
||||||
fn check_irrefutable(&self, pat: &Pat<'tcx>, origin: &str, sp: Option<Span>) {
|
fn check_irrefutable(&mut self, pat: &Pat<'tcx>, origin: &str, sp: Option<Span>) {
|
||||||
let mut cx = self.new_cx(self.lint_level, false);
|
let mut cx = self.new_cx(self.lint_level, false);
|
||||||
|
|
||||||
let pattern = self.lower_pattern(&mut cx, pat);
|
let pattern = self.lower_pattern(&mut cx, pat);
|
||||||
@ -475,7 +479,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> {
|
|||||||
AdtDefinedHere { adt_def_span, ty, variants }
|
AdtDefinedHere { adt_def_span, ty, variants }
|
||||||
};
|
};
|
||||||
|
|
||||||
self.tcx.sess.emit_err(PatternNotCovered {
|
self.error = Err(self.tcx.sess.emit_err(PatternNotCovered {
|
||||||
span: pat.span,
|
span: pat.span,
|
||||||
origin,
|
origin,
|
||||||
uncovered: Uncovered::new(pat.span, &cx, witnesses),
|
uncovered: Uncovered::new(pat.span, &cx, witnesses),
|
||||||
@ -486,7 +490,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> {
|
|||||||
let_suggestion,
|
let_suggestion,
|
||||||
misc_suggestion,
|
misc_suggestion,
|
||||||
adt_defined_here,
|
adt_defined_here,
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -628,7 +632,7 @@ fn non_exhaustive_match<'p, 'tcx>(
|
|||||||
witnesses: Vec<DeconstructedPat<'p, 'tcx>>,
|
witnesses: Vec<DeconstructedPat<'p, 'tcx>>,
|
||||||
arms: &[ArmId],
|
arms: &[ArmId],
|
||||||
expr_span: Span,
|
expr_span: Span,
|
||||||
) {
|
) -> ErrorGuaranteed {
|
||||||
let is_empty_match = arms.is_empty();
|
let is_empty_match = arms.is_empty();
|
||||||
let non_empty_enum = match scrut_ty.kind() {
|
let non_empty_enum = match scrut_ty.kind() {
|
||||||
ty::Adt(def, _) => def.is_enum() && !def.variants().is_empty(),
|
ty::Adt(def, _) => def.is_enum() && !def.variants().is_empty(),
|
||||||
@ -640,13 +644,12 @@ fn non_exhaustive_match<'p, 'tcx>(
|
|||||||
let pattern;
|
let pattern;
|
||||||
let patterns_len;
|
let patterns_len;
|
||||||
if is_empty_match && !non_empty_enum {
|
if is_empty_match && !non_empty_enum {
|
||||||
cx.tcx.sess.emit_err(NonExhaustivePatternsTypeNotEmpty {
|
return cx.tcx.sess.emit_err(NonExhaustivePatternsTypeNotEmpty {
|
||||||
cx,
|
cx,
|
||||||
expr_span,
|
expr_span,
|
||||||
span: sp,
|
span: sp,
|
||||||
ty: scrut_ty,
|
ty: scrut_ty,
|
||||||
});
|
});
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
// FIXME: migration of this diagnostic will require list support
|
// FIXME: migration of this diagnostic will require list support
|
||||||
let joined_patterns = joined_uncovered_patterns(cx, &witnesses);
|
let joined_patterns = joined_uncovered_patterns(cx, &witnesses);
|
||||||
@ -797,7 +800,7 @@ fn non_exhaustive_match<'p, 'tcx>(
|
|||||||
} else {
|
} else {
|
||||||
err.help(msg);
|
err.help(msg);
|
||||||
}
|
}
|
||||||
err.emit();
|
err.emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn joined_uncovered_patterns<'p, 'tcx>(
|
pub(crate) fn joined_uncovered_patterns<'p, 'tcx>(
|
||||||
|
@ -209,13 +209,6 @@ impl<'tcx> Visitor<'tcx> for SsaVisitor {
|
|||||||
match ctxt {
|
match ctxt {
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
||||||
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
|
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Store) => {
|
|
||||||
self.assignments[local].insert(LocationExtended::Plain(loc));
|
|
||||||
if let Set1::One(_) = self.assignments[local] {
|
|
||||||
// Only record if SSA-like, to avoid growing the vector needlessly.
|
|
||||||
self.assignment_order.push(local);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Anything can happen with raw pointers, so remove them.
|
// Anything can happen with raw pointers, so remove them.
|
||||||
// We do not verify that all uses of the borrow dominate the assignment to `local`,
|
// We do not verify that all uses of the borrow dominate the assignment to `local`,
|
||||||
// so we have to remove them too.
|
// so we have to remove them too.
|
||||||
@ -252,6 +245,19 @@ impl<'tcx> Visitor<'tcx> for SsaVisitor {
|
|||||||
self.visit_local(place.local, ctxt, loc);
|
self.visit_local(place.local, ctxt, loc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_assign(&mut self, place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, loc: Location) {
|
||||||
|
if let Some(local) = place.as_local() {
|
||||||
|
self.assignments[local].insert(LocationExtended::Plain(loc));
|
||||||
|
if let Set1::One(_) = self.assignments[local] {
|
||||||
|
// Only record if SSA-like, to avoid growing the vector needlessly.
|
||||||
|
self.assignment_order.push(local);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.visit_place(place, PlaceContext::MutatingUse(MutatingUseContext::Store), loc);
|
||||||
|
}
|
||||||
|
self.visit_rvalue(rvalue, loc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(level = "trace", skip(ssa, body))]
|
#[instrument(level = "trace", skip(ssa, body))]
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
|
- [armv7-unknown-linux-uclibceabihf](platform-support/armv7-unknown-linux-uclibceabihf.md)
|
||||||
- [\*-android and \*-androideabi](platform-support/android.md)
|
- [\*-android and \*-androideabi](platform-support/android.md)
|
||||||
- [\*-linux-ohos](platform-support/openharmony.md)
|
- [\*-linux-ohos](platform-support/openharmony.md)
|
||||||
|
- [\*-esp-espidf](platform-support/esp-idf.md)
|
||||||
- [\*-unknown-fuchsia](platform-support/fuchsia.md)
|
- [\*-unknown-fuchsia](platform-support/fuchsia.md)
|
||||||
- [\*-kmc-solid_\*](platform-support/kmc-solid.md)
|
- [\*-kmc-solid_\*](platform-support/kmc-solid.md)
|
||||||
- [loongarch\*-unknown-linux-\*](platform-support/loongarch-linux.md)
|
- [loongarch\*-unknown-linux-\*](platform-support/loongarch-linux.md)
|
||||||
|
@ -297,7 +297,7 @@ target | std | host | notes
|
|||||||
`riscv32gc-unknown-linux-musl` | | | RISC-V Linux (kernel 5.4, musl + RISCV32 support patches)
|
`riscv32gc-unknown-linux-musl` | | | RISC-V Linux (kernel 5.4, musl + RISCV32 support patches)
|
||||||
`riscv32im-unknown-none-elf` | * | | Bare RISC-V (RV32IM ISA)
|
`riscv32im-unknown-none-elf` | * | | Bare RISC-V (RV32IM ISA)
|
||||||
[`riscv32imac-unknown-xous-elf`](platform-support/riscv32imac-unknown-xous-elf.md) | ? | | RISC-V Xous (RV32IMAC ISA)
|
[`riscv32imac-unknown-xous-elf`](platform-support/riscv32imac-unknown-xous-elf.md) | ? | | RISC-V Xous (RV32IMAC ISA)
|
||||||
`riscv32imc-esp-espidf` | ✓ | | RISC-V ESP-IDF
|
[`riscv32imc-esp-espidf`](platform-support/esp-idf.md) | ✓ | | RISC-V ESP-IDF
|
||||||
`riscv64gc-unknown-freebsd` | | | RISC-V FreeBSD
|
`riscv64gc-unknown-freebsd` | | | RISC-V FreeBSD
|
||||||
`riscv64gc-unknown-fuchsia` | | | RISC-V Fuchsia
|
`riscv64gc-unknown-fuchsia` | | | RISC-V Fuchsia
|
||||||
`riscv64gc-unknown-linux-musl` | | | RISC-V Linux (kernel 4.20, musl 1.2.0)
|
`riscv64gc-unknown-linux-musl` | | | RISC-V Linux (kernel 4.20, musl 1.2.0)
|
||||||
|
41
src/doc/rustc/src/platform-support/esp-idf.md
Normal file
41
src/doc/rustc/src/platform-support/esp-idf.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# `*-esp-espidf`
|
||||||
|
|
||||||
|
**Tier: 3**
|
||||||
|
|
||||||
|
Targets for the [ESP-IDF](https://github.com/espressif/esp-idf) development framework running on RISC-V and Xtensa CPUs.
|
||||||
|
|
||||||
|
## Target maintainers
|
||||||
|
|
||||||
|
- Ivan Markov [@ivmarkov](https://github.com/ivmarkov)
|
||||||
|
- Scott Mabin [@MabezDev](https://github.com/MabezDev)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
The target names follow this format: `$ARCH-esp-espidf`, where `$ARCH` specifies the target processor architecture. The following targets are currently defined:
|
||||||
|
|
||||||
|
| Target name | Target CPU(s) |
|
||||||
|
|--------------------------------|-----------------------|
|
||||||
|
| `riscv32imc-esp-espidf` | [ESP32-C3](https://www.espressif.com/en/products/socs/esp32-c3) |
|
||||||
|
|
||||||
|
The minimum supported ESP-IDF version is `v4.3`, though it is recommended to use the latest stable release if possible.
|
||||||
|
|
||||||
|
## Building the target
|
||||||
|
|
||||||
|
The target can be built by enabling it for a `rustc` build. The `build-std` feature is required to build the standard library for ESP-IDF. `ldproxy` is also required for linking, it can be installed from crates.io.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[build]
|
||||||
|
target = ["$ARCH-esp-espidf"]
|
||||||
|
|
||||||
|
[target.$ARCH-esp-espidf]
|
||||||
|
linker = "ldproxy"
|
||||||
|
|
||||||
|
[unstable]
|
||||||
|
build-std = ["std", "panic_abort"]
|
||||||
|
```
|
||||||
|
|
||||||
|
The `esp-idf-sys` crate will handle the compilation of ESP-IDF, including downloading the relevant toolchains for the build.
|
||||||
|
|
||||||
|
## Cross-compilation toolchains and C code
|
||||||
|
|
||||||
|
`esp-idf-sys` exposes the toolchain used in the compilation of ESP-IDF, see the crate [documentation for build output propagation](https://github.com/esp-rs/esp-idf-sys#conditional-compilation) for more information.
|
@ -2414,14 +2414,15 @@ fn clean_impl<'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let for_ = clean_ty(impl_.self_ty, cx);
|
let for_ = clean_ty(impl_.self_ty, cx);
|
||||||
let type_alias = for_.def_id(&cx.cache).and_then(|did| match tcx.def_kind(did) {
|
let type_alias =
|
||||||
DefKind::TyAlias => Some(clean_middle_ty(
|
for_.def_id(&cx.cache).and_then(|alias_def_id: DefId| match tcx.def_kind(alias_def_id) {
|
||||||
ty::Binder::dummy(tcx.type_of(did).subst_identity()),
|
DefKind::TyAlias => Some(clean_middle_ty(
|
||||||
cx,
|
ty::Binder::dummy(tcx.type_of(def_id).subst_identity()),
|
||||||
Some(did),
|
cx,
|
||||||
)),
|
Some(def_id.to_def_id()),
|
||||||
_ => None,
|
)),
|
||||||
});
|
_ => None,
|
||||||
|
});
|
||||||
let mut make_item = |trait_: Option<Path>, for_: Type, items: Vec<Item>| {
|
let mut make_item = |trait_: Option<Path>, for_: Type, items: Vec<Item>| {
|
||||||
let kind = ImplItem(Box::new(Impl {
|
let kind = ImplItem(Box::new(Impl {
|
||||||
unsafety: impl_.unsafety,
|
unsafety: impl_.unsafety,
|
||||||
|
@ -25,7 +25,7 @@ pub fn issue71861(vec: Vec<u32>) -> Box<[u32]> {
|
|||||||
|
|
||||||
// Call to panic_cannot_unwind in case of double-panic is expected
|
// Call to panic_cannot_unwind in case of double-panic is expected
|
||||||
// on LLVM 16 and older, but other panics are not.
|
// on LLVM 16 and older, but other panics are not.
|
||||||
// CHECK: filter
|
// old: filter
|
||||||
// old-NEXT: ; call core::panicking::panic_cannot_unwind
|
// old-NEXT: ; call core::panicking::panic_cannot_unwind
|
||||||
// old-NEXT: panic_cannot_unwind
|
// old-NEXT: panic_cannot_unwind
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ pub fn issue75636<'a>(iter: &[&'a str]) -> Box<[&'a str]> {
|
|||||||
|
|
||||||
// Call to panic_cannot_unwind in case of double-panic is expected,
|
// Call to panic_cannot_unwind in case of double-panic is expected,
|
||||||
// on LLVM 16 and older, but other panics are not.
|
// on LLVM 16 and older, but other panics are not.
|
||||||
// CHECK: filter
|
// old: filter
|
||||||
// old-NEXT: ; call core::panicking::panic_cannot_unwind
|
// old-NEXT: ; call core::panicking::panic_cannot_unwind
|
||||||
// old-NEXT: panic_cannot_unwind
|
// old-NEXT: panic_cannot_unwind
|
||||||
|
|
||||||
|
13
tests/mir-opt/copy-prop/partial_init.main.CopyProp.diff
Normal file
13
tests/mir-opt/copy-prop/partial_init.main.CopyProp.diff
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
- // MIR for `main` before CopyProp
|
||||||
|
+ // MIR for `main` after CopyProp
|
||||||
|
|
||||||
|
fn main() -> () {
|
||||||
|
let mut _0: (); // return place in scope 0 at $DIR/partial_init.rs:+0:15: +0:15
|
||||||
|
let mut _1: (isize,); // in scope 0 at $SRC_DIR/core/src/intrinsics/mir.rs:LL:COL
|
||||||
|
|
||||||
|
bb0: {
|
||||||
|
(_1.0: isize) = const 1_isize; // scope 0 at $DIR/partial_init.rs:+4:13: +4:20
|
||||||
|
return; // scope 0 at $DIR/partial_init.rs:+5:13: +5:21
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
18
tests/mir-opt/copy-prop/partial_init.rs
Normal file
18
tests/mir-opt/copy-prop/partial_init.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// unit-test: CopyProp
|
||||||
|
// Verify that we do not ICE on partial initializations.
|
||||||
|
|
||||||
|
#![feature(custom_mir, core_intrinsics)]
|
||||||
|
extern crate core;
|
||||||
|
use core::intrinsics::mir::*;
|
||||||
|
|
||||||
|
// EMIT_MIR partial_init.main.CopyProp.diff
|
||||||
|
#[custom_mir(dialect = "runtime", phase = "post-cleanup")]
|
||||||
|
pub fn main() {
|
||||||
|
mir! (
|
||||||
|
let x: (isize, );
|
||||||
|
{
|
||||||
|
x.0 = 1;
|
||||||
|
Return()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
9
tests/rustdoc/impl-alias-substituted.rs
Normal file
9
tests/rustdoc/impl-alias-substituted.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
pub struct Matrix<T, const N: usize, const M: usize>([[T; N]; M]);
|
||||||
|
|
||||||
|
pub type Vector<T, const N: usize> = Matrix<T, N, 1>;
|
||||||
|
|
||||||
|
// @has "impl_alias_substituted/struct.Matrix.html" '//*[@class="impl"]//h3[@class="code-header"]' \
|
||||||
|
// "impl<T: Copy> Matrix<T, 3, 1>"
|
||||||
|
impl<T: Copy> Vector<T, 3> {
|
||||||
|
pub fn test() {}
|
||||||
|
}
|
19
tests/ui/check-cfg/order-independant.names_after.stderr
Normal file
19
tests/ui/check-cfg/order-independant.names_after.stderr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
warning: unexpected `cfg` condition value
|
||||||
|
--> $DIR/order-independant.rs:8:7
|
||||||
|
|
|
||||||
|
LL | #[cfg(a)]
|
||||||
|
| ^- help: specify a config value: `= "b"`
|
||||||
|
|
|
||||||
|
= note: expected values for `a` are: `b`
|
||||||
|
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||||
|
|
||||||
|
warning: unexpected `cfg` condition value
|
||||||
|
--> $DIR/order-independant.rs:12:7
|
||||||
|
|
|
||||||
|
LL | #[cfg(a = "unk")]
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: expected values for `a` are: `b`
|
||||||
|
|
||||||
|
warning: 2 warnings emitted
|
||||||
|
|
19
tests/ui/check-cfg/order-independant.names_before.stderr
Normal file
19
tests/ui/check-cfg/order-independant.names_before.stderr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
warning: unexpected `cfg` condition value
|
||||||
|
--> $DIR/order-independant.rs:8:7
|
||||||
|
|
|
||||||
|
LL | #[cfg(a)]
|
||||||
|
| ^- help: specify a config value: `= "b"`
|
||||||
|
|
|
||||||
|
= note: expected values for `a` are: `b`
|
||||||
|
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||||
|
|
||||||
|
warning: unexpected `cfg` condition value
|
||||||
|
--> $DIR/order-independant.rs:12:7
|
||||||
|
|
|
||||||
|
LL | #[cfg(a = "unk")]
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: expected values for `a` are: `b`
|
||||||
|
|
||||||
|
warning: 2 warnings emitted
|
||||||
|
|
16
tests/ui/check-cfg/order-independant.rs
Normal file
16
tests/ui/check-cfg/order-independant.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// check-pass
|
||||||
|
// revisions: names_before names_after
|
||||||
|
// compile-flags: -Z unstable-options
|
||||||
|
// compile-flags: --check-cfg=names(names_before,names_after)
|
||||||
|
// [names_before]compile-flags: --check-cfg=names(a) --check-cfg=values(a,"b")
|
||||||
|
// [names_after]compile-flags: --check-cfg=values(a,"b") --check-cfg=names(a)
|
||||||
|
|
||||||
|
#[cfg(a)]
|
||||||
|
//~^ WARNING unexpected `cfg` condition value
|
||||||
|
fn my_cfg() {}
|
||||||
|
|
||||||
|
#[cfg(a = "unk")]
|
||||||
|
//~^ WARNING unexpected `cfg` condition value
|
||||||
|
fn my_cfg() {}
|
||||||
|
|
||||||
|
fn main() {}
|
23
tests/ui/closures/2229_closure_analysis/bad-pattern.rs
Normal file
23
tests/ui/closures/2229_closure_analysis/bad-pattern.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// regression test for #108683
|
||||||
|
// edition:2021
|
||||||
|
|
||||||
|
enum Refutable {
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn example(v1: u32, v2: [u32; 4], v3: Refutable) {
|
||||||
|
const PAT: u32 = 0;
|
||||||
|
let v4 = &v2[..];
|
||||||
|
|| {
|
||||||
|
let 0 = v1; //~ ERROR refutable pattern in local binding
|
||||||
|
let (0 | 1) = v1; //~ ERROR refutable pattern in local binding
|
||||||
|
let 1.. = v1; //~ ERROR refutable pattern in local binding
|
||||||
|
let [0, 0, 0, 0] = v2; //~ ERROR refutable pattern in local binding
|
||||||
|
let [0] = v4; //~ ERROR refutable pattern in local binding
|
||||||
|
let Refutable::A = v3; //~ ERROR refutable pattern in local binding
|
||||||
|
let PAT = v1; //~ ERROR refutable pattern in local binding
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
113
tests/ui/closures/2229_closure_analysis/bad-pattern.stderr
Normal file
113
tests/ui/closures/2229_closure_analysis/bad-pattern.stderr
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:13:13
|
||||||
|
|
|
||||||
|
LL | let 0 = v1;
|
||||||
|
| ^ pattern `1_u32..=u32::MAX` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `u32`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let 0 = v1 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
help: alternatively, you could prepend the pattern with an underscore to define a new named variable; identifiers cannot begin with digits
|
||||||
|
|
|
||||||
|
LL | let _0 = v1;
|
||||||
|
| +
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:14:14
|
||||||
|
|
|
||||||
|
LL | let (0 | 1) = v1;
|
||||||
|
| ^^^^^ pattern `2_u32..=u32::MAX` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `u32`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let (0 | 1) = v1 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:15:13
|
||||||
|
|
|
||||||
|
LL | let 1.. = v1;
|
||||||
|
| ^^^ pattern `0_u32` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `u32`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let 1.. = v1 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:16:13
|
||||||
|
|
|
||||||
|
LL | let [0, 0, 0, 0] = v2;
|
||||||
|
| ^^^^^^^^^^^^ pattern `[1_u32..=u32::MAX, _, _, _]` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `[u32; 4]`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let [0, 0, 0, 0] = v2 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:17:13
|
||||||
|
|
|
||||||
|
LL | let [0] = v4;
|
||||||
|
| ^^^ patterns `&[]` and `&[_, _, ..]` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `&[u32]`
|
||||||
|
help: you might want to use `if let` to ignore the variants that aren't matched
|
||||||
|
|
|
||||||
|
LL | if let [0] = v4 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:18:13
|
||||||
|
|
|
||||||
|
LL | let Refutable::A = v3;
|
||||||
|
| ^^^^^^^^^^^^ pattern `Refutable::B` not covered
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
note: `Refutable` defined here
|
||||||
|
--> $DIR/bad-pattern.rs:4:6
|
||||||
|
|
|
||||||
|
LL | enum Refutable {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
LL | A,
|
||||||
|
LL | B,
|
||||||
|
| - not covered
|
||||||
|
= note: the matched value is of type `Refutable`
|
||||||
|
help: you might want to use `if let` to ignore the variant that isn't matched
|
||||||
|
|
|
||||||
|
LL | if let Refutable::A = v3 { todo!() };
|
||||||
|
| ++ +++++++++++
|
||||||
|
|
||||||
|
error[E0005]: refutable pattern in local binding
|
||||||
|
--> $DIR/bad-pattern.rs:19:13
|
||||||
|
|
|
||||||
|
LL | let PAT = v1;
|
||||||
|
| ^^^
|
||||||
|
| |
|
||||||
|
| pattern `1_u32..=u32::MAX` not covered
|
||||||
|
| missing patterns are not covered because `PAT` is interpreted as a constant pattern, not a new variable
|
||||||
|
| help: introduce a variable instead: `PAT_var`
|
||||||
|
|
|
||||||
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
|
||||||
|
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
|
||||||
|
= note: the matched value is of type `u32`
|
||||||
|
|
||||||
|
error: aborting due to 7 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0005`.
|
Loading…
Reference in New Issue
Block a user