mirror of https://github.com/rust-lang/rust.git
rustc_layout_scalar_valid_range makes ctors unsafe
This commit is contained in:
parent
59a8294849
commit
0100a94231
|
@ -38,6 +38,7 @@ use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName;
|
use rustc_trait_selection::traits::error_reporting::suggestions::NextTypeParamName;
|
||||||
use rustc_trait_selection::traits::ObligationCtxt;
|
use rustc_trait_selection::traits::ObligationCtxt;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
use std::ops::Bound;
|
||||||
|
|
||||||
mod generics_of;
|
mod generics_of;
|
||||||
mod item_bounds;
|
mod item_bounds;
|
||||||
|
@ -1144,15 +1145,15 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<ty::PolyFnSig<
|
||||||
}
|
}
|
||||||
|
|
||||||
Ctor(data) | Variant(hir::Variant { data, .. }) if data.ctor().is_some() => {
|
Ctor(data) | Variant(hir::Variant { data, .. }) if data.ctor().is_some() => {
|
||||||
let ty = tcx.type_of(tcx.hir().get_parent_item(hir_id)).instantiate_identity();
|
let adt_def_id = tcx.hir().get_parent_item(hir_id).def_id.to_def_id();
|
||||||
|
let ty = tcx.type_of(adt_def_id).instantiate_identity();
|
||||||
let inputs = data.fields().iter().map(|f| tcx.type_of(f.def_id).instantiate_identity());
|
let inputs = data.fields().iter().map(|f| tcx.type_of(f.def_id).instantiate_identity());
|
||||||
ty::Binder::dummy(tcx.mk_fn_sig(
|
// constructors for structs with `layout_scalar_valid_range` are unsafe to call
|
||||||
inputs,
|
let safety = match tcx.layout_scalar_valid_range(adt_def_id) {
|
||||||
ty,
|
(Bound::Unbounded, Bound::Unbounded) => hir::Unsafety::Normal,
|
||||||
false,
|
_ => hir::Unsafety::Unsafe,
|
||||||
hir::Unsafety::Normal,
|
};
|
||||||
abi::Abi::Rust,
|
ty::Binder::dummy(tcx.mk_fn_sig(inputs, ty, false, safety, abi::Abi::Rust))
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => {
|
Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => {
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#![feature(rustc_attrs)]
|
||||||
|
#![allow(internal_features)]
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
#[rustc_layout_scalar_valid_range_start(2)]
|
||||||
|
struct NonZeroAndOneU8(u8);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("{:?}", Some(1).map(NonZeroAndOneU8).unwrap());
|
||||||
|
//~^ ERROR found `unsafe fn(u8) -> NonZeroAndOneU8 {NonZeroAndOneU8}`
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
error[E0277]: expected a `FnOnce<({integer},)>` closure, found `unsafe fn(u8) -> NonZeroAndOneU8 {NonZeroAndOneU8}`
|
||||||
|
--> $DIR/initializing-ranged-via-ctor.rs:9:34
|
||||||
|
|
|
||||||
|
LL | println!("{:?}", Some(1).map(NonZeroAndOneU8).unwrap());
|
||||||
|
| --- ^^^^^^^^^^^^^^^ call the function in a closure: `|| unsafe { /* code */ }`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= help: the trait `FnOnce<({integer},)>` is not implemented for fn item `unsafe fn(u8) -> NonZeroAndOneU8 {NonZeroAndOneU8}`
|
||||||
|
= note: unsafe function cannot be called generically without an unsafe block
|
||||||
|
note: required by a bound in `Option::<T>::map`
|
||||||
|
--> $SRC_DIR/core/src/option.rs:LL:COL
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue