Auto merge of #103026 - matthiaskrgr:rollup-gfmlfkt, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #103000 (Add suggestion to the "missing native library" error) - #103006 (rustdoc: don't ICE on `TyKind::Typeof`) - #103008 (replace ReErased with fresh region vars in opaque types) - #103011 (Improve rustdoc `unsafe-fn` GUI test) - #103013 (Add new bootstrap entrypoints to triagebot) - #103016 (Ensure enum cast moves) - #103021 (Add links to relevant pages to find constraint information) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
edabf59ca4
26 changed files with 396 additions and 71 deletions
|
@ -551,6 +551,8 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
|
||||||
format!("{{{}}}", reg.name())
|
format!("{{{}}}", reg.name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// The constraints can be retrieved from
|
||||||
|
// https://llvm.org/docs/LangRef.html#supported-constraint-code-list
|
||||||
InlineAsmRegOrRegClass::RegClass(reg) => match reg {
|
InlineAsmRegOrRegClass::RegClass(reg) => match reg {
|
||||||
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => "r",
|
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => "r",
|
||||||
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => "w",
|
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => "w",
|
||||||
|
@ -624,6 +626,8 @@ fn modifier_to_llvm(
|
||||||
reg: InlineAsmRegClass,
|
reg: InlineAsmRegClass,
|
||||||
modifier: Option<char>,
|
modifier: Option<char>,
|
||||||
) -> Option<char> {
|
) -> Option<char> {
|
||||||
|
// The modifiers can be retrieved from
|
||||||
|
// https://llvm.org/docs/LangRef.html#asm-template-argument-modifiers
|
||||||
match reg {
|
match reg {
|
||||||
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => modifier,
|
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => modifier,
|
||||||
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
|
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
|
||||||
|
|
|
@ -165,6 +165,8 @@ metadata_failed_write_error =
|
||||||
metadata_missing_native_library =
|
metadata_missing_native_library =
|
||||||
could not find native static library `{$libname}`, perhaps an -L flag is missing?
|
could not find native static library `{$libname}`, perhaps an -L flag is missing?
|
||||||
|
|
||||||
|
metadata_only_provide_library_name = only provide the library name `{$suggested_name}`, not the full filename
|
||||||
|
|
||||||
metadata_failed_create_tempdir =
|
metadata_failed_create_tempdir =
|
||||||
couldn't create a temp dir: {$err}
|
couldn't create a temp dir: {$err}
|
||||||
|
|
||||||
|
|
|
@ -732,8 +732,6 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||||
span: Span,
|
span: Span,
|
||||||
origin: &hir::OpaqueTyOrigin,
|
origin: &hir::OpaqueTyOrigin,
|
||||||
) {
|
) {
|
||||||
let hidden_type = tcx.bound_type_of(def_id.to_def_id()).subst(tcx, substs);
|
|
||||||
|
|
||||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
|
||||||
let defining_use_anchor = match *origin {
|
let defining_use_anchor = match *origin {
|
||||||
hir::OpaqueTyOrigin::FnReturn(did) | hir::OpaqueTyOrigin::AsyncFn(did) => did,
|
hir::OpaqueTyOrigin::FnReturn(did) | hir::OpaqueTyOrigin::AsyncFn(did) => did,
|
||||||
|
@ -748,14 +746,26 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||||
let ocx = ObligationCtxt::new(&infcx);
|
let ocx = ObligationCtxt::new(&infcx);
|
||||||
let opaque_ty = tcx.mk_opaque(def_id.to_def_id(), substs);
|
let opaque_ty = tcx.mk_opaque(def_id.to_def_id(), substs);
|
||||||
|
|
||||||
|
// `ReErased` regions appear in the "parent_substs" of closures/generators.
|
||||||
|
// We're ignoring them here and replacing them with fresh region variables.
|
||||||
|
// See tests in ui/type-alias-impl-trait/closure_{parent_substs,wf_outlives}.rs.
|
||||||
|
//
|
||||||
|
// FIXME: Consider wrapping the hidden type in an existential `Binder` and instantiating it
|
||||||
|
// here rather than using ReErased.
|
||||||
|
let hidden_ty = tcx.bound_type_of(def_id.to_def_id()).subst(tcx, substs);
|
||||||
|
let hidden_ty = tcx.fold_regions(hidden_ty, |re, _dbi| match re.kind() {
|
||||||
|
ty::ReErased => infcx.next_region_var(RegionVariableOrigin::MiscVariable(span)),
|
||||||
|
_ => re,
|
||||||
|
});
|
||||||
|
|
||||||
let misc_cause = traits::ObligationCause::misc(span, hir_id);
|
let misc_cause = traits::ObligationCause::misc(span, hir_id);
|
||||||
|
|
||||||
match infcx.at(&misc_cause, param_env).eq(opaque_ty, hidden_type) {
|
match infcx.at(&misc_cause, param_env).eq(opaque_ty, hidden_ty) {
|
||||||
Ok(infer_ok) => ocx.register_infer_ok_obligations(infer_ok),
|
Ok(infer_ok) => ocx.register_infer_ok_obligations(infer_ok),
|
||||||
Err(ty_err) => {
|
Err(ty_err) => {
|
||||||
tcx.sess.delay_span_bug(
|
tcx.sess.delay_span_bug(
|
||||||
span,
|
span,
|
||||||
&format!("could not unify `{hidden_type}` with revealed type:\n{ty_err}"),
|
&format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -764,7 +774,7 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||||
// Defining use functions may have more bounds than the opaque type, which is ok, as long as the
|
// Defining use functions may have more bounds than the opaque type, which is ok, as long as the
|
||||||
// hidden type is well formed even without those bounds.
|
// hidden type is well formed even without those bounds.
|
||||||
let predicate =
|
let predicate =
|
||||||
ty::Binder::dummy(ty::PredicateKind::WellFormed(hidden_type.into())).to_predicate(tcx);
|
ty::Binder::dummy(ty::PredicateKind::WellFormed(hidden_ty.into())).to_predicate(tcx);
|
||||||
ocx.register_obligation(Obligation::new(misc_cause, param_env, predicate));
|
ocx.register_obligation(Obligation::new(misc_cause, param_env, predicate));
|
||||||
|
|
||||||
// Check that all obligations are satisfied by the implementation's
|
// Check that all obligations are satisfied by the implementation's
|
||||||
|
|
|
@ -372,7 +372,41 @@ pub struct FailedWriteError {
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(metadata::missing_native_library)]
|
#[diag(metadata::missing_native_library)]
|
||||||
pub struct MissingNativeLibrary<'a> {
|
pub struct MissingNativeLibrary<'a> {
|
||||||
pub libname: &'a str,
|
libname: &'a str,
|
||||||
|
#[subdiagnostic]
|
||||||
|
suggest_name: Option<SuggestLibraryName<'a>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> MissingNativeLibrary<'a> {
|
||||||
|
pub fn new(libname: &'a str, verbatim: bool) -> Self {
|
||||||
|
// if it looks like the user has provided a complete filename rather just the bare lib name,
|
||||||
|
// then provide a note that they might want to try trimming the name
|
||||||
|
let suggested_name = if !verbatim {
|
||||||
|
if let Some(libname) = libname.strip_prefix("lib") && let Some(libname) = libname.strip_suffix(".a") {
|
||||||
|
// this is a unix style filename so trim prefix & suffix
|
||||||
|
Some(libname)
|
||||||
|
} else if let Some(libname) = libname.strip_suffix(".lib") {
|
||||||
|
// this is a Windows style filename so just trim the suffix
|
||||||
|
Some(libname)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
Self {
|
||||||
|
libname,
|
||||||
|
suggest_name: suggested_name
|
||||||
|
.map(|suggested_name| SuggestLibraryName { suggested_name }),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[help(metadata::only_provide_library_name)]
|
||||||
|
pub struct SuggestLibraryName<'a> {
|
||||||
|
suggested_name: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
|
|
@ -52,7 +52,7 @@ pub fn find_native_static_library(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sess.emit_fatal(MissingNativeLibrary { libname: name });
|
sess.emit_fatal(MissingNativeLibrary::new(name, verbatim.unwrap_or(false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_bundled_library(
|
fn find_bundled_library(
|
||||||
|
|
|
@ -197,13 +197,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
||||||
// create all the steps directly in MIR with operations all backends need to support anyway.
|
// create all the steps directly in MIR with operations all backends need to support anyway.
|
||||||
let (source, ty) = if let ty::Adt(adt_def, ..) = source.ty.kind() && adt_def.is_enum() {
|
let (source, ty) = if let ty::Adt(adt_def, ..) = source.ty.kind() && adt_def.is_enum() {
|
||||||
let discr_ty = adt_def.repr().discr_type().to_ty(this.tcx);
|
let discr_ty = adt_def.repr().discr_type().to_ty(this.tcx);
|
||||||
let place = unpack!(block = this.as_place(block, source));
|
let temp = unpack!(block = this.as_temp(block, scope, source, Mutability::Not));
|
||||||
let discr = this.temp(discr_ty, source.span);
|
let discr = this.temp(discr_ty, source.span);
|
||||||
this.cfg.push_assign(
|
this.cfg.push_assign(
|
||||||
block,
|
block,
|
||||||
source_info,
|
source_info,
|
||||||
discr,
|
discr,
|
||||||
Rvalue::Discriminant(place),
|
Rvalue::Discriminant(temp.into()),
|
||||||
);
|
);
|
||||||
|
|
||||||
(Operand::Move(discr), discr_ty)
|
(Operand::Move(discr), discr_ty)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.12.2
|
0.12.3
|
|
@ -1543,8 +1543,7 @@ pub(crate) fn clean_ty<'tcx>(ty: &hir::Ty<'tcx>, cx: &mut DocContext<'tcx>) -> T
|
||||||
}
|
}
|
||||||
TyKind::BareFn(barefn) => BareFunction(Box::new(clean_bare_fn_ty(barefn, cx))),
|
TyKind::BareFn(barefn) => BareFunction(Box::new(clean_bare_fn_ty(barefn, cx))),
|
||||||
// Rustdoc handles `TyKind::Err`s by turning them into `Type::Infer`s.
|
// Rustdoc handles `TyKind::Err`s by turning them into `Type::Infer`s.
|
||||||
TyKind::Infer | TyKind::Err => Infer,
|
TyKind::Infer | TyKind::Err | TyKind::Typeof(..) => Infer,
|
||||||
TyKind::Typeof(..) => panic!("unimplemented type {:?}", ty.kind),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,15 @@
|
||||||
fn bar(_1: Bar) -> usize {
|
fn bar(_1: Bar) -> usize {
|
||||||
debug bar => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
debug bar => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
||||||
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
||||||
let mut _2: isize; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
let _2: Bar; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
let mut _3: isize; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
_2 = discriminant(_1); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
StorageLive(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
_0 = move _2 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
_2 = move _1; // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
_3 = discriminant(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
_0 = move _3 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
StorageDead(_2); // scope 0 at $DIR/enum_cast.rs:+1:16: +1:17
|
||||||
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,15 @@
|
||||||
fn boo(_1: Boo) -> usize {
|
fn boo(_1: Boo) -> usize {
|
||||||
debug boo => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
debug boo => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
||||||
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
||||||
let mut _2: u8; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
let _2: Boo; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
let mut _3: u8; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
_2 = discriminant(_1); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
StorageLive(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
_0 = move _2 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
_2 = move _1; // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
_3 = discriminant(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
_0 = move _3 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
StorageDead(_2); // scope 0 at $DIR/enum_cast.rs:+1:16: +1:17
|
||||||
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,9 @@ fn droppy() -> () {
|
||||||
let mut _0: (); // return place in scope 0 at $DIR/enum_cast.rs:+0:13: +0:13
|
let mut _0: (); // return place in scope 0 at $DIR/enum_cast.rs:+0:13: +0:13
|
||||||
let _1: (); // in scope 0 at $DIR/enum_cast.rs:+1:5: +6:6
|
let _1: (); // in scope 0 at $DIR/enum_cast.rs:+1:5: +6:6
|
||||||
let _2: Droppy; // in scope 0 at $DIR/enum_cast.rs:+2:13: +2:14
|
let _2: Droppy; // in scope 0 at $DIR/enum_cast.rs:+2:13: +2:14
|
||||||
let mut _4: isize; // in scope 0 at $DIR/enum_cast.rs:+5:17: +5:18
|
let _4: Droppy; // in scope 0 at $DIR/enum_cast.rs:+5:17: +5:18
|
||||||
let _5: Droppy; // in scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
let mut _5: isize; // in scope 0 at $DIR/enum_cast.rs:+5:17: +5:18
|
||||||
|
let _6: Droppy; // in scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
||||||
scope 1 {
|
scope 1 {
|
||||||
debug x => _2; // in scope 1 at $DIR/enum_cast.rs:+2:13: +2:14
|
debug x => _2; // in scope 1 at $DIR/enum_cast.rs:+2:13: +2:14
|
||||||
scope 2 {
|
scope 2 {
|
||||||
|
@ -16,7 +17,7 @@ fn droppy() -> () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scope 4 {
|
scope 4 {
|
||||||
debug z => _5; // in scope 4 at $DIR/enum_cast.rs:+7:9: +7:10
|
debug z => _6; // in scope 4 at $DIR/enum_cast.rs:+7:9: +7:10
|
||||||
}
|
}
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
|
@ -25,30 +26,41 @@ fn droppy() -> () {
|
||||||
_2 = Droppy::C; // scope 0 at $DIR/enum_cast.rs:+2:17: +2:26
|
_2 = Droppy::C; // scope 0 at $DIR/enum_cast.rs:+2:17: +2:26
|
||||||
FakeRead(ForLet(None), _2); // scope 0 at $DIR/enum_cast.rs:+2:13: +2:14
|
FakeRead(ForLet(None), _2); // scope 0 at $DIR/enum_cast.rs:+2:13: +2:14
|
||||||
StorageLive(_3); // scope 3 at $DIR/enum_cast.rs:+5:13: +5:14
|
StorageLive(_3); // scope 3 at $DIR/enum_cast.rs:+5:13: +5:14
|
||||||
_4 = discriminant(_2); // scope 3 at $DIR/enum_cast.rs:+5:17: +5:27
|
StorageLive(_4); // scope 3 at $DIR/enum_cast.rs:+5:17: +5:18
|
||||||
_3 = move _4 as usize (IntToInt); // scope 3 at $DIR/enum_cast.rs:+5:17: +5:27
|
_4 = move _2; // scope 3 at $DIR/enum_cast.rs:+5:17: +5:18
|
||||||
FakeRead(ForLet(None), _3); // scope 3 at $DIR/enum_cast.rs:+5:13: +5:14
|
_5 = discriminant(_4); // scope 3 at $DIR/enum_cast.rs:+5:17: +5:27
|
||||||
_1 = const (); // scope 0 at $DIR/enum_cast.rs:+1:5: +6:6
|
_3 = move _5 as usize (IntToInt); // scope 3 at $DIR/enum_cast.rs:+5:17: +5:27
|
||||||
StorageDead(_3); // scope 1 at $DIR/enum_cast.rs:+6:5: +6:6
|
drop(_4) -> [return: bb1, unwind: bb4]; // scope 3 at $DIR/enum_cast.rs:+5:26: +5:27
|
||||||
drop(_2) -> [return: bb1, unwind: bb3]; // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
StorageDead(_2); // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
StorageDead(_4); // scope 3 at $DIR/enum_cast.rs:+5:26: +5:27
|
||||||
StorageDead(_1); // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
FakeRead(ForLet(None), _3); // scope 3 at $DIR/enum_cast.rs:+5:13: +5:14
|
||||||
StorageLive(_5); // scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
_1 = const (); // scope 0 at $DIR/enum_cast.rs:+1:5: +6:6
|
||||||
_5 = Droppy::B; // scope 0 at $DIR/enum_cast.rs:+7:13: +7:22
|
StorageDead(_3); // scope 1 at $DIR/enum_cast.rs:+6:5: +6:6
|
||||||
FakeRead(ForLet(None), _5); // scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
drop(_2) -> [return: bb2, unwind: bb5]; // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
||||||
_0 = const (); // scope 0 at $DIR/enum_cast.rs:+0:13: +8:2
|
|
||||||
drop(_5) -> [return: bb2, unwind: bb3]; // scope 0 at $DIR/enum_cast.rs:+8:1: +8:2
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bb2: {
|
bb2: {
|
||||||
StorageDead(_5); // scope 0 at $DIR/enum_cast.rs:+8:1: +8:2
|
StorageDead(_2); // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
||||||
|
StorageDead(_1); // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
||||||
|
StorageLive(_6); // scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
||||||
|
_6 = Droppy::B; // scope 0 at $DIR/enum_cast.rs:+7:13: +7:22
|
||||||
|
FakeRead(ForLet(None), _6); // scope 0 at $DIR/enum_cast.rs:+7:9: +7:10
|
||||||
|
_0 = const (); // scope 0 at $DIR/enum_cast.rs:+0:13: +8:2
|
||||||
|
drop(_6) -> [return: bb3, unwind: bb5]; // scope 0 at $DIR/enum_cast.rs:+8:1: +8:2
|
||||||
|
}
|
||||||
|
|
||||||
|
bb3: {
|
||||||
|
StorageDead(_6); // scope 0 at $DIR/enum_cast.rs:+8:1: +8:2
|
||||||
return; // scope 0 at $DIR/enum_cast.rs:+8:2: +8:2
|
return; // scope 0 at $DIR/enum_cast.rs:+8:2: +8:2
|
||||||
}
|
}
|
||||||
|
|
||||||
bb3 (cleanup): {
|
bb4 (cleanup): {
|
||||||
|
drop(_2) -> bb5; // scope 0 at $DIR/enum_cast.rs:+6:5: +6:6
|
||||||
|
}
|
||||||
|
|
||||||
|
bb5 (cleanup): {
|
||||||
resume; // scope 0 at $DIR/enum_cast.rs:+0:1: +8:2
|
resume; // scope 0 at $DIR/enum_cast.rs:+0:1: +8:2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,15 @@
|
||||||
fn foo(_1: Foo) -> usize {
|
fn foo(_1: Foo) -> usize {
|
||||||
debug foo => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
debug foo => _1; // in scope 0 at $DIR/enum_cast.rs:+0:8: +0:11
|
||||||
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
let mut _0: usize; // return place in scope 0 at $DIR/enum_cast.rs:+0:21: +0:26
|
||||||
let mut _2: isize; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
let _2: Foo; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
let mut _3: isize; // in scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
_2 = discriminant(_1); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
StorageLive(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
_0 = move _2 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
_2 = move _1; // scope 0 at $DIR/enum_cast.rs:+1:5: +1:8
|
||||||
|
_3 = discriminant(_2); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
_0 = move _3 as usize (IntToInt); // scope 0 at $DIR/enum_cast.rs:+1:5: +1:17
|
||||||
|
StorageDead(_2); // scope 0 at $DIR/enum_cast.rs:+1:16: +1:17
|
||||||
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
return; // scope 0 at $DIR/enum_cast.rs:+2:2: +2:2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ fn main() {
|
||||||
{
|
{
|
||||||
let e = E::C;
|
let e = E::C;
|
||||||
assert_eq!(e as u32, 2);
|
assert_eq!(e as u32, 2);
|
||||||
assert_eq!(FLAG.load(Ordering::SeqCst), 0);
|
assert_eq!(FLAG.load(Ordering::SeqCst), 1);
|
||||||
}
|
}
|
||||||
assert_eq!(FLAG.load(Ordering::SeqCst), 1);
|
assert_eq!(FLAG.load(Ordering::SeqCst), 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +1,28 @@
|
||||||
|
// Check position and color of the `<sup>` for unsafe elements.
|
||||||
goto: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
goto: "file://" + |DOC_PATH| + "/test_docs/index.html"
|
||||||
|
|
||||||
compare-elements-property: (
|
|
||||||
"//a[@title='test_docs::safe_fn fn']/..",
|
|
||||||
"//a[@title='test_docs::unsafe_fn fn']/..",
|
|
||||||
["clientHeight"]
|
|
||||||
)
|
|
||||||
|
|
||||||
// If the text isn't displayed, the browser doesn't compute color style correctly...
|
// If the text isn't displayed, the browser doesn't compute color style correctly...
|
||||||
show-text: true
|
show-text: true
|
||||||
|
|
||||||
// Set the theme to dark.
|
compare-elements-property: (
|
||||||
local-storage: {"rustdoc-theme": "dark", "rustdoc-preferred-dark-theme": "dark", "rustdoc-use-system-theme": "false"}
|
"//a[@title='test_docs::safe_fn fn']/..",
|
||||||
// We reload the page so the local storage settings are being used.
|
"//a[@title='test_docs::unsafe_fn fn']/..",
|
||||||
reload:
|
["clientHeight"]
|
||||||
|
)
|
||||||
|
|
||||||
assert-css: (".item-left sup", {
|
define-function: (
|
||||||
"color": "rgb(221, 221, 221)"
|
"sup-check",
|
||||||
})
|
// `theme` is the theme being tested.
|
||||||
|
// `color` is the expected color of the `<sup>` element.
|
||||||
|
(theme, color),
|
||||||
|
[
|
||||||
|
// Set the theme.
|
||||||
|
("local-storage", {"rustdoc-theme": |theme|, "rustdoc-use-system-theme": "false"}),
|
||||||
|
// We reload the page so the local storage settings are being used.
|
||||||
|
("reload"),
|
||||||
|
("assert-css", (".item-left sup", {"color": |color|})),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
// Set the theme to ayu.
|
call-function: ("sup-check", ("dark", "rgb(221, 221, 221)"))
|
||||||
local-storage: {"rustdoc-theme": "ayu", "rustdoc-preferred-dark-theme": "ayu", "rustdoc-use-system-theme": "false"}
|
call-function: ("sup-check", ("ayu", "rgb(197, 197, 197)"))
|
||||||
// We reload the page so the local storage settings are being used.
|
call-function: ("sup-check", ("light", "rgb(0, 0, 0)"))
|
||||||
reload:
|
|
||||||
|
|
||||||
assert-css: (".item-left sup", {
|
|
||||||
"color": "rgb(197, 197, 197)"
|
|
||||||
})
|
|
||||||
|
|
||||||
// Set the theme to light.
|
|
||||||
local-storage: {"rustdoc-theme": "light", "rustdoc-preferred-dark-theme": "light", "rustdoc-use-system-theme": "false"}
|
|
||||||
// We reload the page so the local storage settings are being used.
|
|
||||||
reload:
|
|
||||||
|
|
||||||
assert-css: (".item-left sup", {
|
|
||||||
"color": "rgb(0, 0, 0)"
|
|
||||||
})
|
|
||||||
|
|
4
src/test/rustdoc-ui/issue-102986.rs
Normal file
4
src/test/rustdoc-ui/issue-102986.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
struct Struct {
|
||||||
|
y: (typeof("hey"),),
|
||||||
|
//~^ `typeof` is a reserved keyword but unimplemented
|
||||||
|
}
|
14
src/test/rustdoc-ui/issue-102986.stderr
Normal file
14
src/test/rustdoc-ui/issue-102986.stderr
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0516]: `typeof` is a reserved keyword but unimplemented
|
||||||
|
--> $DIR/issue-102986.rs:2:9
|
||||||
|
|
|
||||||
|
LL | y: (typeof("hey"),),
|
||||||
|
| ^^^^^^^^^^^^^ reserved keyword
|
||||||
|
|
|
||||||
|
help: consider replacing `typeof(...)` with an actual type
|
||||||
|
|
|
||||||
|
LL | y: (&'static str,),
|
||||||
|
| ~~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0516`.
|
8
src/test/ui/mir/issue-102389.rs
Normal file
8
src/test/ui/mir/issue-102389.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
enum Enum { A, B, C }
|
||||||
|
|
||||||
|
fn func(inbounds: &Enum, array: &[i16; 3]) -> i16 {
|
||||||
|
array[*inbounds as usize]
|
||||||
|
//~^ ERROR [E0507]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
9
src/test/ui/mir/issue-102389.stderr
Normal file
9
src/test/ui/mir/issue-102389.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0507]: cannot move out of `*inbounds` which is behind a shared reference
|
||||||
|
--> $DIR/issue-102389.rs:4:11
|
||||||
|
|
|
||||||
|
LL | array[*inbounds as usize]
|
||||||
|
| ^^^^^^^^^ move occurs because `*inbounds` has type `Enum`, which does not implement the `Copy` trait
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0507`.
|
|
@ -0,0 +1,9 @@
|
||||||
|
// build-fail
|
||||||
|
// compile-flags: --crate-type rlib
|
||||||
|
// error-pattern: could not find native static library `libfoo.a`
|
||||||
|
// error-pattern: only provide the library name `foo`, not the full filename
|
||||||
|
|
||||||
|
#[link(name = "libfoo.a", kind = "static")]
|
||||||
|
extern { }
|
||||||
|
|
||||||
|
pub fn main() { }
|
|
@ -0,0 +1,6 @@
|
||||||
|
error: could not find native static library `libfoo.a`, perhaps an -L flag is missing?
|
||||||
|
|
|
||||||
|
= help: only provide the library name `foo`, not the full filename
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// build-fail
|
||||||
|
// compile-flags: --crate-type rlib
|
||||||
|
// error-pattern: could not find native static library `bar.lib`
|
||||||
|
// error-pattern: only provide the library name `bar`, not the full filename
|
||||||
|
|
||||||
|
#[link(name = "bar.lib", kind = "static")]
|
||||||
|
extern { }
|
||||||
|
|
||||||
|
pub fn main() { }
|
|
@ -0,0 +1,6 @@
|
||||||
|
error: could not find native static library `bar.lib`, perhaps an -L flag is missing?
|
||||||
|
|
|
||||||
|
= help: only provide the library name `bar`, not the full filename
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
65
src/test/ui/type-alias-impl-trait/closure_parent_substs.rs
Normal file
65
src/test/ui/type-alias-impl-trait/closure_parent_substs.rs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
// When WF checking the hidden type in the ParamEnv of the opaque type,
|
||||||
|
// one complication arises when the hidden type is a closure/generator:
|
||||||
|
// the "parent_substs" of the type may reference lifetime parameters
|
||||||
|
// not present in the opaque type.
|
||||||
|
// These region parameters are not really useful in this check.
|
||||||
|
// So here we ignore them and replace them with fresh region variables.
|
||||||
|
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
// Basic test
|
||||||
|
mod test1 {
|
||||||
|
// Hidden type = Closure['_#0r]
|
||||||
|
type Opaque = impl Sized;
|
||||||
|
|
||||||
|
fn define<'a: 'a>() -> Opaque {
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the region vars cannot both be equal to `'static` or `'empty`
|
||||||
|
mod test2 {
|
||||||
|
trait Trait {}
|
||||||
|
|
||||||
|
// Hidden type = Closure['a, '_#0r, '_#1r]
|
||||||
|
// Constraints = [('_#0r: 'a), ('a: '_#1r)]
|
||||||
|
type Opaque<'a>
|
||||||
|
where
|
||||||
|
&'a (): Trait,
|
||||||
|
= impl Sized + 'a;
|
||||||
|
|
||||||
|
fn define<'a, 'x, 'y>() -> Opaque<'a>
|
||||||
|
where
|
||||||
|
&'a (): Trait,
|
||||||
|
'x: 'a,
|
||||||
|
'a: 'y,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the region var cannot be equal to `'a` or `'b`
|
||||||
|
mod test3 {
|
||||||
|
trait Trait {}
|
||||||
|
|
||||||
|
// Hidden type = Closure['a, 'b, '_#0r]
|
||||||
|
// Constraints = [('_#0r: 'a), ('_#0r: 'b)]
|
||||||
|
type Opaque<'a, 'b>
|
||||||
|
where
|
||||||
|
(&'a (), &'b ()): Trait,
|
||||||
|
= impl Sized + 'a + 'b;
|
||||||
|
|
||||||
|
fn define<'a, 'b, 'x>() -> Opaque<'a, 'b>
|
||||||
|
where
|
||||||
|
(&'a (), &'b ()): Trait,
|
||||||
|
'x: 'a,
|
||||||
|
'x: 'b,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
65
src/test/ui/type-alias-impl-trait/closure_wf_outlives.rs
Normal file
65
src/test/ui/type-alias-impl-trait/closure_wf_outlives.rs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
// If the hidden type is a closure, we require the "outlives" bounds that appear on the
|
||||||
|
// defining site to also appear on the opaque type.
|
||||||
|
//
|
||||||
|
// It's not clear if this is the desired behavior but at least
|
||||||
|
// it's consistent and has no back-compat risk.
|
||||||
|
|
||||||
|
// check-fail
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
// requires `'a: 'b` bound
|
||||||
|
mod test1 {
|
||||||
|
type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
//~^ ERROR lifetime bound not satisfied
|
||||||
|
|
||||||
|
fn define<'a, 'b>() -> Opaque<'a, 'b>
|
||||||
|
where
|
||||||
|
'a: 'b,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same as the above but through indirection `'x`
|
||||||
|
mod test2 {
|
||||||
|
type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
//~^ ERROR cannot infer an appropriate lifetime
|
||||||
|
|
||||||
|
fn define<'a, 'b, 'x>() -> Opaque<'a, 'b>
|
||||||
|
where
|
||||||
|
'a: 'x,
|
||||||
|
'x: 'b,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fixed version of the above
|
||||||
|
mod test2_fixed {
|
||||||
|
type Opaque<'a: 'b, 'b> = impl Sized + 'a + 'b;
|
||||||
|
|
||||||
|
fn define<'a, 'b, 'x>() -> Opaque<'a, 'b>
|
||||||
|
where
|
||||||
|
'a: 'x,
|
||||||
|
'x: 'b,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// requires `T: 'static`
|
||||||
|
mod test3 {
|
||||||
|
type Opaque<T> = impl Sized;
|
||||||
|
//~^ ERROR the parameter type `T` may not live long enough
|
||||||
|
|
||||||
|
fn define<T>() -> Opaque<T>
|
||||||
|
where
|
||||||
|
T: 'static,
|
||||||
|
{
|
||||||
|
|| {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
64
src/test/ui/type-alias-impl-trait/closure_wf_outlives.stderr
Normal file
64
src/test/ui/type-alias-impl-trait/closure_wf_outlives.stderr
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
error[E0478]: lifetime bound not satisfied
|
||||||
|
--> $DIR/closure_wf_outlives.rs:14:27
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: lifetime parameter instantiated with the lifetime `'a` as defined here
|
||||||
|
--> $DIR/closure_wf_outlives.rs:14:17
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^
|
||||||
|
note: but lifetime parameter must outlive the lifetime `'b` as defined here
|
||||||
|
--> $DIR/closure_wf_outlives.rs:14:21
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||||
|
--> $DIR/closure_wf_outlives.rs:27:27
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: first, the lifetime cannot outlive the lifetime `'a` as defined here...
|
||||||
|
--> $DIR/closure_wf_outlives.rs:27:17
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^
|
||||||
|
note: ...so that the declared lifetime parameter bounds are satisfied
|
||||||
|
--> $DIR/closure_wf_outlives.rs:27:27
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: but, the lifetime must be valid for the lifetime `'b` as defined here...
|
||||||
|
--> $DIR/closure_wf_outlives.rs:27:21
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^
|
||||||
|
note: ...so that the declared lifetime parameter bounds are satisfied
|
||||||
|
--> $DIR/closure_wf_outlives.rs:27:27
|
||||||
|
|
|
||||||
|
LL | type Opaque<'a, 'b> = impl Sized + 'a + 'b;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0310]: the parameter type `T` may not live long enough
|
||||||
|
--> $DIR/closure_wf_outlives.rs:54:22
|
||||||
|
|
|
||||||
|
LL | type Opaque<T> = impl Sized;
|
||||||
|
| ^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds...
|
||||||
|
|
|
||||||
|
note: ...that is required by this bound
|
||||||
|
--> $DIR/closure_wf_outlives.rs:59:12
|
||||||
|
|
|
||||||
|
LL | T: 'static,
|
||||||
|
| ^^^^^^^
|
||||||
|
help: consider adding an explicit lifetime bound...
|
||||||
|
|
|
||||||
|
LL | type Opaque<T: 'static> = impl Sized;
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0310, E0478, E0495.
|
||||||
|
For more information about an error, try `rustc --explain E0310`.
|
|
@ -179,6 +179,8 @@ exclude_labels = [
|
||||||
[autolabel."A-bootstrap"]
|
[autolabel."A-bootstrap"]
|
||||||
trigger_files = [
|
trigger_files = [
|
||||||
"x.py",
|
"x.py",
|
||||||
|
"x",
|
||||||
|
"x.ps1",
|
||||||
"src/bootstrap",
|
"src/bootstrap",
|
||||||
"src/tools/rust-installer",
|
"src/tools/rust-installer",
|
||||||
]
|
]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue