Auto merge of #119552 - krtab:dead_code_priv_mod_pub_field, r=cjgillot,saethlin
Replace visibility test with reachability test in dead code detection Fixes https://github.com/rust-lang/rust/issues/119545 Also included is a fix for an error now flagged by the lint
This commit is contained in:
commit
c308726599
29 changed files with 129 additions and 53 deletions
|
@ -2065,7 +2065,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
from_closure: constraint.from_closure,
|
from_closure: constraint.from_closure,
|
||||||
cause: ObligationCause::new(constraint.span, CRATE_DEF_ID, cause_code.clone()),
|
cause: ObligationCause::new(constraint.span, CRATE_DEF_ID, cause_code.clone()),
|
||||||
variance_info: constraint.variance_info,
|
variance_info: constraint.variance_info,
|
||||||
outlives_constraint: *constraint,
|
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
debug!("categorized_path={:#?}", categorized_path);
|
debug!("categorized_path={:#?}", categorized_path);
|
||||||
|
@ -2294,5 +2293,4 @@ pub struct BlameConstraint<'tcx> {
|
||||||
pub from_closure: bool,
|
pub from_closure: bool,
|
||||||
pub cause: ObligationCause<'tcx>,
|
pub cause: ObligationCause<'tcx>,
|
||||||
pub variance_info: ty::VarianceDiagInfo<'tcx>,
|
pub variance_info: ty::VarianceDiagInfo<'tcx>,
|
||||||
pub outlives_constraint: OutlivesConstraint<'tcx>,
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
|
||||||
|
|
||||||
let (ident, vdata, fields) = match substr.fields {
|
let (ident, vdata, fields) = match substr.fields {
|
||||||
Struct(vdata, fields) => (substr.type_ident, *vdata, fields),
|
Struct(vdata, fields) => (substr.type_ident, *vdata, fields),
|
||||||
EnumMatching(_, _, v, fields) => (v.ident, &v.data, fields),
|
EnumMatching(_, v, fields) => (v.ident, &v.data, fields),
|
||||||
AllFieldlessEnum(enum_def) => return show_fieldless_enum(cx, span, enum_def, substr),
|
AllFieldlessEnum(enum_def) => return show_fieldless_enum(cx, span, enum_def, substr),
|
||||||
EnumTag(..) | StaticStruct(..) | StaticEnum(..) => {
|
EnumTag(..) | StaticStruct(..) | StaticEnum(..) => {
|
||||||
cx.dcx().span_bug(span, "nonsensical .fields in `#[derive(Debug)]`")
|
cx.dcx().span_bug(span, "nonsensical .fields in `#[derive(Debug)]`")
|
||||||
|
|
|
@ -226,7 +226,7 @@ fn encodable_substructure(
|
||||||
BlockOrExpr::new_expr(expr)
|
BlockOrExpr::new_expr(expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
EnumMatching(idx, _, variant, fields) => {
|
EnumMatching(idx, variant, fields) => {
|
||||||
// We're not generating an AST that the borrow checker is expecting,
|
// We're not generating an AST that the borrow checker is expecting,
|
||||||
// so we need to generate a unique local variable to take the
|
// so we need to generate a unique local variable to take the
|
||||||
// mutable loan out on, otherwise we get conflicts which don't
|
// mutable loan out on, otherwise we get conflicts which don't
|
||||||
|
|
|
@ -310,10 +310,10 @@ pub enum SubstructureFields<'a> {
|
||||||
/// variants has any fields).
|
/// variants has any fields).
|
||||||
AllFieldlessEnum(&'a ast::EnumDef),
|
AllFieldlessEnum(&'a ast::EnumDef),
|
||||||
|
|
||||||
/// Matching variants of the enum: variant index, variant count, ast::Variant,
|
/// Matching variants of the enum: variant index, ast::Variant,
|
||||||
/// fields: the field name is only non-`None` in the case of a struct
|
/// fields: the field name is only non-`None` in the case of a struct
|
||||||
/// variant.
|
/// variant.
|
||||||
EnumMatching(usize, usize, &'a ast::Variant, Vec<FieldInfo>),
|
EnumMatching(usize, &'a ast::Variant, Vec<FieldInfo>),
|
||||||
|
|
||||||
/// The tag of an enum. The first field is a `FieldInfo` for the tags, as
|
/// The tag of an enum. The first field is a `FieldInfo` for the tags, as
|
||||||
/// if they were fields. The second field is the expression to combine the
|
/// if they were fields. The second field is the expression to combine the
|
||||||
|
@ -1272,7 +1272,7 @@ impl<'a> MethodDef<'a> {
|
||||||
trait_,
|
trait_,
|
||||||
type_ident,
|
type_ident,
|
||||||
nonselflike_args,
|
nonselflike_args,
|
||||||
&EnumMatching(0, 1, &variants[0], Vec::new()),
|
&EnumMatching(0, &variants[0], Vec::new()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1318,7 +1318,7 @@ impl<'a> MethodDef<'a> {
|
||||||
// expressions for referencing every field of every
|
// expressions for referencing every field of every
|
||||||
// Self arg, assuming all are instances of VariantK.
|
// Self arg, assuming all are instances of VariantK.
|
||||||
// Build up code associated with such a case.
|
// Build up code associated with such a case.
|
||||||
let substructure = EnumMatching(index, variants.len(), variant, fields);
|
let substructure = EnumMatching(index, variant, fields);
|
||||||
let arm_expr = self
|
let arm_expr = self
|
||||||
.call_substructure_method(
|
.call_substructure_method(
|
||||||
cx,
|
cx,
|
||||||
|
@ -1346,7 +1346,7 @@ impl<'a> MethodDef<'a> {
|
||||||
trait_,
|
trait_,
|
||||||
type_ident,
|
type_ident,
|
||||||
nonselflike_args,
|
nonselflike_args,
|
||||||
&EnumMatching(0, variants.len(), v, Vec::new()),
|
&EnumMatching(0, v, Vec::new()),
|
||||||
)
|
)
|
||||||
.into_expr(cx, span),
|
.into_expr(cx, span),
|
||||||
)
|
)
|
||||||
|
|
|
@ -110,6 +110,7 @@ pub struct CodegenCx<'gcc, 'tcx> {
|
||||||
local_gen_sym_counter: Cell<usize>,
|
local_gen_sym_counter: Cell<usize>,
|
||||||
|
|
||||||
eh_personality: Cell<Option<RValue<'gcc>>>,
|
eh_personality: Cell<Option<RValue<'gcc>>>,
|
||||||
|
#[cfg(feature="master")]
|
||||||
pub rust_try_fn: Cell<Option<(Type<'gcc>, Function<'gcc>)>>,
|
pub rust_try_fn: Cell<Option<(Type<'gcc>, Function<'gcc>)>>,
|
||||||
|
|
||||||
pub pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>,
|
pub pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>,
|
||||||
|
@ -121,6 +122,7 @@ pub struct CodegenCx<'gcc, 'tcx> {
|
||||||
/// FIXME(antoyo): fix the rustc API to avoid having this hack.
|
/// FIXME(antoyo): fix the rustc API to avoid having this hack.
|
||||||
pub structs_as_pointer: RefCell<FxHashSet<RValue<'gcc>>>,
|
pub structs_as_pointer: RefCell<FxHashSet<RValue<'gcc>>>,
|
||||||
|
|
||||||
|
#[cfg(feature="master")]
|
||||||
pub cleanup_blocks: RefCell<FxHashSet<Block<'gcc>>>,
|
pub cleanup_blocks: RefCell<FxHashSet<Block<'gcc>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,9 +327,11 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
|
||||||
struct_types: Default::default(),
|
struct_types: Default::default(),
|
||||||
local_gen_sym_counter: Cell::new(0),
|
local_gen_sym_counter: Cell::new(0),
|
||||||
eh_personality: Cell::new(None),
|
eh_personality: Cell::new(None),
|
||||||
|
#[cfg(feature="master")]
|
||||||
rust_try_fn: Cell::new(None),
|
rust_try_fn: Cell::new(None),
|
||||||
pointee_infos: Default::default(),
|
pointee_infos: Default::default(),
|
||||||
structs_as_pointer: Default::default(),
|
structs_as_pointer: Default::default(),
|
||||||
|
#[cfg(feature="master")]
|
||||||
cleanup_blocks: Default::default(),
|
cleanup_blocks: Default::default(),
|
||||||
};
|
};
|
||||||
// TODO(antoyo): instead of doing this, add SsizeT to libgccjit.
|
// TODO(antoyo): instead of doing this, add SsizeT to libgccjit.
|
||||||
|
|
|
@ -27,9 +27,7 @@ use rustc_session::config::{CrateType, DebugInfo, PAuthKey, PacRet};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
use rustc_target::abi::{
|
use rustc_target::abi::{call::FnAbi, HasDataLayout, TargetDataLayout, VariantIdx};
|
||||||
call::FnAbi, HasDataLayout, PointeeInfo, Size, TargetDataLayout, VariantIdx,
|
|
||||||
};
|
|
||||||
use rustc_target::spec::{HasTargetSpec, RelocModel, Target, TlsModel};
|
use rustc_target::spec::{HasTargetSpec, RelocModel, Target, TlsModel};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
|
@ -83,7 +81,6 @@ pub struct CodegenCx<'ll, 'tcx> {
|
||||||
/// Mapping of scalar types to llvm types.
|
/// Mapping of scalar types to llvm types.
|
||||||
pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>,
|
pub scalar_lltypes: RefCell<FxHashMap<Ty<'tcx>, &'ll Type>>,
|
||||||
|
|
||||||
pub pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>,
|
|
||||||
pub isize_ty: &'ll Type,
|
pub isize_ty: &'ll Type,
|
||||||
|
|
||||||
pub coverage_cx: Option<coverageinfo::CrateCoverageContext<'ll, 'tcx>>,
|
pub coverage_cx: Option<coverageinfo::CrateCoverageContext<'ll, 'tcx>>,
|
||||||
|
@ -450,7 +447,6 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
||||||
compiler_used_statics: RefCell::new(Vec::new()),
|
compiler_used_statics: RefCell::new(Vec::new()),
|
||||||
type_lowering: Default::default(),
|
type_lowering: Default::default(),
|
||||||
scalar_lltypes: Default::default(),
|
scalar_lltypes: Default::default(),
|
||||||
pointee_infos: Default::default(),
|
|
||||||
isize_ty,
|
isize_ty,
|
||||||
coverage_cx,
|
coverage_cx,
|
||||||
dbg_cx,
|
dbg_cx,
|
||||||
|
|
|
@ -131,7 +131,7 @@ fn propagate_ssa<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
|local, value, location| {
|
|local, value, location| {
|
||||||
let value = match value {
|
let value = match value {
|
||||||
// We do not know anything of this assigned value.
|
// We do not know anything of this assigned value.
|
||||||
AssignedValue::Arg | AssignedValue::Terminator(_) => None,
|
AssignedValue::Arg | AssignedValue::Terminator => None,
|
||||||
// Try to get some insight.
|
// Try to get some insight.
|
||||||
AssignedValue::Rvalue(rvalue) => {
|
AssignedValue::Rvalue(rvalue) => {
|
||||||
let value = state.simplify_rvalue(rvalue, location);
|
let value = state.simplify_rvalue(rvalue, location);
|
||||||
|
|
|
@ -29,7 +29,7 @@ pub struct SsaLocals {
|
||||||
pub enum AssignedValue<'a, 'tcx> {
|
pub enum AssignedValue<'a, 'tcx> {
|
||||||
Arg,
|
Arg,
|
||||||
Rvalue(&'a mut Rvalue<'tcx>),
|
Rvalue(&'a mut Rvalue<'tcx>),
|
||||||
Terminator(&'a mut TerminatorKind<'tcx>),
|
Terminator,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SsaLocals {
|
impl SsaLocals {
|
||||||
|
@ -149,8 +149,7 @@ impl SsaLocals {
|
||||||
Set1::One(DefLocation::CallReturn { call, .. }) => {
|
Set1::One(DefLocation::CallReturn { call, .. }) => {
|
||||||
let bb = &mut basic_blocks[call];
|
let bb = &mut basic_blocks[call];
|
||||||
let loc = Location { block: call, statement_index: bb.statements.len() };
|
let loc = Location { block: call, statement_index: bb.statements.len() };
|
||||||
let term = bb.terminator_mut();
|
f(local, AssignedValue::Terminator, loc)
|
||||||
f(local, AssignedValue::Terminator(&mut term.kind), loc)
|
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -525,15 +525,16 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
let unconditionally_treat_fields_as_live = self.repr_unconditionally_treats_fields_as_live;
|
let unconditionally_treat_fields_as_live = self.repr_unconditionally_treats_fields_as_live;
|
||||||
let has_repr_simd = self.repr_has_repr_simd;
|
let has_repr_simd = self.repr_has_repr_simd;
|
||||||
|
let effective_visibilities = &tcx.effective_visibilities(());
|
||||||
let live_fields = def.fields().iter().filter_map(|f| {
|
let live_fields = def.fields().iter().filter_map(|f| {
|
||||||
let def_id = f.def_id;
|
let def_id = f.def_id;
|
||||||
if unconditionally_treat_fields_as_live || (f.is_positional() && has_repr_simd) {
|
if unconditionally_treat_fields_as_live || (f.is_positional() && has_repr_simd) {
|
||||||
return Some(def_id);
|
return Some(def_id);
|
||||||
}
|
}
|
||||||
if !tcx.visibility(f.hir_id.owner.def_id).is_public() {
|
if !effective_visibilities.is_reachable(f.hir_id.owner.def_id) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
if tcx.visibility(def_id).is_public() { Some(def_id) } else { None }
|
if effective_visibilities.is_reachable(def_id) { Some(def_id) } else { None }
|
||||||
});
|
});
|
||||||
self.live_symbols.extend(live_fields);
|
self.live_symbols.extend(live_fields);
|
||||||
|
|
||||||
|
|
|
@ -655,7 +655,7 @@ impl<BorrowType: marker::BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Lea
|
||||||
pub enum Position<BorrowType, K, V> {
|
pub enum Position<BorrowType, K, V> {
|
||||||
Leaf(NodeRef<BorrowType, K, V, marker::Leaf>),
|
Leaf(NodeRef<BorrowType, K, V, marker::Leaf>),
|
||||||
Internal(NodeRef<BorrowType, K, V, marker::Internal>),
|
Internal(NodeRef<BorrowType, K, V, marker::Internal>),
|
||||||
InternalKV(Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::KV>),
|
InternalKV,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal> {
|
impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal> {
|
||||||
|
@ -677,7 +677,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal>
|
||||||
visit(Position::Leaf(leaf));
|
visit(Position::Leaf(leaf));
|
||||||
match edge.next_kv() {
|
match edge.next_kv() {
|
||||||
Ok(kv) => {
|
Ok(kv) => {
|
||||||
visit(Position::InternalKV(kv));
|
visit(Position::InternalKV);
|
||||||
kv.right_edge()
|
kv.right_edge()
|
||||||
}
|
}
|
||||||
Err(_) => return,
|
Err(_) => return,
|
||||||
|
@ -699,7 +699,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal>
|
||||||
self.visit_nodes_in_order(|pos| match pos {
|
self.visit_nodes_in_order(|pos| match pos {
|
||||||
Position::Leaf(node) => result += node.len(),
|
Position::Leaf(node) => result += node.len(),
|
||||||
Position::Internal(node) => result += node.len(),
|
Position::Internal(node) => result += node.len(),
|
||||||
Position::InternalKV(_) => (),
|
Position::InternalKV => (),
|
||||||
});
|
});
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,11 +32,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Immut<'a>, K, V, marker::LeafOrInternal>
|
||||||
result += &format!("\n{}{:?}", indent, leaf.keys());
|
result += &format!("\n{}{:?}", indent, leaf.keys());
|
||||||
}
|
}
|
||||||
navigate::Position::Internal(_) => {}
|
navigate::Position::Internal(_) => {}
|
||||||
navigate::Position::InternalKV(kv) => {
|
navigate::Position::InternalKV => {}
|
||||||
let depth = self.height() - kv.into_node().height();
|
|
||||||
let indent = " ".repeat(depth);
|
|
||||||
result += &format!("\n{}{:?}", indent, kv.into_kv().0);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
|
@ -524,6 +524,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in {
|
pub struct sockaddr_in {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin_family: sa_family_t,
|
pub sin_family: sa_family_t,
|
||||||
pub sin_port: u16,
|
pub sin_port: u16,
|
||||||
pub sin_addr: in_addr,
|
pub sin_addr: in_addr,
|
||||||
|
@ -536,6 +537,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in6 {
|
pub struct sockaddr_in6 {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin6_family: sa_family_t,
|
pub sin6_family: sa_family_t,
|
||||||
pub sin6_port: u16,
|
pub sin6_port: u16,
|
||||||
pub sin6_addr: in6_addr,
|
pub sin6_addr: in6_addr,
|
||||||
|
|
|
@ -35,7 +35,7 @@ pub unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern "C" fn(*mut u8)) {
|
||||||
#[cfg(not(sanitizer_cfi_normalize_integers))]
|
#[cfg(not(sanitizer_cfi_normalize_integers))]
|
||||||
#[cfi_encoding = "i"]
|
#[cfi_encoding = "i"]
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct c_int(pub libc::c_int);
|
pub struct c_int(#[allow(dead_code)] pub libc::c_int);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#[linkage = "extern_weak"]
|
#[linkage = "extern_weak"]
|
||||||
|
|
|
@ -346,6 +346,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in {
|
pub struct sockaddr_in {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin_family: sa_family_t,
|
pub sin_family: sa_family_t,
|
||||||
pub sin_port: u16,
|
pub sin_port: u16,
|
||||||
pub sin_addr: in_addr,
|
pub sin_addr: in_addr,
|
||||||
|
@ -358,6 +359,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in6 {
|
pub struct sockaddr_in6 {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin6_family: sa_family_t,
|
pub sin6_family: sa_family_t,
|
||||||
pub sin6_port: u16,
|
pub sin6_port: u16,
|
||||||
pub sin6_addr: in6_addr,
|
pub sin6_addr: in6_addr,
|
||||||
|
|
|
@ -520,6 +520,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in {
|
pub struct sockaddr_in {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin_family: sa_family_t,
|
pub sin_family: sa_family_t,
|
||||||
pub sin_port: u16,
|
pub sin_port: u16,
|
||||||
pub sin_addr: in_addr,
|
pub sin_addr: in_addr,
|
||||||
|
@ -532,6 +533,7 @@ pub mod netc {
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct sockaddr_in6 {
|
pub struct sockaddr_in6 {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub sin6_family: sa_family_t,
|
pub sin6_family: sa_family_t,
|
||||||
pub sin6_port: u16,
|
pub sin6_port: u16,
|
||||||
pub sin6_addr: in6_addr,
|
pub sin6_addr: in6_addr,
|
||||||
|
|
|
@ -46,7 +46,6 @@ pub struct ConsoleTestDiscoveryState {
|
||||||
pub tests: usize,
|
pub tests: usize,
|
||||||
pub benchmarks: usize,
|
pub benchmarks: usize,
|
||||||
pub ignored: usize,
|
pub ignored: usize,
|
||||||
pub options: Options,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConsoleTestDiscoveryState {
|
impl ConsoleTestDiscoveryState {
|
||||||
|
@ -56,13 +55,7 @@ impl ConsoleTestDiscoveryState {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(ConsoleTestDiscoveryState {
|
Ok(ConsoleTestDiscoveryState { log_out, tests: 0, benchmarks: 0, ignored: 0 })
|
||||||
log_out,
|
|
||||||
tests: 0,
|
|
||||||
benchmarks: 0,
|
|
||||||
ignored: 0,
|
|
||||||
options: opts.options,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_log<F, S>(&mut self, msg: F) -> io::Result<()>
|
pub fn write_log<F, S>(&mut self, msg: F) -> io::Result<()>
|
||||||
|
|
|
@ -2140,18 +2140,9 @@ pub struct CargoTarget<'a> {
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
#[serde(tag = "reason", rename_all = "kebab-case")]
|
#[serde(tag = "reason", rename_all = "kebab-case")]
|
||||||
pub enum CargoMessage<'a> {
|
pub enum CargoMessage<'a> {
|
||||||
CompilerArtifact {
|
CompilerArtifact { filenames: Vec<Cow<'a, str>>, target: CargoTarget<'a> },
|
||||||
package_id: Cow<'a, str>,
|
BuildScriptExecuted,
|
||||||
features: Vec<Cow<'a, str>>,
|
BuildFinished,
|
||||||
filenames: Vec<Cow<'a, str>>,
|
|
||||||
target: CargoTarget<'a>,
|
|
||||||
},
|
|
||||||
BuildScriptExecuted {
|
|
||||||
package_id: Cow<'a, str>,
|
|
||||||
},
|
|
||||||
BuildFinished {
|
|
||||||
success: bool,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn strip_debug(builder: &Builder<'_>, target: TargetSelection, path: &Path) {
|
pub fn strip_debug(builder: &Builder<'_>, target: TargetSelection, path: &Path) {
|
||||||
|
|
|
@ -108,7 +108,7 @@ impl EarlyLintPass for RawStrings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let req = {
|
let mut req = {
|
||||||
let mut following_quote = false;
|
let mut following_quote = false;
|
||||||
let mut req = 0;
|
let mut req = 0;
|
||||||
// `once` so a raw string ending in hashes is still checked
|
// `once` so a raw string ending in hashes is still checked
|
||||||
|
@ -136,7 +136,9 @@ impl EarlyLintPass for RawStrings {
|
||||||
ControlFlow::Continue(num) | ControlFlow::Break(num) => num,
|
ControlFlow::Continue(num) | ControlFlow::Break(num) => num,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
if self.allow_one_hash_in_raw_strings {
|
||||||
|
req = req.max(1);
|
||||||
|
}
|
||||||
if req < max {
|
if req < max {
|
||||||
span_lint_and_then(
|
span_lint_and_then(
|
||||||
cx,
|
cx,
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
allow-one-hash-in-raw-strings = true
|
|
@ -0,0 +1,9 @@
|
||||||
|
#![allow(clippy::no_effect, unused)]
|
||||||
|
#![warn(clippy::needless_raw_string_hashes)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
r#"\aaa"#;
|
||||||
|
r#"\aaa"#;
|
||||||
|
r#"Hello "world"!"#;
|
||||||
|
r####" "### "## "# "####;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
#![allow(clippy::no_effect, unused)]
|
||||||
|
#![warn(clippy::needless_raw_string_hashes)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
r#"\aaa"#;
|
||||||
|
r##"\aaa"##;
|
||||||
|
r##"Hello "world"!"##;
|
||||||
|
r######" "### "## "# "######;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
error: unnecessary hashes around raw string literal
|
||||||
|
--> tests/ui-toml/needless_raw_string_hashes_one_allowed/needless_raw_string_hashes.rs:6:5
|
||||||
|
|
|
||||||
|
LL | r##"\aaa"##;
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: `-D clippy::needless-raw-string-hashes` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::needless_raw_string_hashes)]`
|
||||||
|
help: remove one hash from both sides of the string literal
|
||||||
|
|
|
||||||
|
LL - r##"\aaa"##;
|
||||||
|
LL + r#"\aaa"#;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: unnecessary hashes around raw string literal
|
||||||
|
--> tests/ui-toml/needless_raw_string_hashes_one_allowed/needless_raw_string_hashes.rs:7:5
|
||||||
|
|
|
||||||
|
LL | r##"Hello "world"!"##;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: remove one hash from both sides of the string literal
|
||||||
|
|
|
||||||
|
LL - r##"Hello "world"!"##;
|
||||||
|
LL + r#"Hello "world"!"#;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: unnecessary hashes around raw string literal
|
||||||
|
--> tests/ui-toml/needless_raw_string_hashes_one_allowed/needless_raw_string_hashes.rs:8:5
|
||||||
|
|
|
||||||
|
LL | r######" "### "## "# "######;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: remove 2 hashes from both sides of the string literal
|
||||||
|
|
|
||||||
|
LL - r######" "### "## "# "######;
|
||||||
|
LL + r####" "### "## "# "####;
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
|
@ -21,9 +21,11 @@ pub struct Epoll {
|
||||||
/// <https://man7.org/linux/man-pages/man2/epoll_ctl.2.html>
|
/// <https://man7.org/linux/man-pages/man2/epoll_ctl.2.html>
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct EpollEvent {
|
pub struct EpollEvent {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub events: u32,
|
pub events: u32,
|
||||||
/// `Scalar<Provenance>` is used to represent the
|
/// `Scalar<Provenance>` is used to represent the
|
||||||
/// `epoll_data` type union.
|
/// `epoll_data` type union.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub data: Scalar<Provenance>,
|
pub data: Scalar<Provenance>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
mod foo {
|
mod foo {
|
||||||
pub struct Point {
|
pub struct Point {
|
||||||
pub x: i32,
|
pub x: i32,
|
||||||
|
#[allow(dead_code)]
|
||||||
pub y: i32,
|
pub y: i32,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
11
tests/ui/lint/dead-code/pub-field-in-priv-mod.rs
Normal file
11
tests/ui/lint/dead-code/pub-field-in-priv-mod.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#![deny(dead_code)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = foo::S{f: false};
|
||||||
|
}
|
||||||
|
|
||||||
|
mod foo {
|
||||||
|
pub struct S {
|
||||||
|
pub f: bool, //~ ERROR field `f` is never read
|
||||||
|
}
|
||||||
|
}
|
16
tests/ui/lint/dead-code/pub-field-in-priv-mod.stderr
Normal file
16
tests/ui/lint/dead-code/pub-field-in-priv-mod.stderr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
error: field `f` is never read
|
||||||
|
--> $DIR/pub-field-in-priv-mod.rs:9:13
|
||||||
|
|
|
||||||
|
LL | pub struct S {
|
||||||
|
| - field in this struct
|
||||||
|
LL | pub f: bool,
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
note: the lint level is defined here
|
||||||
|
--> $DIR/pub-field-in-priv-mod.rs:1:9
|
||||||
|
|
|
||||||
|
LL | #![deny(dead_code)]
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
//@ run-rustfix
|
//@ run-rustfix
|
||||||
mod a {
|
pub mod a {
|
||||||
pub struct A(pub String);
|
pub struct A(pub String);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
//@ run-rustfix
|
//@ run-rustfix
|
||||||
mod a {
|
pub mod a {
|
||||||
pub struct A(pub(self)String);
|
pub struct A(pub(self)String);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ macro_rules! duplicate {
|
||||||
|
|
||||||
duplicate! {
|
duplicate! {
|
||||||
pub union U {
|
pub union U {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub a: u8
|
pub a: u8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue