mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Auto merge of #115820 - matthiaskrgr:rollup-kyglvpu, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #115736 (Remove `verbose_generic_activity_with_arg`) - #115771 (cleanup leftovers of const_err lint) - #115798 (add helper method for finding the one non-1-ZST field) - #115812 (Merge settings.css into rustdoc.css) - #115815 (fix: return early when has tainted in mir pass) - #115816 (Disabled socketpair for Vita) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
eb2446a57e
@ -269,7 +269,7 @@ fn module_codegen(
|
||||
),
|
||||
) -> OngoingModuleCodegen {
|
||||
let (cgu_name, mut cx, mut module, codegened_functions) =
|
||||
tcx.prof.verbose_generic_activity_with_arg("codegen cgu", cgu_name.as_str()).run(|| {
|
||||
tcx.prof.generic_activity_with_arg("codegen cgu", cgu_name.as_str()).run(|| {
|
||||
let cgu = tcx.codegen_unit(cgu_name);
|
||||
let mono_items = cgu.items_in_deterministic_order(tcx);
|
||||
|
||||
@ -322,35 +322,24 @@ fn module_codegen(
|
||||
});
|
||||
|
||||
OngoingModuleCodegen::Async(std::thread::spawn(move || {
|
||||
cx.profiler.clone().verbose_generic_activity_with_arg("compile functions", &*cgu_name).run(
|
||||
|| {
|
||||
cranelift_codegen::timing::set_thread_profiler(Box::new(super::MeasuremeProfiler(
|
||||
cx.profiler.clone(),
|
||||
)));
|
||||
cx.profiler.clone().generic_activity_with_arg("compile functions", &*cgu_name).run(|| {
|
||||
cranelift_codegen::timing::set_thread_profiler(Box::new(super::MeasuremeProfiler(
|
||||
cx.profiler.clone(),
|
||||
)));
|
||||
|
||||
let mut cached_context = Context::new();
|
||||
for codegened_func in codegened_functions {
|
||||
crate::base::compile_fn(
|
||||
&mut cx,
|
||||
&mut cached_context,
|
||||
&mut module,
|
||||
codegened_func,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
let mut cached_context = Context::new();
|
||||
for codegened_func in codegened_functions {
|
||||
crate::base::compile_fn(&mut cx, &mut cached_context, &mut module, codegened_func);
|
||||
}
|
||||
});
|
||||
|
||||
let global_asm_object_file = cx
|
||||
.profiler
|
||||
.verbose_generic_activity_with_arg("compile assembly", &*cgu_name)
|
||||
.run(|| {
|
||||
let global_asm_object_file =
|
||||
cx.profiler.generic_activity_with_arg("compile assembly", &*cgu_name).run(|| {
|
||||
crate::global_asm::compile_global_asm(&global_asm_config, &cgu_name, &cx.global_asm)
|
||||
})?;
|
||||
|
||||
let codegen_result = cx
|
||||
.profiler
|
||||
.verbose_generic_activity_with_arg("write object file", &*cgu_name)
|
||||
.run(|| {
|
||||
let codegen_result =
|
||||
cx.profiler.generic_activity_with_arg("write object file", &*cgu_name).run(|| {
|
||||
emit_cgu(
|
||||
&global_asm_config.output_filenames,
|
||||
&cx.profiler,
|
||||
|
@ -48,19 +48,12 @@ pub(crate) fn get_ptr_and_method_ref<'tcx>(
|
||||
) -> (Pointer, Value) {
|
||||
let (ptr, vtable) = 'block: {
|
||||
if let Abi::Scalar(_) = arg.layout().abi {
|
||||
'descend_newtypes: while !arg.layout().ty.is_unsafe_ptr() && !arg.layout().ty.is_ref() {
|
||||
for i in 0..arg.layout().fields.count() {
|
||||
let field = arg.value_field(fx, FieldIdx::new(i));
|
||||
if !field.layout().is_1zst() {
|
||||
// we found the one non-1-ZST field that is allowed
|
||||
// now find *its* non-zero-sized field, or stop if it's a
|
||||
// pointer
|
||||
arg = field;
|
||||
continue 'descend_newtypes;
|
||||
}
|
||||
}
|
||||
|
||||
bug!("receiver has no non-zero-sized fields {:?}", arg);
|
||||
while !arg.layout().ty.is_unsafe_ptr() && !arg.layout().ty.is_ref() {
|
||||
let (idx, _) = arg
|
||||
.layout()
|
||||
.non_1zst_field(fx)
|
||||
.expect("not exactly one non-1-ZST field in a `DispatchFromDyn` type");
|
||||
arg = arg.value_field(fx, FieldIdx::new(idx));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -605,7 +605,7 @@ pub(crate) fn run_pass_manager(
|
||||
module: &mut ModuleCodegen<ModuleLlvm>,
|
||||
thin: bool,
|
||||
) -> Result<(), FatalError> {
|
||||
let _timer = cgcx.prof.verbose_generic_activity_with_arg("LLVM_lto_optimize", &*module.name);
|
||||
let _timer = cgcx.prof.generic_activity_with_arg("LLVM_lto_optimize", &*module.name);
|
||||
let config = cgcx.config(module.kind);
|
||||
|
||||
// Now we have one massive module inside of llmod. Time to run the
|
||||
|
@ -928,21 +928,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||
// we get a value of a built-in pointer type.
|
||||
//
|
||||
// This is also relevant for `Pin<&mut Self>`, where we need to peel the `Pin`.
|
||||
'descend_newtypes: while !op.layout.ty.is_unsafe_ptr()
|
||||
&& !op.layout.ty.is_ref()
|
||||
{
|
||||
for i in 0..op.layout.fields.count() {
|
||||
let field = op.extract_field(bx, i);
|
||||
if !field.layout.is_1zst() {
|
||||
// we found the one non-1-ZST field that is allowed
|
||||
// now find *its* non-zero-sized field, or stop if it's a
|
||||
// pointer
|
||||
op = field;
|
||||
continue 'descend_newtypes;
|
||||
}
|
||||
}
|
||||
|
||||
span_bug!(span, "receiver has no non-zero-sized fields {:?}", op);
|
||||
while !op.layout.ty.is_unsafe_ptr() && !op.layout.ty.is_ref() {
|
||||
let (idx, _) = op.layout.non_1zst_field(bx).expect(
|
||||
"not exactly one non-1-ZST field in a `DispatchFromDyn` type",
|
||||
);
|
||||
op = op.extract_field(bx, idx);
|
||||
}
|
||||
|
||||
// now that we have `*dyn Trait` or `&dyn Trait`, split it up into its
|
||||
@ -970,22 +960,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||
}
|
||||
Immediate(_) => {
|
||||
// See comment above explaining why we peel these newtypes
|
||||
'descend_newtypes: while !op.layout.ty.is_unsafe_ptr()
|
||||
&& !op.layout.ty.is_ref()
|
||||
{
|
||||
for i in 0..op.layout.fields.count() {
|
||||
let field = op.extract_field(bx, i);
|
||||
if !field.layout.is_1zst() {
|
||||
// We found the one non-1-ZST field that is allowed. (The rules
|
||||
// for `DispatchFromDyn` ensure there's exactly one such field.)
|
||||
// Now find *its* non-zero-sized field, or stop if it's a
|
||||
// pointer.
|
||||
op = field;
|
||||
continue 'descend_newtypes;
|
||||
}
|
||||
}
|
||||
|
||||
span_bug!(span, "receiver has no non-zero-sized fields {:?}", op);
|
||||
while !op.layout.ty.is_unsafe_ptr() && !op.layout.ty.is_ref() {
|
||||
let (idx, _) = op.layout.non_1zst_field(bx).expect(
|
||||
"not exactly one non-1-ZST field in a `DispatchFromDyn` type",
|
||||
);
|
||||
op = op.extract_field(bx, idx);
|
||||
}
|
||||
|
||||
// Make sure that we've actually unwrapped the rcvr down
|
||||
|
@ -4,7 +4,6 @@ use rustc_errors::{DiagnosticArgValue, DiagnosticMessage, IntoDiagnostic, IntoDi
|
||||
use rustc_middle::mir::AssertKind;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_middle::ty::{layout::LayoutError, ConstInt};
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::{ErrorGuaranteed, Span, Symbol};
|
||||
|
||||
use super::InterpCx;
|
||||
@ -132,7 +131,8 @@ where
|
||||
{
|
||||
// Special handling for certain errors
|
||||
match error {
|
||||
// Don't emit a new diagnostic for these errors
|
||||
// Don't emit a new diagnostic for these errors, they are already reported elsewhere or
|
||||
// should remain silent.
|
||||
err_inval!(Layout(LayoutError::Unknown(_))) | err_inval!(TooGeneric) => {
|
||||
ErrorHandled::TooGeneric
|
||||
}
|
||||
@ -140,27 +140,8 @@ where
|
||||
err_inval!(Layout(LayoutError::ReferencesError(guar))) => {
|
||||
ErrorHandled::Reported(guar.into())
|
||||
}
|
||||
err_inval!(Layout(layout_error @ LayoutError::SizeOverflow(_))) => {
|
||||
// We must *always* hard error on these, even if the caller wants just a lint.
|
||||
// The `message` makes little sense here, this is a more serious error than the
|
||||
// caller thinks anyway.
|
||||
// See <https://github.com/rust-lang/rust/pull/63152>.
|
||||
let (our_span, frames) = get_span_and_frames();
|
||||
let span = span.unwrap_or(our_span);
|
||||
let mut err =
|
||||
tcx.sess.create_err(Spanned { span, node: layout_error.into_diagnostic() });
|
||||
err.code(rustc_errors::error_code!(E0080));
|
||||
let Some((mut err, handler)) = err.into_diagnostic() else {
|
||||
panic!("did not emit diag");
|
||||
};
|
||||
for frame in frames {
|
||||
err.eager_subdiagnostic(handler, frame);
|
||||
}
|
||||
|
||||
ErrorHandled::Reported(handler.emit_diagnostic(&mut err).unwrap().into())
|
||||
}
|
||||
// Report remaining errors.
|
||||
_ => {
|
||||
// Report as hard error.
|
||||
let (our_span, frames) = get_span_and_frames();
|
||||
let span = span.unwrap_or(our_span);
|
||||
let err = mk(span, frames);
|
||||
|
@ -372,7 +372,7 @@ pub fn eval_to_allocation_raw_provider<'tcx>(
|
||||
};
|
||||
let alloc_id = mplace.ptr().provenance.unwrap();
|
||||
|
||||
// Validation failed, report an error. This is always a hard error.
|
||||
// Validation failed, report an error.
|
||||
if let Err(error) = validation {
|
||||
let (error, backtrace) = error.into_parts();
|
||||
backtrace.print_backtrace();
|
||||
|
@ -269,19 +269,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
match layout.ty.kind() {
|
||||
ty::Adt(adt_def, _) if adt_def.repr().transparent() && may_unfold(*adt_def) => {
|
||||
assert!(!adt_def.is_enum());
|
||||
// Find the non-1-ZST field.
|
||||
let mut non_1zst_fields = (0..layout.fields.count()).filter_map(|idx| {
|
||||
let field = layout.field(self, idx);
|
||||
if field.is_1zst() { None } else { Some(field) }
|
||||
});
|
||||
let first = non_1zst_fields.next().expect("`unfold_transparent` called on 1-ZST");
|
||||
assert!(
|
||||
non_1zst_fields.next().is_none(),
|
||||
"more than one non-1-ZST field in a transparent type"
|
||||
);
|
||||
|
||||
// Found it!
|
||||
self.unfold_transparent(first, may_unfold)
|
||||
// Find the non-1-ZST field, and recurse.
|
||||
let (_, field) = layout.non_1zst_field(self).unwrap();
|
||||
self.unfold_transparent(field, may_unfold)
|
||||
}
|
||||
// Not a transparent type, no further unfolding.
|
||||
_ => layout,
|
||||
@ -797,25 +787,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
_ => {
|
||||
// Not there yet, search for the only non-ZST field.
|
||||
// (The rules for `DispatchFromDyn` ensure there's exactly one such field.)
|
||||
let mut non_zst_field = None;
|
||||
for i in 0..receiver.layout.fields.count() {
|
||||
let field = self.project_field(&receiver, i)?;
|
||||
let zst = field.layout.is_1zst();
|
||||
if !zst {
|
||||
assert!(
|
||||
non_zst_field.is_none(),
|
||||
"multiple non-1-ZST fields in dyn receiver type {}",
|
||||
receiver.layout.ty
|
||||
);
|
||||
non_zst_field = Some(field);
|
||||
}
|
||||
}
|
||||
receiver = non_zst_field.unwrap_or_else(|| {
|
||||
panic!(
|
||||
"no non-1-ZST fields in dyn receiver type {}",
|
||||
receiver.layout.ty
|
||||
)
|
||||
});
|
||||
let (idx, _) = receiver.layout.non_1zst_field(self).expect(
|
||||
"not exactly one non-1-ZST field in a `DispatchFromDyn` type",
|
||||
);
|
||||
receiver = self.project_field(&receiver, idx)?;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -26,6 +26,7 @@ use rustc_target::abi::{FieldIdx, Size, VariantIdx};
|
||||
|
||||
use polonius_engine::Atom;
|
||||
pub use rustc_ast::Mutability;
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::graph::dominators::Dominators;
|
||||
use rustc_index::{Idx, IndexSlice, IndexVec};
|
||||
@ -36,6 +37,8 @@ use rustc_span::{Span, DUMMY_SP};
|
||||
use either::Either;
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::fmt::{self, Debug, Display, Formatter, Write};
|
||||
use std::ops::{Index, IndexMut};
|
||||
use std::{iter, mem};
|
||||
@ -98,6 +101,36 @@ impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
static PASS_NAMES: RefCell<FxHashMap<&'static str, &'static str>> = {
|
||||
RefCell::new(FxHashMap::default())
|
||||
};
|
||||
}
|
||||
|
||||
/// Converts a MIR pass name into a snake case form to match the profiling naming style.
|
||||
fn to_profiler_name(type_name: &'static str) -> &'static str {
|
||||
PASS_NAMES.with(|names| match names.borrow_mut().entry(type_name) {
|
||||
Entry::Occupied(e) => *e.get(),
|
||||
Entry::Vacant(e) => {
|
||||
let snake_case: String = type_name
|
||||
.chars()
|
||||
.flat_map(|c| {
|
||||
if c.is_ascii_uppercase() {
|
||||
vec!['_', c.to_ascii_lowercase()]
|
||||
} else if c == '-' {
|
||||
vec!['_']
|
||||
} else {
|
||||
vec![c]
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
let result = &*String::leak(format!("mir_pass{}", snake_case));
|
||||
e.insert(result);
|
||||
result
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// A streamlined trait that you can implement to create a pass; the
|
||||
/// pass will be named after the type, and it will consist of a main
|
||||
/// loop that goes over each available MIR and applies `run_pass`.
|
||||
@ -107,6 +140,10 @@ pub trait MirPass<'tcx> {
|
||||
if let Some((_, tail)) = name.rsplit_once(':') { tail } else { name }
|
||||
}
|
||||
|
||||
fn profiler_name(&self) -> &'static str {
|
||||
to_profiler_name(self.name())
|
||||
}
|
||||
|
||||
/// Returns `true` if this pass is enabled with the current combination of compiler flags.
|
||||
fn is_enabled(&self, _sess: &Session) -> bool {
|
||||
true
|
||||
|
@ -606,6 +606,11 @@ fn inner_optimized_mir(tcx: TyCtxt<'_>, did: LocalDefId) -> Body<'_> {
|
||||
let body = tcx.mir_drops_elaborated_and_const_checked(did).steal();
|
||||
let mut body = remap_mir_for_const_eval_select(tcx, body, hir::Constness::NotConst);
|
||||
debug!("body: {:#?}", body);
|
||||
|
||||
if body.tainted_by_errors.is_some() {
|
||||
return body;
|
||||
}
|
||||
|
||||
run_optimization_passes(tcx, &mut body);
|
||||
|
||||
body
|
||||
|
@ -94,6 +94,8 @@ fn run_passes_inner<'tcx>(
|
||||
let overridden_passes = &tcx.sess.opts.unstable_opts.mir_enable_passes;
|
||||
trace!(?overridden_passes);
|
||||
|
||||
let prof_arg = tcx.sess.prof.enabled().then(|| format!("{:?}", body.source.def_id()));
|
||||
|
||||
if !body.should_skip() {
|
||||
for pass in passes {
|
||||
let name = pass.name();
|
||||
@ -121,7 +123,14 @@ fn run_passes_inner<'tcx>(
|
||||
validate_body(tcx, body, format!("before pass {name}"));
|
||||
}
|
||||
|
||||
tcx.sess.time(name, || pass.run_pass(tcx, body));
|
||||
if let Some(prof_arg) = &prof_arg {
|
||||
tcx.sess
|
||||
.prof
|
||||
.generic_activity_with_arg(pass.profiler_name(), &**prof_arg)
|
||||
.run(|| pass.run_pass(tcx, body));
|
||||
} else {
|
||||
pass.run_pass(tcx, body);
|
||||
}
|
||||
|
||||
if dump_enabled {
|
||||
dump_mir_for_pass(tcx, body, &name, true);
|
||||
|
@ -348,8 +348,7 @@ pub(crate) fn encode_query_results<'a, 'tcx, Q>(
|
||||
Q: super::QueryConfigRestored<'tcx>,
|
||||
Q::RestoredValue: Encodable<CacheEncoder<'a, 'tcx>>,
|
||||
{
|
||||
let _timer =
|
||||
qcx.profiler().verbose_generic_activity_with_arg("encode_query_results_for", query.name());
|
||||
let _timer = qcx.profiler().generic_activity_with_arg("encode_query_results_for", query.name());
|
||||
|
||||
assert!(query.query_state(qcx).all_inactive());
|
||||
let cache = query.query_cache(qcx);
|
||||
|
@ -144,4 +144,25 @@ impl<'a, Ty> TyAndLayout<'a, Ty> {
|
||||
|
||||
offset
|
||||
}
|
||||
|
||||
/// Finds the one field that is not a 1-ZST.
|
||||
/// Returns `None` if there are multiple non-1-ZST fields or only 1-ZST-fields.
|
||||
pub fn non_1zst_field<C>(&self, cx: &C) -> Option<(usize, Self)>
|
||||
where
|
||||
Ty: TyAbiInterface<'a, C> + Copy,
|
||||
{
|
||||
let mut found = None;
|
||||
for field_idx in 0..self.fields.count() {
|
||||
let field = self.field(cx, field_idx);
|
||||
if field.is_1zst() {
|
||||
continue;
|
||||
}
|
||||
if found.is_some() {
|
||||
// More than one non-1-ZST field.
|
||||
return None;
|
||||
}
|
||||
found = Some((field_idx, field));
|
||||
}
|
||||
found
|
||||
}
|
||||
}
|
||||
|
@ -588,19 +588,11 @@ fn make_thin_self_ptr<'tcx>(
|
||||
// To get the type `*mut RcBox<Self>`, we just keep unwrapping newtypes until we
|
||||
// get a built-in pointer type
|
||||
let mut fat_pointer_layout = layout;
|
||||
'descend_newtypes: while !fat_pointer_layout.ty.is_unsafe_ptr()
|
||||
&& !fat_pointer_layout.ty.is_ref()
|
||||
{
|
||||
for i in 0..fat_pointer_layout.fields.count() {
|
||||
let field_layout = fat_pointer_layout.field(cx, i);
|
||||
|
||||
if !field_layout.is_1zst() {
|
||||
fat_pointer_layout = field_layout;
|
||||
continue 'descend_newtypes;
|
||||
}
|
||||
}
|
||||
|
||||
bug!("receiver has no non-1-ZST fields {:?}", fat_pointer_layout);
|
||||
while !fat_pointer_layout.ty.is_unsafe_ptr() && !fat_pointer_layout.ty.is_ref() {
|
||||
fat_pointer_layout = fat_pointer_layout
|
||||
.non_1zst_field(cx)
|
||||
.expect("not exactly one non-1-ZST field in a `DispatchFromDyn` type")
|
||||
.1
|
||||
}
|
||||
|
||||
fat_pointer_layout.ty
|
||||
|
@ -102,7 +102,7 @@ impl Socket {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "vxworks"))]
|
||||
#[cfg(not(any(target_os = "vxworks", target_os = "vita")))]
|
||||
pub fn new_pair(fam: c_int, ty: c_int) -> io::Result<(Socket, Socket)> {
|
||||
unsafe {
|
||||
let mut fds = [0, 0];
|
||||
@ -133,7 +133,7 @@ impl Socket {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "vxworks")]
|
||||
#[cfg(any(target_os = "vxworks", target_os = "vita"))]
|
||||
pub fn new_pair(_fam: c_int, _ty: c_int) -> io::Result<(Socket, Socket)> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
@ -714,8 +714,6 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
|
||||
You need to enable JavaScript be able to update your settings.\
|
||||
</section>\
|
||||
</noscript>\
|
||||
<link rel=\"stylesheet\" \
|
||||
href=\"{static_root_path}{settings_css}\">\
|
||||
<script defer src=\"{static_root_path}{settings_js}\"></script>\
|
||||
<link rel=\"preload\" href=\"{static_root_path}{theme_light_css}\" \
|
||||
as=\"style\">\
|
||||
@ -724,7 +722,6 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
|
||||
<link rel=\"preload\" href=\"{static_root_path}{theme_ayu_css}\" \
|
||||
as=\"style\">",
|
||||
static_root_path = page.get_static_root_path(),
|
||||
settings_css = static_files::STATIC_FILES.settings_css,
|
||||
settings_js = static_files::STATIC_FILES.settings_js,
|
||||
theme_light_css = static_files::STATIC_FILES.theme_light_css,
|
||||
theme_dark_css = static_files::STATIC_FILES.theme_dark_css,
|
||||
|
@ -925,6 +925,70 @@ so that we can apply CSS-filters to change the arrow color in themes */
|
||||
top: -5px;
|
||||
}
|
||||
|
||||
.setting-line {
|
||||
margin: 1.2em 0.6em;
|
||||
}
|
||||
|
||||
.setting-radio input, .setting-check input {
|
||||
margin-right: 0.3em;
|
||||
height: 1.2rem;
|
||||
width: 1.2rem;
|
||||
border: 2px solid var(--settings-input-border-color);
|
||||
outline: none;
|
||||
-webkit-appearance: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.setting-radio input {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.setting-radio span, .setting-check span {
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
|
||||
.setting-radio {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
min-width: 3.8em;
|
||||
padding: 0.3em;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.setting-radio + .setting-radio {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
.setting-check {
|
||||
margin-right: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.setting-radio input:checked {
|
||||
box-shadow: inset 0 0 0 3px var(--main-background-color);
|
||||
background-color: var(--settings-input-color);
|
||||
}
|
||||
.setting-check input:checked {
|
||||
background-color: var(--settings-input-color);
|
||||
border-width: 1px;
|
||||
content: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40">\
|
||||
<path d="M7,25L17,32L33,12" fill="none" stroke="black" stroke-width="5"/>\
|
||||
<path d="M7,23L17,30L33,10" fill="none" stroke="white" stroke-width="5"/></svg>');
|
||||
}
|
||||
.setting-radio input:focus, .setting-check input:focus {
|
||||
box-shadow: 0 0 1px 1px var(--settings-input-color);
|
||||
}
|
||||
/* In here we combine both `:focus` and `:checked` properties. */
|
||||
.setting-radio input:checked:focus {
|
||||
box-shadow: inset 0 0 0 3px var(--main-background-color),
|
||||
0 0 2px 2px var(--settings-input-color);
|
||||
}
|
||||
.setting-radio input:hover, .setting-check input:hover {
|
||||
border-color: var(--settings-input-color) !important;
|
||||
}
|
||||
|
||||
/* use larger max-width for help popover, but not for help.html */
|
||||
#help.popover {
|
||||
max-width: 600px;
|
||||
|
@ -1,63 +0,0 @@
|
||||
.setting-line {
|
||||
margin: 1.2em 0.6em;
|
||||
}
|
||||
|
||||
.setting-radio input, .setting-check input {
|
||||
margin-right: 0.3em;
|
||||
height: 1.2rem;
|
||||
width: 1.2rem;
|
||||
border: 2px solid var(--settings-input-border-color);
|
||||
outline: none;
|
||||
-webkit-appearance: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.setting-radio input {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.setting-radio span, .setting-check span {
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
|
||||
.setting-radio {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.1em;
|
||||
min-width: 3.8em;
|
||||
padding: 0.3em;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.setting-radio + .setting-radio {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
.setting-check {
|
||||
margin-right: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.setting-radio input:checked {
|
||||
box-shadow: inset 0 0 0 3px var(--main-background-color);
|
||||
background-color: var(--settings-input-color);
|
||||
}
|
||||
.setting-check input:checked {
|
||||
background-color: var(--settings-input-color);
|
||||
border-width: 1px;
|
||||
content: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40">\
|
||||
<path d="M7,25L17,32L33,12" fill="none" stroke="black" stroke-width="5"/>\
|
||||
<path d="M7,23L17,30L33,10" fill="none" stroke="white" stroke-width="5"/></svg>');
|
||||
}
|
||||
.setting-radio input:focus, .setting-check input:focus {
|
||||
box-shadow: 0 0 1px 1px var(--settings-input-color);
|
||||
}
|
||||
/* In here we combine both `:focus` and `:checked` properties. */
|
||||
.setting-radio input:checked:focus {
|
||||
box-shadow: inset 0 0 0 3px var(--main-background-color),
|
||||
0 0 2px 2px var(--settings-input-color);
|
||||
}
|
||||
.setting-radio input:hover, .setting-check input:hover {
|
||||
border-color: var(--settings-input-color) !important;
|
||||
}
|
@ -176,13 +176,6 @@ function browserSupportsHistoryApi() {
|
||||
return window.history && typeof window.history.pushState === "function";
|
||||
}
|
||||
|
||||
function loadCss(cssUrl) {
|
||||
const link = document.createElement("link");
|
||||
link.href = cssUrl;
|
||||
link.rel = "stylesheet";
|
||||
document.getElementsByTagName("head")[0].appendChild(link);
|
||||
}
|
||||
|
||||
function preLoadCss(cssUrl) {
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preload
|
||||
const link = document.createElement("link");
|
||||
@ -210,7 +203,6 @@ function preLoadCss(cssUrl) {
|
||||
event.preventDefault();
|
||||
// Sending request for the CSS and the JS files at the same time so it will
|
||||
// hopefully be loaded when the JS will generate the settings content.
|
||||
loadCss(getVar("static-root-path") + getVar("settings-css"));
|
||||
loadScript(getVar("static-root-path") + getVar("settings-js"));
|
||||
preLoadCss(getVar("static-root-path") + getVar("theme-light-css"));
|
||||
preLoadCss(getVar("static-root-path") + getVar("theme-dark-css"));
|
||||
|
@ -91,7 +91,6 @@ macro_rules! static_files {
|
||||
|
||||
static_files! {
|
||||
rustdoc_css => "static/css/rustdoc.css",
|
||||
settings_css => "static/css/settings.css",
|
||||
noscript_css => "static/css/noscript.css",
|
||||
normalize_css => "static/css/normalize.css",
|
||||
main_js => "static/js/main.js",
|
||||
|
@ -33,7 +33,6 @@
|
||||
data-channel="{{rust_channel}}" {#+ #}
|
||||
data-search-js="{{files.search_js}}" {#+ #}
|
||||
data-settings-js="{{files.settings_js}}" {#+ #}
|
||||
data-settings-css="{{files.settings_css}}" {#+ #}
|
||||
data-theme-light-css="{{files.theme_light_css}}" {#+ #}
|
||||
data-theme-dark-css="{{files.theme_dark_css}}" {#+ #}
|
||||
data-theme-ayu-css="{{files.theme_ayu_css}}" {#+ #}
|
||||
|
@ -1,6 +1,8 @@
|
||||
error[E0080]: values of the type `[u8; usize::MAX]` are too big for the current architecture
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
|
|
||||
= note: values of the type `[u8; usize::MAX]` are too big for the current architecture
|
||||
|
|
||||
note: inside `std::mem::size_of::<[u8; usize::MAX]>`
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
note: inside `main`
|
||||
|
@ -14,8 +14,10 @@ impl TooBigArray {
|
||||
}
|
||||
|
||||
static MY_TOO_BIG_ARRAY_1: TooBigArray = TooBigArray::new();
|
||||
//~^ ERROR values of the type `[u8; 2305843009213693951]` are too big
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| too big
|
||||
static MY_TOO_BIG_ARRAY_2: [u8; HUGE_SIZE] = [0x00; HUGE_SIZE];
|
||||
//~^ ERROR values of the type `[u8; 2305843009213693951]` are too big
|
||||
//~^ ERROR could not evaluate static initializer
|
||||
//~| too big
|
||||
|
||||
fn main() { }
|
||||
|
@ -1,14 +1,14 @@
|
||||
error[E0080]: values of the type `[u8; 2305843009213693951]` are too big for the current architecture
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/issue-56762.rs:16:1
|
||||
|
|
||||
LL | static MY_TOO_BIG_ARRAY_1: TooBigArray = TooBigArray::new();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ values of the type `[u8; 2305843009213693951]` are too big for the current architecture
|
||||
|
||||
error[E0080]: values of the type `[u8; 2305843009213693951]` are too big for the current architecture
|
||||
--> $DIR/issue-56762.rs:18:1
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/issue-56762.rs:19:1
|
||||
|
|
||||
LL | static MY_TOO_BIG_ARRAY_2: [u8; HUGE_SIZE] = [0x00; HUGE_SIZE];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ values of the type `[u8; 2305843009213693951]` are too big for the current architecture
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
13
tests/ui/unsized/issue-115809.rs
Normal file
13
tests/ui/unsized/issue-115809.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// compile-flags: --emit=link -Zmir-opt-level=2 -Zpolymorphize=on
|
||||
|
||||
fn foo<T>() {
|
||||
let a: [i32; 0] = [];
|
||||
match [a[..]] {
|
||||
//~^ ERROR cannot move a value of type `[i32]
|
||||
//~| ERROR cannot move out of type `[i32]`, a non-copy slice
|
||||
[[x]] => {}
|
||||
_ => (),
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
19
tests/ui/unsized/issue-115809.stderr
Normal file
19
tests/ui/unsized/issue-115809.stderr
Normal file
@ -0,0 +1,19 @@
|
||||
error[E0161]: cannot move a value of type `[i32]`
|
||||
--> $DIR/issue-115809.rs:5:12
|
||||
|
|
||||
LL | match [a[..]] {
|
||||
| ^^^^^ the size of `[i32]` cannot be statically determined
|
||||
|
||||
error[E0508]: cannot move out of type `[i32]`, a non-copy slice
|
||||
--> $DIR/issue-115809.rs:5:12
|
||||
|
|
||||
LL | match [a[..]] {
|
||||
| ^^^^^
|
||||
| |
|
||||
| cannot move out of here
|
||||
| move occurs because value has type `[i32]`, which does not implement the `Copy` trait
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0161, E0508.
|
||||
For more information about an error, try `rustc --explain E0161`.
|
Loading…
Reference in New Issue
Block a user