Auto merge of #127096 - matthiaskrgr:rollup-kh7e0rh, r=matthiaskrgr
Rollup of 11 pull requests Successful merges: - #123714 (Add test for fn pointer duplication.) - #124091 (Update AST validation module docs) - #127015 (Switch back `non_local_definitions` lint to allow-by-default) - #127016 (docs: check if the disambiguator matches its suffix) - #127029 (Fix Markdown tables in platform-support.md) - #127032 (Enable const casting for `f16` and `f128`) - #127055 (Mark Hasher::finish as #[must_use]) - #127068 (Stall computing instance for drop shim until it has no unsubstituted const params) - #127070 (add () to the marker_impls macro for ConstParamTy) - #127071 (Remove (deprecated & unstable) {to,from}_bits pointer methods) - #127078 (Enable full tools and profiler for LoongArch Linux targets) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
d38cd229b7
45 changed files with 857 additions and 289 deletions
|
@ -1,10 +1,20 @@
|
|||
// Validate AST before lowering it to HIR.
|
||||
//
|
||||
// This pass is supposed to catch things that fit into AST data structures,
|
||||
// but not permitted by the language. It runs after expansion when AST is frozen,
|
||||
// so it can check for erroneous constructions produced by syntax extensions.
|
||||
// This pass is supposed to perform only simple checks not requiring name resolution
|
||||
// or type checking or some other kind of complex analysis.
|
||||
//! Validate AST before lowering it to HIR.
|
||||
//!
|
||||
//! This pass intends to check that the constructed AST is *syntactically valid* to allow the rest
|
||||
//! of the compiler to assume that the AST is valid. These checks cannot be performed during parsing
|
||||
//! because attribute macros are allowed to accept certain pieces of invalid syntax such as a
|
||||
//! function without body outside of a trait definition:
|
||||
//!
|
||||
//! ```ignore (illustrative)
|
||||
//! #[my_attribute]
|
||||
//! mod foo {
|
||||
//! fn missing_body();
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! These checks are run post-expansion, after AST is frozen, to be able to check for erroneous
|
||||
//! constructions produced by proc macros. This pass is only intended for simple checks that do not
|
||||
//! require name resolution or type checking, or other kinds of complex analysis.
|
||||
|
||||
use itertools::{Either, Itertools};
|
||||
use rustc_ast::ptr::P;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use std::assert_matches::assert_matches;
|
||||
|
||||
use rustc_apfloat::ieee::{Double, Single};
|
||||
use rustc_apfloat::ieee::{Double, Half, Quad, Single};
|
||||
use rustc_apfloat::{Float, FloatConvert};
|
||||
use rustc_middle::mir::interpret::{InterpResult, PointerArithmetic, Scalar};
|
||||
use rustc_middle::mir::CastKind;
|
||||
|
@ -187,10 +187,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
bug!("FloatToFloat/FloatToInt cast: source type {} is not a float type", src.layout.ty)
|
||||
};
|
||||
let val = match fty {
|
||||
FloatTy::F16 => unimplemented!("f16_f128"),
|
||||
FloatTy::F16 => self.cast_from_float(src.to_scalar().to_f16()?, cast_to.ty),
|
||||
FloatTy::F32 => self.cast_from_float(src.to_scalar().to_f32()?, cast_to.ty),
|
||||
FloatTy::F64 => self.cast_from_float(src.to_scalar().to_f64()?, cast_to.ty),
|
||||
FloatTy::F128 => unimplemented!("f16_f128"),
|
||||
FloatTy::F128 => self.cast_from_float(src.to_scalar().to_f128()?, cast_to.ty),
|
||||
};
|
||||
Ok(ImmTy::from_scalar(val, cast_to))
|
||||
}
|
||||
|
@ -296,18 +296,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
Float(fty) if signed => {
|
||||
let v = v as i128;
|
||||
match fty {
|
||||
FloatTy::F16 => unimplemented!("f16_f128"),
|
||||
FloatTy::F16 => Scalar::from_f16(Half::from_i128(v).value),
|
||||
FloatTy::F32 => Scalar::from_f32(Single::from_i128(v).value),
|
||||
FloatTy::F64 => Scalar::from_f64(Double::from_i128(v).value),
|
||||
FloatTy::F128 => unimplemented!("f16_f128"),
|
||||
FloatTy::F128 => Scalar::from_f128(Quad::from_i128(v).value),
|
||||
}
|
||||
}
|
||||
// unsigned int -> float
|
||||
Float(fty) => match fty {
|
||||
FloatTy::F16 => unimplemented!("f16_f128"),
|
||||
FloatTy::F16 => Scalar::from_f16(Half::from_u128(v).value),
|
||||
FloatTy::F32 => Scalar::from_f32(Single::from_u128(v).value),
|
||||
FloatTy::F64 => Scalar::from_f64(Double::from_u128(v).value),
|
||||
FloatTy::F128 => unimplemented!("f16_f128"),
|
||||
FloatTy::F128 => Scalar::from_f128(Quad::from_u128(v).value),
|
||||
},
|
||||
|
||||
// u8 -> char
|
||||
|
@ -321,7 +321,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
/// Low-level cast helper function. Converts an apfloat `f` into int or float types.
|
||||
fn cast_from_float<F>(&self, f: F, dest_ty: Ty<'tcx>) -> Scalar<M::Provenance>
|
||||
where
|
||||
F: Float + Into<Scalar<M::Provenance>> + FloatConvert<Single> + FloatConvert<Double>,
|
||||
F: Float
|
||||
+ Into<Scalar<M::Provenance>>
|
||||
+ FloatConvert<Half>
|
||||
+ FloatConvert<Single>
|
||||
+ FloatConvert<Double>
|
||||
+ FloatConvert<Quad>,
|
||||
{
|
||||
use rustc_type_ir::TyKind::*;
|
||||
|
||||
|
@ -358,10 +363,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
}
|
||||
// float -> float
|
||||
Float(fty) => match fty {
|
||||
FloatTy::F16 => unimplemented!("f16_f128"),
|
||||
FloatTy::F16 => Scalar::from_f16(adjust_nan(self, f, f.convert(&mut false).value)),
|
||||
FloatTy::F32 => Scalar::from_f32(adjust_nan(self, f, f.convert(&mut false).value)),
|
||||
FloatTy::F64 => Scalar::from_f64(adjust_nan(self, f, f.convert(&mut false).value)),
|
||||
FloatTy::F128 => unimplemented!("f16_f128"),
|
||||
FloatTy::F128 => {
|
||||
Scalar::from_f128(adjust_nan(self, f, f.convert(&mut false).value))
|
||||
}
|
||||
},
|
||||
// That's it.
|
||||
_ => span_bug!(self.cur_span(), "invalid float to {} cast", dest_ty),
|
||||
|
|
|
@ -50,7 +50,7 @@ declare_lint! {
|
|||
/// All nested bodies (functions, enum discriminant, array length, consts) (expect for
|
||||
/// `const _: Ty = { ... }` in top-level module, which is still undecided) are checked.
|
||||
pub NON_LOCAL_DEFINITIONS,
|
||||
Warn,
|
||||
Allow,
|
||||
"checks for non-local definitions",
|
||||
report_in_external_macro
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs}
|
|||
use rustc_middle::mir::visit::*;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::TypeVisitableExt;
|
||||
use rustc_middle::ty::{self, Instance, InstanceKind, ParamEnv, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, Instance, InstanceKind, ParamEnv, Ty, TyCtxt, TypeFlags};
|
||||
use rustc_session::config::{DebugInfo, OptLevel};
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::sym;
|
||||
|
@ -306,6 +306,16 @@ impl<'tcx> Inliner<'tcx> {
|
|||
InstanceKind::Intrinsic(_) | InstanceKind::Virtual(..) => {
|
||||
return Err("instance without MIR (intrinsic / virtual)");
|
||||
}
|
||||
|
||||
// FIXME(#127030): `ConstParamHasTy` has bad interactions with
|
||||
// the drop shim builder, which does not evaluate predicates in
|
||||
// the correct param-env for types being dropped. Stall resolving
|
||||
// the MIR for this instance until all of its const params are
|
||||
// substituted.
|
||||
InstanceKind::DropGlue(_, Some(ty)) if ty.has_type_flags(TypeFlags::HAS_CT_PARAM) => {
|
||||
return Err("still needs substitution");
|
||||
}
|
||||
|
||||
// This cannot result in an immediate cycle since the callee MIR is a shim, which does
|
||||
// not get any optimizations run on it. Any subsequent inlining may cause cycles, but we
|
||||
// do not need to catch this here, we can wait until the inliner decides to continue
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue