mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
chore: Fix typos in 'compiler' (batch 1)
This commit is contained in:
parent
78d5c04d9c
commit
ac69544a17
@ -72,7 +72,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
fn has_self(&self, def_id: DefId, span: Span) -> bool {
|
||||
if let Some(local_sig_id) = def_id.as_local() {
|
||||
// The value may be missing due to recursive delegation.
|
||||
// Error will be emmited later during HIR ty lowering.
|
||||
// Error will be emitted later during HIR ty lowering.
|
||||
self.resolver.delegation_fn_sigs.get(&local_sig_id).map_or(false, |sig| sig.has_self)
|
||||
} else {
|
||||
match self.tcx.def_kind(def_id) {
|
||||
@ -139,7 +139,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
fn param_count(&self, sig_id: DefId) -> (usize, bool /*c_variadic*/) {
|
||||
if let Some(local_sig_id) = sig_id.as_local() {
|
||||
// Map may be filled incorrectly due to recursive delegation.
|
||||
// Error will be emmited later during HIR ty lowering.
|
||||
// Error will be emitted later during HIR ty lowering.
|
||||
match self.resolver.delegation_fn_sigs.get(&local_sig_id) {
|
||||
Some(sig) => (sig.param_count, sig.c_variadic),
|
||||
None => (0, false),
|
||||
|
@ -1179,7 +1179,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
|
||||
for field in &variant.fields {
|
||||
// In practice unless there are more than one field with the same type, we'll be
|
||||
// suggesting a single field at a type, because we don't aggregate multiple borrow
|
||||
// checker errors involving the functional record update sytnax into a single one.
|
||||
// checker errors involving the functional record update syntax into a single one.
|
||||
let field_ty = field.ty(self.infcx.tcx, args);
|
||||
let ident = field.ident(self.infcx.tcx);
|
||||
if field_ty == ty && fields.iter().all(|field| field.ident.name != ident.name) {
|
||||
|
@ -218,7 +218,7 @@ impl<'a, 'me, 'typeck, 'flow, 'tcx> LivenessResults<'a, 'me, 'typeck, 'flow, 'tc
|
||||
// This collect is more necessary than immediately apparent
|
||||
// because these facts go into `add_drop_live_facts_for()`,
|
||||
// which also writes to `all_facts`, and so this is genuinely
|
||||
// a simulatneous overlapping mutable borrow.
|
||||
// a simultaneous overlapping mutable borrow.
|
||||
// FIXME for future hackers: investigate whether this is
|
||||
// actually necessary; these facts come from Polonius
|
||||
// and probably maybe plausibly does not need to go back in.
|
||||
|
@ -422,7 +422,7 @@ fn prepare_usage_sets<'tcx>(tcx: TyCtxt<'tcx>) -> UsageSets<'tcx> {
|
||||
(instance.def_id(), body)
|
||||
});
|
||||
|
||||
// Functions whose coverage statments were found inlined into other functions.
|
||||
// Functions whose coverage statements were found inlined into other functions.
|
||||
let mut used_via_inlining = FxHashSet::default();
|
||||
// Functions that were instrumented, but had all of their coverage statements
|
||||
// removed by later MIR transforms (e.g. UnreachablePropagation).
|
||||
|
@ -701,7 +701,7 @@ fn push_const_param<'tcx>(tcx: TyCtxt<'tcx>, ct: ty::Const<'tcx>, output: &mut S
|
||||
match ty.kind() {
|
||||
ty::Int(ity) => {
|
||||
// FIXME: directly extract the bits from a valtree instead of evaluating an
|
||||
// alreay evaluated `Const` in order to get the bits.
|
||||
// already evaluated `Const` in order to get the bits.
|
||||
let bits = ct.eval_bits(tcx, ty::ParamEnv::reveal_all());
|
||||
let val = Integer::from_int_ty(&tcx, *ity).size().sign_extend(bits) as i128;
|
||||
write!(output, "{val}")
|
||||
|
@ -20,7 +20,7 @@ use super::{
|
||||
};
|
||||
use crate::fluent_generated as fluent;
|
||||
|
||||
/// An argment passed to a function.
|
||||
/// An argument passed to a function.
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum FnArg<'tcx, Prov: Provenance = CtfeProvenance> {
|
||||
/// Pass a copy of the given operand.
|
||||
@ -123,7 +123,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
||||
self.tcx.has_attr(def.did(), sym::rustc_nonnull_optimization_guaranteed)
|
||||
};
|
||||
let inner = self.unfold_transparent(inner, /* may_unfold */ |def| {
|
||||
// Stop at NPO tpyes so that we don't miss that attribute in the check below!
|
||||
// Stop at NPO types so that we don't miss that attribute in the check below!
|
||||
def.is_struct() && !is_npo(def)
|
||||
});
|
||||
Ok(match inner.ty.kind() {
|
||||
|
@ -574,7 +574,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
||||
// be computed as the type references non-existing names.
|
||||
// See <https://github.com/rust-lang/rust/issues/124348>.
|
||||
} else {
|
||||
// Looks like the const is not captued by `required_consts`, that's bad.
|
||||
// Looks like the const is not captured by `required_consts`, that's bad.
|
||||
span_bug!(span, "interpret const eval failure of {val:?} which is not in required_consts");
|
||||
}
|
||||
}
|
||||
|
@ -827,7 +827,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
||||
|
||||
let (size, align) = if nested {
|
||||
// Nested anonymous statics are untyped, so let's get their
|
||||
// size and alignment from the allocaiton itself. This always
|
||||
// size and alignment from the allocation itself. This always
|
||||
// succeeds, as the query is fed at DefId creation time, so no
|
||||
// evaluation actually occurs.
|
||||
let alloc = self.tcx.eval_static_initializer(def_id).unwrap();
|
||||
|
@ -186,7 +186,7 @@ pub(super) enum Place<Prov: Provenance = CtfeProvenance> {
|
||||
/// `Local` places always refer to the current stack frame, so they are unstable under
|
||||
/// function calls/returns and switching betweens stacks of different threads!
|
||||
/// We carry around the address of the `locals` buffer of the correct stack frame as a sanity
|
||||
/// chec to be able to catch some cases of using a dangling `Place`.
|
||||
/// check to be able to catch some cases of using a dangling `Place`.
|
||||
///
|
||||
/// This variant shall not be used for unsized types -- those must always live in memory.
|
||||
Local { local: mir::Local, offset: Option<Size>, locals_addr: usize },
|
||||
|
@ -1,5 +1,5 @@
|
||||
//! Manages the low-level pushing and popping of stack frames and the (de)allocation of local variables.
|
||||
//! For hadling of argument passing and return values, see the `call` module.
|
||||
//! For handling of argument passing and return values, see the `call` module.
|
||||
use std::cell::Cell;
|
||||
use std::{fmt, mem};
|
||||
|
||||
|
@ -42,7 +42,7 @@ impl fmt::Display for BaseNString {
|
||||
}
|
||||
|
||||
// This trait just lets us reserve the exact right amount of space when doing fixed-length
|
||||
// case-insensitve encoding. Add any impls you need.
|
||||
// case-insensitive encoding. Add any impls you need.
|
||||
pub trait ToBaseN: Into<u128> {
|
||||
fn encoded_len(base: usize) -> usize;
|
||||
|
||||
|
@ -477,7 +477,7 @@ where
|
||||
// will know when we hit the state where previous_node == node.
|
||||
loop {
|
||||
// Back at the beginning, we can return. Note that we return the root state.
|
||||
// This is becuse for components being explored, we would otherwise get a
|
||||
// This is because for components being explored, we would otherwise get a
|
||||
// `node_state[n] = InCycleWith{ parent: n }` and that's wrong.
|
||||
if previous_node == node {
|
||||
return root_state;
|
||||
|
@ -3,11 +3,11 @@
|
||||
//! or 16 bytes of the hash.
|
||||
//!
|
||||
//! The types in this module represent 64-bit or 128-bit hashes produced by a `StableHasher`.
|
||||
//! `Hash64` and `Hash128` expose some utilty functions to encourage users to not extract the inner
|
||||
//! `Hash64` and `Hash128` expose some utility functions to encourage users to not extract the inner
|
||||
//! hash value as an integer type and accidentally apply varint encoding to it.
|
||||
//!
|
||||
//! In contrast with `Fingerprint`, users of these types cannot and should not attempt to construct
|
||||
//! and decompose these types into constitutent pieces. The point of these types is only to
|
||||
//! and decompose these types into constituent pieces. The point of these types is only to
|
||||
//! connect the fact that they can only be produced by a `StableHasher` to their
|
||||
//! `Encode`/`Decode` impls.
|
||||
|
||||
|
@ -19,7 +19,7 @@ impl RegistryId {
|
||||
/// index within the registry. This panics if the current thread is not associated with this
|
||||
/// registry.
|
||||
///
|
||||
/// Note that there's a race possible where the identifer in `THREAD_DATA` could be reused
|
||||
/// Note that there's a race possible where the identifier in `THREAD_DATA` could be reused
|
||||
/// so this can succeed from a different registry.
|
||||
#[cfg(parallel_compiler)]
|
||||
fn verify(self) -> usize {
|
||||
@ -50,7 +50,7 @@ struct ThreadData {
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
/// A thread local which contains the identifer of `REGISTRY` but allows for faster access.
|
||||
/// A thread local which contains the identifier of `REGISTRY` but allows for faster access.
|
||||
/// It also holds the index of the current thread.
|
||||
static THREAD_DATA: ThreadData = const { ThreadData {
|
||||
registry_id: Cell::new(RegistryId(ptr::null())),
|
||||
@ -66,7 +66,7 @@ impl Registry {
|
||||
|
||||
/// Gets the registry associated with the current thread. Panics if there's no such registry.
|
||||
pub fn current() -> Self {
|
||||
REGISTRY.with(|registry| registry.get().cloned().expect("No assocated registry"))
|
||||
REGISTRY.with(|registry| registry.get().cloned().expect("No associated registry"))
|
||||
}
|
||||
|
||||
/// Registers the current thread with the registry so worker locals can be used on it.
|
||||
@ -92,7 +92,7 @@ impl Registry {
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the identifer of this registry.
|
||||
/// Gets the identifier of this registry.
|
||||
fn id(&self) -> RegistryId {
|
||||
RegistryId(&*self.0)
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ where
|
||||
```
|
||||
The latter scenario encounters this error because `Foo::Assoc<'a>` could be
|
||||
implemented by a type that does not use the `'a` parameter, so there is no
|
||||
guarentee that `X::Assoc<'a>` actually uses `'a`.
|
||||
guarantee that `X::Assoc<'a>` actually uses `'a`.
|
||||
|
||||
To fix this we can pass a dummy parameter:
|
||||
```
|
||||
|
@ -484,7 +484,7 @@ pub struct Subdiag {
|
||||
/// - The `EmissionGuarantee`, which determines the type returned from `emit`.
|
||||
///
|
||||
/// Each constructed `Diag` must be consumed by a function such as `emit`,
|
||||
/// `cancel`, `delay_as_bug`, or `into_diag`. A panic occurrs if a `Diag`
|
||||
/// `cancel`, `delay_as_bug`, or `into_diag`. A panic occurs if a `Diag`
|
||||
/// is dropped without being consumed by one of these functions.
|
||||
///
|
||||
/// If there is some state in a downstream crate you would like to access in
|
||||
|
@ -2300,7 +2300,7 @@ impl HumanEmitter {
|
||||
// For example, for the following:
|
||||
// |
|
||||
// 2 - .await
|
||||
// 2 + (note the left over whitepsace)
|
||||
// 2 + (note the left over whitespace)
|
||||
// |
|
||||
// We really want
|
||||
// |
|
||||
|
@ -817,7 +817,7 @@ impl<'a> DiagCtxtHandle<'a> {
|
||||
);
|
||||
}
|
||||
// We delay a bug here so that `-Ztreat-err-as-bug -Zeagerly-emit-delayed-bugs`
|
||||
// can be used to create a backtrace at the stashing site insted of whenever the
|
||||
// can be used to create a backtrace at the stashing site instead of whenever the
|
||||
// diagnostic context is dropped and thus delayed bugs are emitted.
|
||||
Error => Some(self.span_delayed_bug(span, format!("stashing {key:?}"))),
|
||||
DelayedBug => {
|
||||
|
@ -487,7 +487,7 @@ fn is_break_ty(val: &MdTree<'_>) -> bool {
|
||||
|| matches!(val, MdTree::PlainText(txt) if txt.trim().is_empty())
|
||||
}
|
||||
|
||||
/// Perform tranformations to text. This splits paragraphs, replaces patterns,
|
||||
/// Perform transformations to text. This splits paragraphs, replaces patterns,
|
||||
/// and corrects newlines.
|
||||
///
|
||||
/// To avoid allocating strings (and using a different heavier tt type), our
|
||||
|
@ -585,7 +585,7 @@ declare_features! (
|
||||
(unstable, rust_cold_cc, "1.63.0", Some(97544)),
|
||||
/// Allows use of x86 SHA512, SM3 and SM4 target-features and intrinsics
|
||||
(unstable, sha512_sm_x86, "CURRENT_RUSTC_VERSION", Some(126624)),
|
||||
/// Shortern the tail expression lifetime
|
||||
/// Shorten the tail expression lifetime
|
||||
(unstable, shorter_tail_lifetimes, "1.79.0", Some(123739)),
|
||||
/// Allows the use of SIMD types in functions declared in `extern` blocks.
|
||||
(unstable, simd_ffi, "1.0.0", Some(27731)),
|
||||
|
@ -1016,7 +1016,7 @@ fn check_param_wf(tcx: TyCtxt<'_>, param: &hir::GenericParam<'_>) -> Result<(),
|
||||
sym::adt_const_params,
|
||||
)])
|
||||
}
|
||||
// Implments `ConstParamTy`, suggest adding the feature to enable.
|
||||
// Implements `ConstParamTy`, suggest adding the feature to enable.
|
||||
Ok(..) => Some(vec![(adt_const_params_feature_string, sym::adt_const_params)]),
|
||||
};
|
||||
if let Some(features) = may_suggest_feature {
|
||||
|
@ -219,7 +219,7 @@ fn visit_implementation_of_dispatch_from_dyn(checker: &Checker<'_>) -> Result<()
|
||||
// Later parts of the compiler rely on all DispatchFromDyn types to be ABI-compatible with raw
|
||||
// pointers. This is enforced here: we only allow impls for references, raw pointers, and things
|
||||
// that are effectively repr(transparent) newtypes around types that already hav a
|
||||
// DispatchedFromDyn impl. We cannot literally use repr(transparent) on those tpyes since some
|
||||
// DispatchedFromDyn impl. We cannot literally use repr(transparent) on those types since some
|
||||
// of them support an allocator, but we ensure that for the cases where the type implements this
|
||||
// trait, they *do* satisfy the repr(transparent) rules, and then we assume that everything else
|
||||
// in the compiler (in particular, all the call ABI logic) will treat them as repr(transparent)
|
||||
|
@ -1037,7 +1037,7 @@ impl<'tcx> FieldUniquenessCheckContext<'tcx> {
|
||||
|
||||
/// Check the uniqueness of fields in a struct variant, and recursively
|
||||
/// check the nested fields if it is an unnamed field with type of an
|
||||
/// annoymous adt.
|
||||
/// anonymous adt.
|
||||
fn check_field(&mut self, field: &hir::FieldDef<'_>) {
|
||||
if field.ident.name != kw::Underscore {
|
||||
self.check_field_decl(field.ident, field.span.into());
|
||||
@ -1491,7 +1491,7 @@ fn infer_return_ty_for_fn_sig<'tcx>(
|
||||
Some(ty) => {
|
||||
let fn_sig = tcx.typeck(def_id).liberated_fn_sigs()[hir_id];
|
||||
// Typeck doesn't expect erased regions to be returned from `type_of`.
|
||||
// This is a heuristic approach. If the scope has region paramters,
|
||||
// This is a heuristic approach. If the scope has region parameters,
|
||||
// we should change fn_sig's lifetime from `ReErased` to `ReError`,
|
||||
// otherwise to `ReStatic`.
|
||||
let has_region_params = generics.params.iter().any(|param| match param.kind {
|
||||
|
@ -529,7 +529,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
|
||||
/// Detect and reject early-bound & escaping late-bound generic params in the type of assoc const bindings.
|
||||
///
|
||||
/// FIXME(const_generics): This is a temporary and semi-artifical restriction until the
|
||||
/// FIXME(const_generics): This is a temporary and semi-artificial restriction until the
|
||||
/// arrival of *generic const generics*[^1].
|
||||
///
|
||||
/// It might actually be possible that we can already support early-bound generic params
|
||||
|
@ -986,7 +986,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
/// We **don't** support paths whose self type is an arbitrary type like `Struct::Ty` where
|
||||
/// struct `Struct` impls an in-scope trait that defines an associated type called `Ty`.
|
||||
/// For the latter case, we report ambiguity.
|
||||
/// While desirable to support, the implemention would be non-trivial. Tracked in [#22519].
|
||||
/// While desirable to support, the implementation would be non-trivial. Tracked in [#22519].
|
||||
///
|
||||
/// At the time of writing, *inherent associated types* are also resolved here. This however
|
||||
/// is [problematic][iat]. A proper implementation would be as non-trivial as the one
|
||||
|
@ -650,7 +650,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||
// cannot distinguish. This would cause us to erroneously discard a cast which will
|
||||
// lead to a borrowck error like #113257.
|
||||
// We still did a coercion above to unify inference variables for `ptr as _` casts.
|
||||
// This does cause us to miss some trivial casts in the trival cast lint.
|
||||
// This does cause us to miss some trivial casts in the trivial cast lint.
|
||||
debug!(" -> PointerCast");
|
||||
} else {
|
||||
self.trivial_cast_lint(fcx);
|
||||
|
@ -249,7 +249,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
||||
}
|
||||
|
||||
/// Returns a set of generic parameters for the method *receiver* where all type and region
|
||||
/// parameters are instantiated with fresh variables. This generic paramters does not include any
|
||||
/// parameters are instantiated with fresh variables. This generic parameters does not include any
|
||||
/// parameters declared on the method itself.
|
||||
///
|
||||
/// Note that this generic parameters may include late-bound regions from the impl level. If so,
|
||||
@ -375,7 +375,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
||||
IsMethodCall::Yes,
|
||||
);
|
||||
|
||||
// Create generic paramters for early-bound lifetime parameters,
|
||||
// Create generic parameters for early-bound lifetime parameters,
|
||||
// combining parameters from the type and those from the method.
|
||||
assert_eq!(generics.parent_count, parent_args.len());
|
||||
|
||||
@ -546,7 +546,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
||||
debug!("instantiate_method_sig(pick={:?}, all_args={:?})", pick, all_args);
|
||||
|
||||
// Instantiate the bounds on the method with the
|
||||
// type/early-bound-regions instatiations performed. There can
|
||||
// type/early-bound-regions instantiations performed. There can
|
||||
// be no late-bound regions appearing here.
|
||||
let def_id = pick.item.def_id;
|
||||
let method_predicates = self.tcx.predicates_of(def_id).instantiate(self.tcx, all_args);
|
||||
|
@ -228,7 +228,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// coroutine bodies can't borrow from their parent closure. To fix this,
|
||||
// we force the inner coroutine to also be `move`. This only matters for
|
||||
// coroutine-closures that are `move` since otherwise they themselves will
|
||||
// be borrowing from the outer environment, so there's no self-borrows occuring.
|
||||
// be borrowing from the outer environment, so there's no self-borrows occurring.
|
||||
if let UpvarArgs::Coroutine(..) = args
|
||||
&& let hir::CoroutineKind::Desugared(_, hir::CoroutineSource::Closure) =
|
||||
self.tcx.coroutine_kind(closure_def_id).expect("coroutine should have kind")
|
||||
|
@ -51,7 +51,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
query_state,
|
||||
|tcx, param_env, query_state| {
|
||||
// FIXME(#118965): We don't canonicalize the static lifetimes that appear in the
|
||||
// `param_env` beacause they are treated differently by trait selection.
|
||||
// `param_env` because they are treated differently by trait selection.
|
||||
Canonicalizer::canonicalize(
|
||||
param_env,
|
||||
None,
|
||||
|
@ -213,7 +213,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
/// ```
|
||||
///
|
||||
/// As indicating in the comments above, each of those references
|
||||
/// is (in the compiler) basically generic paramters (`args`)
|
||||
/// is (in the compiler) basically generic parameters (`args`)
|
||||
/// applied to the type of a suitable `def_id` (which identifies
|
||||
/// `Foo1` or `Foo2`).
|
||||
///
|
||||
|
@ -153,7 +153,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
|
||||
// During coherence, opaque types should be treated as *possibly*
|
||||
// equal to any other type (except for possibly itself). This is an
|
||||
// extremely heavy hammer, but can be relaxed in a fowards-compatible
|
||||
// extremely heavy hammer, but can be relaxed in a forwards-compatible
|
||||
// way later.
|
||||
(&ty::Alias(ty::Opaque, _), _) | (_, &ty::Alias(ty::Opaque, _)) if self.intercrate => {
|
||||
relation.register_predicates([ty::Binder::dummy(ty::PredicateKind::Ambiguous)]);
|
||||
|
@ -120,7 +120,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
} else {
|
||||
// NOTE: The `instantiation_variance` is not the same variance as
|
||||
// used by the relation. When instantiating `b`, `target_is_expected`
|
||||
// is flipped and the `instantion_variance` is also flipped. To
|
||||
// is flipped and the `instantiation_variance` is also flipped. To
|
||||
// constrain the `generalized_ty` while using the original relation,
|
||||
// we therefore only have to flip the arguments.
|
||||
//
|
||||
|
@ -435,7 +435,7 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
|
||||
escape_dep_filename(&file.prefer_local().to_string())
|
||||
};
|
||||
|
||||
// The entries will be used to declare dependencies beween files in a
|
||||
// The entries will be used to declare dependencies between files in a
|
||||
// Makefile-like output, so the iteration order does not matter.
|
||||
#[allow(rustc::potential_query_instability)]
|
||||
let extra_tracked_files =
|
||||
|
@ -126,7 +126,7 @@ impl<'tcx> LateLintPass<'tcx> for NonLocalDefinitions {
|
||||
// > same expression-containing item.
|
||||
//
|
||||
// To achieve this we get try to get the paths of the _Trait_ and
|
||||
// _Type_, and we look inside thoses paths to try a find in one
|
||||
// _Type_, and we look inside those paths to try a find in one
|
||||
// of them a type whose parent is the same as the impl definition.
|
||||
//
|
||||
// If that's the case this means that this impl block declaration
|
||||
|
@ -734,7 +734,7 @@ trait UnusedDelimLint {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if we need parens for `match &( Struct { feild: }) {}`.
|
||||
// Check if we need parens for `match &( Struct { field: }) {}`.
|
||||
{
|
||||
let mut innermost = inner;
|
||||
loop {
|
||||
|
Loading…
Reference in New Issue
Block a user