1
Fork 0

Auto merge of #110252 - matthiaskrgr:rollup-ovaixra, r=matthiaskrgr

Rollup of 8 pull requests

Successful merges:

 - #109810 (Replace rustdoc-ui/{c,z}-help tests with a stable run-make test )
 - #110035 (fix: ensure bad `#[test]` invocs retain correct AST)
 - #110089 (sync::mpsc: synchronize receiver disconnect with initialization)
 - #110103 (Report overflows gracefully with new solver)
 - #110122 (Fix x check --stage 1 when download-ci-llvm=false)
 - #110133 (Do not use ImplDerivedObligationCause for inherent impl method error reporting)
 - #110135 (Revert "Don't recover lifetimes/labels containing emojis as character literals")
 - #110235 (Fix `--extend-css` option)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2023-04-12 22:19:29 +00:00
commit 9693b178fc
55 changed files with 501 additions and 699 deletions

View file

@ -118,34 +118,22 @@ pub fn expand_test_or_bench(
} }
} }
other => { other => {
cx.struct_span_err( not_testable_error(cx, attr_sp, None);
other.span(),
"`#[test]` attribute is only allowed on non associated functions",
)
.emit();
return vec![other]; return vec![other];
} }
}; };
// Note: non-associated fn items are already handled by `expand_test_or_bench`
let ast::ItemKind::Fn(fn_) = &item.kind else { let ast::ItemKind::Fn(fn_) = &item.kind else {
let diag = &cx.sess.parse_sess.span_diagnostic; not_testable_error(cx, attr_sp, Some(&item));
let msg = "the `#[test]` attribute may only be used on a non-associated function"; return if is_stmt {
let mut err = match item.kind { vec![Annotatable::Stmt(P(ast::Stmt {
// These were a warning before #92959 and need to continue being that to avoid breaking id: ast::DUMMY_NODE_ID,
// stable user code (#94508). span: item.span,
ast::ItemKind::MacCall(_) => diag.struct_span_warn(attr_sp, msg), kind: ast::StmtKind::Item(item),
// `.forget_guarantee()` needed to get these two arms to match types. Because of how }))]
// locally close the `.emit()` call is I'm comfortable with it, but if it can be } else {
// reworked in the future to not need it, it'd be nice. vec![Annotatable::Item(item)]
_ => diag.struct_span_err(attr_sp, msg).forget_guarantee(),
}; };
err.span_label(attr_sp, "the `#[test]` macro causes a function to be run on a test and has no effect on non-functions")
.span_label(item.span, format!("expected a non-associated function, found {} {}", item.kind.article(), item.kind.descr()))
.span_suggestion(attr_sp, "replace with conditional compilation to make the item only exist when tests are being run", "#[cfg(test)]", Applicability::MaybeIncorrect)
.emit();
return vec![Annotatable::Item(item)];
}; };
// has_*_signature will report any errors in the type so compilation // has_*_signature will report any errors in the type so compilation
@ -398,6 +386,36 @@ pub fn expand_test_or_bench(
} }
} }
fn not_testable_error(cx: &ExtCtxt<'_>, attr_sp: Span, item: Option<&ast::Item>) {
let diag = &cx.sess.parse_sess.span_diagnostic;
let msg = "the `#[test]` attribute may only be used on a non-associated function";
let mut err = match item.map(|i| &i.kind) {
// These were a warning before #92959 and need to continue being that to avoid breaking
// stable user code (#94508).
Some(ast::ItemKind::MacCall(_)) => diag.struct_span_warn(attr_sp, msg),
// `.forget_guarantee()` needed to get these two arms to match types. Because of how
// locally close the `.emit()` call is I'm comfortable with it, but if it can be
// reworked in the future to not need it, it'd be nice.
_ => diag.struct_span_err(attr_sp, msg).forget_guarantee(),
};
if let Some(item) = item {
err.span_label(
item.span,
format!(
"expected a non-associated function, found {} {}",
item.kind.article(),
item.kind.descr()
),
);
}
err.span_label(attr_sp, "the `#[test]` macro causes a function to be run as a test and has no effect on non-functions")
.span_suggestion(attr_sp,
"replace with conditional compilation to make the item only exist when tests are being run",
"#[cfg(test)]",
Applicability::MaybeIncorrect)
.emit();
}
fn get_location_info(cx: &ExtCtxt<'_>, item: &ast::Item) -> (Symbol, usize, usize, usize, usize) { fn get_location_info(cx: &ExtCtxt<'_>, item: &ast::Item) -> (Symbol, usize, usize, usize, usize) {
let span = item.ident.span; let span = item.ident.span;
let (source_file, lo_line, lo_col, hi_line, hi_col) = let (source_file, lo_line, lo_col, hi_line, hi_col) =

View file

@ -37,7 +37,7 @@ use rustc_metadata::locator;
use rustc_session::config::{nightly_options, CG_OPTIONS, Z_OPTIONS}; use rustc_session::config::{nightly_options, CG_OPTIONS, Z_OPTIONS};
use rustc_session::config::{ErrorOutputType, Input, OutputType, PrintRequest, TrimmedDefPaths}; use rustc_session::config::{ErrorOutputType, Input, OutputType, PrintRequest, TrimmedDefPaths};
use rustc_session::cstore::MetadataLoader; use rustc_session::cstore::MetadataLoader;
use rustc_session::getopts; use rustc_session::getopts::{self, Matches};
use rustc_session::lint::{Lint, LintId}; use rustc_session::lint::{Lint, LintId};
use rustc_session::{config, Session}; use rustc_session::{config, Session};
use rustc_session::{early_error, early_error_no_abort, early_warn}; use rustc_session::{early_error, early_error_no_abort, early_warn};
@ -956,6 +956,46 @@ Available lint options:
} }
} }
/// Show help for flag categories shared between rustdoc and rustc.
///
/// Returns whether a help option was printed.
pub fn describe_flag_categories(matches: &Matches) -> bool {
// Handle the special case of -Wall.
let wall = matches.opt_strs("W");
if wall.iter().any(|x| *x == "all") {
print_wall_help();
rustc_errors::FatalError.raise();
}
// Don't handle -W help here, because we might first load plugins.
let debug_flags = matches.opt_strs("Z");
if debug_flags.iter().any(|x| *x == "help") {
describe_debug_flags();
return true;
}
let cg_flags = matches.opt_strs("C");
if cg_flags.iter().any(|x| *x == "help") {
describe_codegen_flags();
return true;
}
if cg_flags.iter().any(|x| *x == "no-stack-check") {
early_warn(
ErrorOutputType::default(),
"the --no-stack-check flag is deprecated and does nothing",
);
}
if cg_flags.iter().any(|x| *x == "passes=list") {
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
get_codegen_backend(&None, backend_name).print_passes();
return true;
}
false
}
fn describe_debug_flags() { fn describe_debug_flags() {
println!("\nAvailable options:\n"); println!("\nAvailable options:\n");
print_flag_list("-Z", config::Z_OPTIONS); print_flag_list("-Z", config::Z_OPTIONS);
@ -966,7 +1006,7 @@ fn describe_codegen_flags() {
print_flag_list("-C", config::CG_OPTIONS); print_flag_list("-C", config::CG_OPTIONS);
} }
pub fn print_flag_list<T>( fn print_flag_list<T>(
cmdline_opt: &str, cmdline_opt: &str,
flag_list: &[(&'static str, T, &'static str, &'static str)], flag_list: &[(&'static str, T, &'static str, &'static str)],
) { ) {
@ -1059,37 +1099,7 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
return None; return None;
} }
// Handle the special case of -Wall. if describe_flag_categories(&matches) {
let wall = matches.opt_strs("W");
if wall.iter().any(|x| *x == "all") {
print_wall_help();
rustc_errors::FatalError.raise();
}
// Don't handle -W help here, because we might first load plugins.
let debug_flags = matches.opt_strs("Z");
if debug_flags.iter().any(|x| *x == "help") {
describe_debug_flags();
return None;
}
let cg_flags = matches.opt_strs("C");
if cg_flags.iter().any(|x| *x == "help") {
describe_codegen_flags();
return None;
}
if cg_flags.iter().any(|x| *x == "no-stack-check") {
early_warn(
ErrorOutputType::default(),
"the --no-stack-check flag is deprecated and does nothing",
);
}
if cg_flags.iter().any(|x| *x == "passes=list") {
let backend_name = debug_flags.iter().find_map(|x| x.strip_prefix("codegen-backend="));
get_codegen_backend(&None, backend_name).print_passes();
return None; return None;
} }

View file

@ -475,8 +475,6 @@ pub enum StashKey {
/// When an invalid lifetime e.g. `'2` should be reinterpreted /// When an invalid lifetime e.g. `'2` should be reinterpreted
/// as a char literal in the parser /// as a char literal in the parser
LifetimeIsChar, LifetimeIsChar,
/// When an invalid lifetime e.g. `'🐱` contains emoji.
LifetimeContainsEmoji,
/// Maybe there was a typo where a comma was forgotten before /// Maybe there was a typo where a comma was forgotten before
/// FRU syntax /// FRU syntax
MaybeFruTypo, MaybeFruTypo,

View file

@ -578,7 +578,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]
pub(in super::super) fn report_ambiguity_errors(&self) { pub(in super::super) fn report_ambiguity_errors(&self) {
let mut errors = self.fulfillment_cx.borrow_mut().collect_remaining_errors(); let mut errors = self.fulfillment_cx.borrow_mut().collect_remaining_errors(self);
if !errors.is_empty() { if !errors.is_empty() {
self.adjust_fulfillment_errors_for_expr_obligation(&mut errors); self.adjust_fulfillment_errors_for_expr_obligation(&mut errors);

View file

@ -78,7 +78,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Finally, for ambiguity-related errors, we actually want to look // Finally, for ambiguity-related errors, we actually want to look
// for a parameter that is the source of the inference type left // for a parameter that is the source of the inference type left
// over in this predicate. // over in this predicate.
if let traits::FulfillmentErrorCode::CodeAmbiguity = error.code { if let traits::FulfillmentErrorCode::CodeAmbiguity { .. } = error.code {
fallback_param_to_point_at = None; fallback_param_to_point_at = None;
self_param_to_point_at = None; self_param_to_point_at = None;
param_to_point_at = param_to_point_at =

View file

@ -1531,23 +1531,18 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
// Convert the bounds into obligations. // Convert the bounds into obligations.
let impl_obligations = traits::predicates_for_generics( let impl_obligations = traits::predicates_for_generics(
|_idx, span| { |idx, span| {
let misc = traits::ObligationCause::misc(span, self.body_id); let code = if span.is_dummy() {
let parent_trait_pred = ty::Binder::dummy(ty::TraitPredicate { traits::ExprItemObligation(impl_def_id, self.scope_expr_id, idx)
trait_ref: ty::TraitRef::from_method(self.tcx, impl_def_id, substs), } else {
constness: ty::BoundConstness::NotConst, traits::ExprBindingObligation(
polarity: ty::ImplPolarity::Positive, impl_def_id,
}); span,
misc.derived_cause(parent_trait_pred, |derived| { self.scope_expr_id,
traits::ImplDerivedObligation(Box::new( idx,
traits::ImplDerivedObligationCause { )
derived, };
impl_or_alias_def_id: impl_def_id, ObligationCause::new(self.span, self.body_id, code)
impl_def_predicate_index: None,
span,
},
))
})
}, },
self.param_env, self.param_env,
impl_bounds, impl_bounds,

View file

@ -661,19 +661,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Find all the requirements that come from a local `impl` block. // Find all the requirements that come from a local `impl` block.
let mut skip_list: FxHashSet<_> = Default::default(); let mut skip_list: FxHashSet<_> = Default::default();
let mut spanned_predicates = FxHashMap::default(); let mut spanned_predicates = FxHashMap::default();
for (p, parent_p, impl_def_id, cause) in unsatisfied_predicates for (p, parent_p, cause) in unsatisfied_predicates {
.iter() // Extract the predicate span and parent def id of the cause,
.filter_map(|(p, parent, c)| c.as_ref().map(|c| (p, parent, c))) // if we have one.
.filter_map(|(p, parent, c)| match c.code() { let (item_def_id, cause_span) = match cause.as_ref().map(|cause| cause.code()) {
ObligationCauseCode::ImplDerivedObligation(data) Some(ObligationCauseCode::ImplDerivedObligation(data)) => {
if matches!(p.kind().skip_binder(), ty::PredicateKind::Clause(_)) => (data.impl_or_alias_def_id, data.span)
{
Some((p, parent, data.impl_or_alias_def_id, data))
} }
_ => None, Some(
}) ObligationCauseCode::ExprBindingObligation(def_id, span, _, _)
{ | ObligationCauseCode::BindingObligation(def_id, span),
match self.tcx.hir().get_if_local(impl_def_id) { ) => (*def_id, *span),
_ => continue,
};
// Don't point out the span of `WellFormed` predicates.
if !matches!(p.kind().skip_binder(), ty::PredicateKind::Clause(_)) {
continue;
};
match self.tcx.hir().get_if_local(item_def_id) {
// Unmet obligation comes from a `derive` macro, point at it once to // Unmet obligation comes from a `derive` macro, point at it once to
// avoid multiple span labels pointing at the same place. // avoid multiple span labels pointing at the same place.
Some(Node::Item(hir::Item { Some(Node::Item(hir::Item {
@ -718,7 +725,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
}); });
for param in generics.params { for param in generics.params {
if param.span == cause.span && sized_pred { if param.span == cause_span && sized_pred {
let (sp, sugg) = match param.colon_span { let (sp, sugg) = match param.colon_span {
Some(sp) => (sp.shrink_to_hi(), " ?Sized +"), Some(sp) => (sp.shrink_to_hi(), " ?Sized +"),
None => (param.span.shrink_to_hi(), ": ?Sized"), None => (param.span.shrink_to_hi(), ": ?Sized"),
@ -741,9 +748,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
(FxHashSet::default(), FxHashSet::default(), Vec::new()) (FxHashSet::default(), FxHashSet::default(), Vec::new())
}); });
entry.2.push(p); entry.2.push(p);
if cause.span != *item_span { if cause_span != *item_span {
entry.0.insert(cause.span); entry.0.insert(cause_span);
entry.1.insert((cause.span, "unsatisfied trait bound introduced here")); entry.1.insert((cause_span, "unsatisfied trait bound introduced here"));
} else { } else {
if let Some(trait_ref) = of_trait { if let Some(trait_ref) = of_trait {
entry.0.insert(trait_ref.path.span); entry.0.insert(trait_ref.path.span);
@ -775,9 +782,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let entry = entry.or_insert_with(|| { let entry = entry.or_insert_with(|| {
(FxHashSet::default(), FxHashSet::default(), Vec::new()) (FxHashSet::default(), FxHashSet::default(), Vec::new())
}); });
entry.0.insert(cause.span); entry.0.insert(cause_span);
entry.1.insert((ident.span, "")); entry.1.insert((ident.span, ""));
entry.1.insert((cause.span, "unsatisfied trait bound introduced here")); entry.1.insert((cause_span, "unsatisfied trait bound introduced here"));
entry.2.push(p); entry.2.push(p);
} }
Some(node) => unreachable!("encountered `{node:?}`"), Some(node) => unreachable!("encountered `{node:?}`"),

View file

@ -38,7 +38,7 @@ pub trait TraitEngine<'tcx>: 'tcx {
fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>>; fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>>;
fn collect_remaining_errors(&mut self) -> Vec<FulfillmentError<'tcx>>; fn collect_remaining_errors(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>>;
fn pending_obligations(&self) -> Vec<PredicateObligation<'tcx>>; fn pending_obligations(&self) -> Vec<PredicateObligation<'tcx>>;
@ -78,6 +78,6 @@ impl<'tcx, T: ?Sized + TraitEngine<'tcx>> TraitEngineExt<'tcx> for T {
return errors; return errors;
} }
self.collect_remaining_errors() self.collect_remaining_errors(infcx)
} }
} }

View file

@ -128,7 +128,11 @@ pub enum FulfillmentErrorCode<'tcx> {
CodeProjectionError(MismatchedProjectionTypes<'tcx>), CodeProjectionError(MismatchedProjectionTypes<'tcx>),
CodeSubtypeError(ExpectedFound<Ty<'tcx>>, TypeError<'tcx>), // always comes from a SubtypePredicate CodeSubtypeError(ExpectedFound<Ty<'tcx>>, TypeError<'tcx>), // always comes from a SubtypePredicate
CodeConstEquateError(ExpectedFound<Const<'tcx>>, TypeError<'tcx>), CodeConstEquateError(ExpectedFound<Const<'tcx>>, TypeError<'tcx>),
CodeAmbiguity, CodeAmbiguity {
/// Overflow reported from the new solver `-Ztrait-solver=next`, which will
/// be reported as an regular error as opposed to a fatal error.
overflow: bool,
},
} }
impl<'tcx, O> Obligation<'tcx, O> { impl<'tcx, O> Obligation<'tcx, O> {

View file

@ -46,7 +46,8 @@ impl<'tcx> fmt::Debug for traits::FulfillmentErrorCode<'tcx> {
super::CodeConstEquateError(ref a, ref b) => { super::CodeConstEquateError(ref a, ref b) => {
write!(f, "CodeConstEquateError({:?}, {:?})", a, b) write!(f, "CodeConstEquateError({:?}, {:?})", a, b)
} }
super::CodeAmbiguity => write!(f, "Ambiguity"), super::CodeAmbiguity { overflow: false } => write!(f, "Ambiguity"),
super::CodeAmbiguity { overflow: true } => write!(f, "Overflow"),
super::CodeCycle(ref cycle) => write!(f, "Cycle({:?})", cycle), super::CodeCycle(ref cycle) => write!(f, "Cycle({:?})", cycle),
} }
} }

View file

@ -95,7 +95,7 @@ pub enum TokenKind {
Literal { kind: LiteralKind, suffix_start: u32 }, Literal { kind: LiteralKind, suffix_start: u32 },
/// "'a" /// "'a"
Lifetime { starts_with_number: bool, contains_emoji: bool }, Lifetime { starts_with_number: bool },
// One-char tokens: // One-char tokens:
/// ";" /// ";"
@ -632,13 +632,7 @@ impl Cursor<'_> {
// If the first symbol is valid for identifier, it can be a lifetime. // If the first symbol is valid for identifier, it can be a lifetime.
// Also check if it's a number for a better error reporting (so '0 will // Also check if it's a number for a better error reporting (so '0 will
// be reported as invalid lifetime and not as unterminated char literal). // be reported as invalid lifetime and not as unterminated char literal).
// We also have to account for potential `'🐱` emojis to avoid reporting is_id_start(self.first()) || self.first().is_digit(10)
// it as an unterminated char literal.
is_id_start(self.first())
|| self.first().is_digit(10)
// FIXME(#108019): `unic-emoji-char` seems to have data tables only up to Unicode
// 5.0, but Unicode is already newer than this.
|| unic_emoji_char::is_emoji(self.first())
}; };
if !can_be_a_lifetime { if !can_be_a_lifetime {
@ -651,33 +645,16 @@ impl Cursor<'_> {
return Literal { kind, suffix_start }; return Literal { kind, suffix_start };
} }
// Either a lifetime or a character literal. // Either a lifetime or a character literal with
// length greater than 1.
let starts_with_number = self.first().is_digit(10); let starts_with_number = self.first().is_digit(10);
let mut contains_emoji = false;
// FIXME(#108019): `unic-emoji-char` seems to have data tables only up to Unicode // Skip the literal contents.
// 5.0, but Unicode is already newer than this. // First symbol can be a number (which isn't a valid identifier start),
if unic_emoji_char::is_emoji(self.first()) { // so skip it without any checks.
contains_emoji = true; self.bump();
} else { self.eat_while(is_id_continue);
// Skip the literal contents.
// First symbol can be a number (which isn't a valid identifier start),
// so skip it without any checks.
self.bump();
}
self.eat_while(|c| {
if is_id_continue(c) {
true
// FIXME(#108019): `unic-emoji-char` seems to have data tables only up to Unicode
// 5.0, but Unicode is already newer than this.
} else if unic_emoji_char::is_emoji(c) {
contains_emoji = true;
true
} else {
false
}
});
// Check if after skipping literal contents we've met a closing // Check if after skipping literal contents we've met a closing
// single quote (which means that user attempted to create a // single quote (which means that user attempted to create a
@ -687,7 +664,7 @@ impl Cursor<'_> {
let kind = Char { terminated: true }; let kind = Char { terminated: true };
Literal { kind, suffix_start: self.pos_within_token() } Literal { kind, suffix_start: self.pos_within_token() }
} else { } else {
Lifetime { starts_with_number, contains_emoji } Lifetime { starts_with_number }
} }
} }

View file

@ -235,7 +235,7 @@ fn lifetime() {
check_lexing( check_lexing(
"'abc", "'abc",
expect![[r#" expect![[r#"
Token { kind: Lifetime { starts_with_number: false, contains_emoji: false }, len: 4 } Token { kind: Lifetime { starts_with_number: false }, len: 4 }
"#]], "#]],
); );
} }

View file

@ -223,21 +223,16 @@ impl<'a> StringReader<'a> {
}; };
token::Literal(token::Lit { kind, symbol, suffix }) token::Literal(token::Lit { kind, symbol, suffix })
} }
rustc_lexer::TokenKind::Lifetime { starts_with_number, contains_emoji } => { rustc_lexer::TokenKind::Lifetime { starts_with_number } => {
// Include the leading `'` in the real identifier, for macro // Include the leading `'` in the real identifier, for macro
// expansion purposes. See #12512 for the gory details of why // expansion purposes. See #12512 for the gory details of why
// this is necessary. // this is necessary.
let lifetime_name = self.str_from(start); let lifetime_name = self.str_from(start);
if starts_with_number { if starts_with_number {
let span = self.mk_sp(start, self.pos); let span = self.mk_sp(start, self.pos);
let mut diag = self.sess.struct_err("lifetimes or labels cannot start with a number"); let mut diag = self.sess.struct_err("lifetimes cannot start with a number");
diag.set_span(span); diag.set_span(span);
diag.stash(span, StashKey::LifetimeIsChar); diag.stash(span, StashKey::LifetimeIsChar);
} else if contains_emoji {
let span = self.mk_sp(start, self.pos);
let mut diag = self.sess.struct_err("lifetimes or labels cannot contain emojis");
diag.set_span(span);
diag.stash(span, StashKey::LifetimeContainsEmoji);
} }
let ident = Symbol::intern(lifetime_name); let ident = Symbol::intern(lifetime_name);
token::Lifetime(ident) token::Lifetime(ident)

View file

@ -1,6 +1,7 @@
use std::mem; use std::mem;
use rustc_infer::infer::InferCtxt; use rustc_infer::infer::InferCtxt;
use rustc_infer::traits::solve::MaybeCause;
use rustc_infer::traits::Obligation; use rustc_infer::traits::Obligation;
use rustc_infer::traits::{ use rustc_infer::traits::{
query::NoSolution, FulfillmentError, FulfillmentErrorCode, MismatchedProjectionTypes, query::NoSolution, FulfillmentError, FulfillmentErrorCode, MismatchedProjectionTypes,
@ -41,13 +42,31 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
self.obligations.push(obligation); self.obligations.push(obligation);
} }
fn collect_remaining_errors(&mut self) -> Vec<FulfillmentError<'tcx>> { fn collect_remaining_errors(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>> {
self.obligations self.obligations
.drain(..) .drain(..)
.map(|obligation| FulfillmentError { .map(|obligation| {
obligation: obligation.clone(), let code =
code: FulfillmentErrorCode::CodeAmbiguity, infcx.probe(|_| match infcx.evaluate_root_goal(obligation.clone().into()) {
root_obligation: obligation, Ok((_, Certainty::Maybe(MaybeCause::Ambiguity), _)) => {
FulfillmentErrorCode::CodeAmbiguity { overflow: false }
}
Ok((_, Certainty::Maybe(MaybeCause::Overflow), _)) => {
FulfillmentErrorCode::CodeAmbiguity { overflow: true }
}
Ok((_, Certainty::Yes, _)) => {
bug!("did not expect successful goal when collecting ambiguity errors")
}
Err(_) => {
bug!("did not expect selection error when collecting ambiguity errors")
}
});
FulfillmentError {
obligation: obligation.clone(),
code,
root_obligation: obligation,
}
}) })
.collect() .collect()
} }

View file

@ -40,13 +40,16 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> {
self.obligations.insert(obligation); self.obligations.insert(obligation);
} }
fn collect_remaining_errors(&mut self) -> Vec<FulfillmentError<'tcx>> { fn collect_remaining_errors(
&mut self,
_infcx: &InferCtxt<'tcx>,
) -> Vec<FulfillmentError<'tcx>> {
// any remaining obligations are errors // any remaining obligations are errors
self.obligations self.obligations
.iter() .iter()
.map(|obligation| FulfillmentError { .map(|obligation| FulfillmentError {
obligation: obligation.clone(), obligation: obligation.clone(),
code: FulfillmentErrorCode::CodeAmbiguity, code: FulfillmentErrorCode::CodeAmbiguity { overflow: false },
// FIXME - does Chalk have a notation of 'root obligation'? // FIXME - does Chalk have a notation of 'root obligation'?
// This is just for diagnostics, so it's okay if this is wrong // This is just for diagnostics, so it's okay if this is wrong
root_obligation: obligation.clone(), root_obligation: obligation.clone(),

View file

@ -125,6 +125,8 @@ pub trait TypeErrCtxtExt<'tcx> {
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>, + Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug; <T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug;
fn report_overflow_no_abort(&self, obligation: PredicateObligation<'tcx>) -> ErrorGuaranteed;
fn report_fulfillment_errors(&self, errors: &[FulfillmentError<'tcx>]) -> ErrorGuaranteed; fn report_fulfillment_errors(&self, errors: &[FulfillmentError<'tcx>]) -> ErrorGuaranteed;
fn report_overflow_obligation<T>( fn report_overflow_obligation<T>(
@ -602,6 +604,14 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
); );
} }
fn report_overflow_no_abort(&self, obligation: PredicateObligation<'tcx>) -> ErrorGuaranteed {
let obligation = self.resolve_vars_if_possible(obligation);
let mut err = self.build_overflow_error(&obligation.predicate, obligation.cause.span, true);
self.note_obligation_cause(&mut err, &obligation);
self.point_at_returns_when_relevant(&mut err, &obligation);
err.emit()
}
fn report_selection_error( fn report_selection_error(
&self, &self,
mut obligation: PredicateObligation<'tcx>, mut obligation: PredicateObligation<'tcx>,
@ -1658,9 +1668,12 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
FulfillmentErrorCode::CodeProjectionError(ref e) => { FulfillmentErrorCode::CodeProjectionError(ref e) => {
self.report_projection_error(&error.obligation, e); self.report_projection_error(&error.obligation, e);
} }
FulfillmentErrorCode::CodeAmbiguity => { FulfillmentErrorCode::CodeAmbiguity { overflow: false } => {
self.maybe_report_ambiguity(&error.obligation); self.maybe_report_ambiguity(&error.obligation);
} }
FulfillmentErrorCode::CodeAmbiguity { overflow: true } => {
self.report_overflow_no_abort(error.obligation.clone());
}
FulfillmentErrorCode::CodeSubtypeError(ref expected_found, ref err) => { FulfillmentErrorCode::CodeSubtypeError(ref expected_found, ref err) => {
self.report_mismatched_types( self.report_mismatched_types(
&error.obligation.cause, &error.obligation.cause,

View file

@ -133,8 +133,15 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> {
.register_obligation(PendingPredicateObligation { obligation, stalled_on: vec![] }); .register_obligation(PendingPredicateObligation { obligation, stalled_on: vec![] });
} }
fn collect_remaining_errors(&mut self) -> Vec<FulfillmentError<'tcx>> { fn collect_remaining_errors(
self.predicates.to_errors(CodeAmbiguity).into_iter().map(to_fulfillment_error).collect() &mut self,
_infcx: &InferCtxt<'tcx>,
) -> Vec<FulfillmentError<'tcx>> {
self.predicates
.to_errors(CodeAmbiguity { overflow: false })
.into_iter()
.map(to_fulfillment_error)
.collect()
} }
fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>> { fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>> {

View file

@ -549,6 +549,18 @@ impl<T> Channel<T> {
let mut head = self.head.index.load(Ordering::Acquire); let mut head = self.head.index.load(Ordering::Acquire);
let mut block = self.head.block.load(Ordering::Acquire); let mut block = self.head.block.load(Ordering::Acquire);
// If we're going to be dropping messages we need to synchronize with initialization
if head >> SHIFT != tail >> SHIFT {
// The block can be null here only if a sender is in the process of initializing the
// channel while another sender managed to send a message by inserting it into the
// semi-initialized channel and advanced the tail.
// In that case, just wait until it gets initialized.
while block.is_null() {
backoff.spin_heavy();
block = self.head.block.load(Ordering::Acquire);
}
}
unsafe { unsafe {
// Drop all messages between head and tail and deallocate the heap-allocated blocks. // Drop all messages between head and tail and deallocate the heap-allocated blocks.
while head >> SHIFT != tail >> SHIFT { while head >> SHIFT != tail >> SHIFT {

View file

@ -237,7 +237,7 @@ impl Step for Rustc {
target, target,
cargo_subcommand(builder.kind), cargo_subcommand(builder.kind),
); );
rustc_cargo(builder, &mut cargo, target); rustc_cargo(builder, &mut cargo, target, compiler.stage);
// For ./x.py clippy, don't run with --all-targets because // For ./x.py clippy, don't run with --all-targets because
// linting tests and benchmarks can produce very noisy results // linting tests and benchmarks can produce very noisy results
@ -323,7 +323,7 @@ impl Step for CodegenBackend {
cargo cargo
.arg("--manifest-path") .arg("--manifest-path")
.arg(builder.src.join(format!("compiler/rustc_codegen_{}/Cargo.toml", backend))); .arg(builder.src.join(format!("compiler/rustc_codegen_{}/Cargo.toml", backend)));
rustc_cargo_env(builder, &mut cargo, target); rustc_cargo_env(builder, &mut cargo, target, compiler.stage);
let msg = if compiler.host == target { let msg = if compiler.host == target {
format!("Checking stage{} {} artifacts ({target})", builder.top_stage, backend) format!("Checking stage{} {} artifacts ({target})", builder.top_stage, backend)

View file

@ -696,7 +696,7 @@ impl Step for Rustc {
)); ));
let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "build"); let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "build");
rustc_cargo(builder, &mut cargo, target); rustc_cargo(builder, &mut cargo, target, compiler.stage);
if builder.config.rust_profile_use.is_some() if builder.config.rust_profile_use.is_some()
&& builder.config.rust_profile_generate.is_some() && builder.config.rust_profile_generate.is_some()
@ -813,16 +813,21 @@ impl Step for Rustc {
} }
} }
pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelection) { pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelection, stage: u32) {
cargo cargo
.arg("--features") .arg("--features")
.arg(builder.rustc_features(builder.kind)) .arg(builder.rustc_features(builder.kind))
.arg("--manifest-path") .arg("--manifest-path")
.arg(builder.src.join("compiler/rustc/Cargo.toml")); .arg(builder.src.join("compiler/rustc/Cargo.toml"));
rustc_cargo_env(builder, cargo, target); rustc_cargo_env(builder, cargo, target, stage);
} }
pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelection) { pub fn rustc_cargo_env(
builder: &Builder<'_>,
cargo: &mut Cargo,
target: TargetSelection,
stage: u32,
) {
// Set some configuration variables picked up by build scripts and // Set some configuration variables picked up by build scripts and
// the compiler alike // the compiler alike
cargo cargo
@ -867,83 +872,86 @@ pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetS
cargo.env("RUSTC_VERIFY_LLVM_IR", "1"); cargo.env("RUSTC_VERIFY_LLVM_IR", "1");
} }
// Pass down configuration from the LLVM build into the build of
// rustc_llvm and rustc_codegen_llvm.
//
// Note that this is disabled if LLVM itself is disabled or we're in a check // Note that this is disabled if LLVM itself is disabled or we're in a check
// build. If we are in a check build we still go ahead here presuming we've // build. If we are in a check build we still go ahead here presuming we've
// detected that LLVM is already built and good to go which helps prevent // detected that LLVM is already built and good to go which helps prevent
// busting caches (e.g. like #71152). // busting caches (e.g. like #71152).
if builder.config.llvm_enabled() if builder.config.llvm_enabled() {
&& (builder.kind != Kind::Check let building_is_expensive = crate::llvm::prebuilt_llvm_config(builder, target).is_err();
|| crate::llvm::prebuilt_llvm_config(builder, target).is_ok()) // `top_stage == stage` might be false for `check --stage 1`, if we are building the stage 1 compiler
{ let can_skip_build = builder.kind == Kind::Check && builder.top_stage == stage;
if builder.is_rust_llvm(target) { let should_skip_build = building_is_expensive && can_skip_build;
cargo.env("LLVM_RUSTLLVM", "1"); if !should_skip_build {
} rustc_llvm_env(builder, cargo, target)
let llvm::LlvmResult { llvm_config, .. } = builder.ensure(llvm::Llvm { target });
cargo.env("LLVM_CONFIG", &llvm_config);
if let Some(s) = target_config.and_then(|c| c.llvm_config.as_ref()) {
cargo.env("CFG_LLVM_ROOT", s);
} }
}
}
// Some LLVM linker flags (-L and -l) may be needed to link `rustc_llvm`. Its build script /// Pass down configuration from the LLVM build into the build of
// expects these to be passed via the `LLVM_LINKER_FLAGS` env variable, separated by /// rustc_llvm and rustc_codegen_llvm.
// whitespace. fn rustc_llvm_env(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelection) {
// let target_config = builder.config.target_config.get(&target);
// For example:
// - on windows, when `clang-cl` is used with instrumentation, we need to manually add
// clang's runtime library resource directory so that the profiler runtime library can be
// found. This is to avoid the linker errors about undefined references to
// `__llvm_profile_instrument_memop` when linking `rustc_driver`.
let mut llvm_linker_flags = String::new();
if builder.config.llvm_profile_generate && target.contains("msvc") {
if let Some(ref clang_cl_path) = builder.config.llvm_clang_cl {
// Add clang's runtime library directory to the search path
let clang_rt_dir = get_clang_cl_resource_dir(clang_cl_path);
llvm_linker_flags.push_str(&format!("-L{}", clang_rt_dir.display()));
}
}
// The config can also specify its own llvm linker flags. if builder.is_rust_llvm(target) {
if let Some(ref s) = builder.config.llvm_ldflags { cargo.env("LLVM_RUSTLLVM", "1");
if !llvm_linker_flags.is_empty() { }
llvm_linker_flags.push_str(" "); let llvm::LlvmResult { llvm_config, .. } = builder.ensure(llvm::Llvm { target });
} cargo.env("LLVM_CONFIG", &llvm_config);
llvm_linker_flags.push_str(s); if let Some(s) = target_config.and_then(|c| c.llvm_config.as_ref()) {
} cargo.env("CFG_LLVM_ROOT", s);
}
// Set the linker flags via the env var that `rustc_llvm`'s build script will read. // Some LLVM linker flags (-L and -l) may be needed to link `rustc_llvm`. Its build script
// expects these to be passed via the `LLVM_LINKER_FLAGS` env variable, separated by
// whitespace.
//
// For example:
// - on windows, when `clang-cl` is used with instrumentation, we need to manually add
// clang's runtime library resource directory so that the profiler runtime library can be
// found. This is to avoid the linker errors about undefined references to
// `__llvm_profile_instrument_memop` when linking `rustc_driver`.
let mut llvm_linker_flags = String::new();
if builder.config.llvm_profile_generate && target.contains("msvc") {
if let Some(ref clang_cl_path) = builder.config.llvm_clang_cl {
// Add clang's runtime library directory to the search path
let clang_rt_dir = get_clang_cl_resource_dir(clang_cl_path);
llvm_linker_flags.push_str(&format!("-L{}", clang_rt_dir.display()));
}
}
// The config can also specify its own llvm linker flags.
if let Some(ref s) = builder.config.llvm_ldflags {
if !llvm_linker_flags.is_empty() { if !llvm_linker_flags.is_empty() {
cargo.env("LLVM_LINKER_FLAGS", llvm_linker_flags); llvm_linker_flags.push_str(" ");
} }
llvm_linker_flags.push_str(s);
}
// Building with a static libstdc++ is only supported on linux right now, // Set the linker flags via the env var that `rustc_llvm`'s build script will read.
// not for MSVC or macOS if !llvm_linker_flags.is_empty() {
if builder.config.llvm_static_stdcpp cargo.env("LLVM_LINKER_FLAGS", llvm_linker_flags);
&& !target.contains("freebsd") }
&& !target.contains("msvc")
&& !target.contains("apple") // Building with a static libstdc++ is only supported on linux right now,
&& !target.contains("solaris") // not for MSVC or macOS
{ if builder.config.llvm_static_stdcpp
let file = compiler_file( && !target.contains("freebsd")
builder, && !target.contains("msvc")
builder.cxx(target).unwrap(), && !target.contains("apple")
target, && !target.contains("solaris")
CLang::Cxx, {
"libstdc++.a", let file =
); compiler_file(builder, builder.cxx(target).unwrap(), target, CLang::Cxx, "libstdc++.a");
cargo.env("LLVM_STATIC_STDCPP", file); cargo.env("LLVM_STATIC_STDCPP", file);
} }
if builder.llvm_link_shared() { if builder.llvm_link_shared() {
cargo.env("LLVM_LINK_SHARED", "1"); cargo.env("LLVM_LINK_SHARED", "1");
} }
if builder.config.llvm_use_libcxx { if builder.config.llvm_use_libcxx {
cargo.env("LLVM_USE_LIBCXX", "1"); cargo.env("LLVM_USE_LIBCXX", "1");
} }
if builder.config.llvm_optimize && !builder.config.llvm_release_debuginfo { if builder.config.llvm_optimize && !builder.config.llvm_release_debuginfo {
cargo.env("LLVM_NDEBUG", "1"); cargo.env("LLVM_NDEBUG", "1");
}
} }
} }
@ -1090,7 +1098,7 @@ impl Step for CodegenBackend {
cargo cargo
.arg("--manifest-path") .arg("--manifest-path")
.arg(builder.src.join(format!("compiler/rustc_codegen_{}/Cargo.toml", backend))); .arg(builder.src.join(format!("compiler/rustc_codegen_{}/Cargo.toml", backend)));
rustc_cargo_env(builder, &mut cargo, target); rustc_cargo_env(builder, &mut cargo, target, compiler.stage);
let tmp_stamp = out_dir.join(".tmp.stamp"); let tmp_stamp = out_dir.join(".tmp.stamp");

View file

@ -696,7 +696,7 @@ impl Step for Rustc {
cargo.rustdocflag("-Znormalize-docs"); cargo.rustdocflag("-Znormalize-docs");
cargo.rustdocflag("--show-type-layout"); cargo.rustdocflag("--show-type-layout");
cargo.rustdocflag("--generate-link-to-definition"); cargo.rustdocflag("--generate-link-to-definition");
compile::rustc_cargo(builder, &mut cargo, target); compile::rustc_cargo(builder, &mut cargo, target, compiler.stage);
cargo.arg("-Zunstable-options"); cargo.arg("-Zunstable-options");
cargo.arg("-Zskip-rustdoc-fingerprint"); cargo.arg("-Zskip-rustdoc-fingerprint");

View file

@ -1064,6 +1064,8 @@ impl Step for RustdocGUI {
cargo.env("RUSTDOCFLAGS", "-Zunstable-options --generate-link-to-definition"); cargo.env("RUSTDOCFLAGS", "-Zunstable-options --generate-link-to-definition");
} else if entry.file_name() == "scrape_examples" { } else if entry.file_name() == "scrape_examples" {
cargo.arg("-Zrustdoc-scrape-examples"); cargo.arg("-Zrustdoc-scrape-examples");
} else if entry.file_name() == "extend_css" {
cargo.env("RUSTDOCFLAGS", &format!("--extend-css extra.css"));
} }
builder.run(&mut cargo); builder.run(&mut cargo);
} }
@ -2146,7 +2148,7 @@ impl Step for Crate {
compile::std_cargo(builder, target, compiler.stage, &mut cargo); compile::std_cargo(builder, target, compiler.stage, &mut cargo);
} }
Mode::Rustc => { Mode::Rustc => {
compile::rustc_cargo(builder, &mut cargo, target); compile::rustc_cargo(builder, &mut cargo, target, compiler.stage);
} }
_ => panic!("can only test libraries"), _ => panic!("can only test libraries"),
}; };

View file

@ -320,10 +320,7 @@ $ rustdoc src/lib.rs --extend-css extra.css
``` ```
With this flag, the contents of the files you pass are included at the bottom With this flag, the contents of the files you pass are included at the bottom
of Rustdoc's `theme.css` file. of the `theme.css` file.
While this flag is stable, the contents of `theme.css` are not, so be careful!
Updates may break your theme extensions.
## `--sysroot`: override the system root ## `--sysroot`: override the system root

View file

@ -6,7 +6,6 @@ use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_driver::print_flag_list;
use rustc_session::config::{ use rustc_session::config::{
self, parse_crate_types_from_list, parse_externs, parse_target_triple, CrateType, self, parse_crate_types_from_list, parse_externs, parse_target_triple, CrateType,
}; };
@ -328,14 +327,7 @@ impl Options {
return Err(0); return Err(0);
} }
let z_flags = matches.opt_strs("Z"); if rustc_driver::describe_flag_categories(&matches) {
if z_flags.iter().any(|x| *x == "help") {
print_flag_list("-Z", config::Z_OPTIONS);
return Err(0);
}
let c_flags = matches.opt_strs("C");
if c_flags.iter().any(|x| *x == "help") {
print_flag_list("-C", config::CG_OPTIONS);
return Err(0); return Err(0);
} }

View file

@ -398,6 +398,8 @@ fn run_test(
compiler.stdin(Stdio::piped()); compiler.stdin(Stdio::piped());
compiler.stderr(Stdio::piped()); compiler.stderr(Stdio::piped());
debug!("compiler invocation for doctest: {:?}", compiler);
let mut child = compiler.spawn().expect("Failed to spawn rustc process"); let mut child = compiler.spawn().expect("Failed to spawn rustc process");
{ {
let stdin = child.stdin.as_mut().expect("Failed to open stdin"); let stdin = child.stdin.as_mut().expect("Failed to open stdin");

View file

@ -64,7 +64,7 @@
</noscript> {# #} </noscript> {# #}
{% if layout.css_file_extension.is_some() %} {% if layout.css_file_extension.is_some() %}
<link rel="stylesheet" {#+ #} <link rel="stylesheet" {#+ #}
href="{{static_root_path|safe}}theme{{page.resource_suffix}}.css"> {# #} href="{{page.root_path|safe}}theme{{page.resource_suffix}}.css"> {# #}
{% endif %} {% endif %}
{% if !layout.favicon.is_empty() %} {% if !layout.favicon.is_empty() %}
<link rel="icon" href="{{layout.favicon}}"> {# #} <link rel="icon" href="{{layout.favicon}}"> {# #}

View file

@ -0,0 +1,18 @@
include ../tools.mk
all: z_help c_help list_passes
c_help:
$(RUSTC) -C help > $(TMPDIR)/rustc.c_help.txt
$(RUSTDOC) -C help > $(TMPDIR)/rustdoc.c_help.txt
$(DIFF) $(TMPDIR)/rustc.c_help.txt $(TMPDIR)/rustdoc.c_help.txt
z_help:
$(RUSTC) -Z help > $(TMPDIR)/rustc.z_help.txt
$(RUSTDOC) -Z help > $(TMPDIR)/rustdoc.z_help.txt
$(DIFF) $(TMPDIR)/rustc.z_help.txt $(TMPDIR)/rustdoc.z_help.txt
list_passes:
$(RUSTC) -C passes=list > $(TMPDIR)/rustc.passes.txt
$(RUSTDOC) -C passes=list > $(TMPDIR)/rustdoc.passes.txt
$(DIFF) $(TMPDIR)/rustc.passes.txt $(TMPDIR)/rustdoc.passes.txt

View file

@ -0,0 +1,5 @@
// Test to ensure that the `--extend-css` option is working as expected.
go-to: "file://" + |DOC_PATH| + "/extend_css/index.html"
show-text: true
// The text from the `.extend` element should be red.
assert-css: (".extend", {"color": "rgb(255, 0, 0)"})

View file

@ -16,6 +16,7 @@ press-key: "ArrowDown"
press-key: "ArrowDown" press-key: "ArrowDown"
press-key: "ArrowDown" press-key: "ArrowDown"
press-key: "ArrowDown" press-key: "ArrowDown"
press-key: "ArrowDown"
press-key: "Enter" press-key: "Enter"
// Waiting for the search results to appear... // Waiting for the search results to appear...
wait-for: "#search-tabs" wait-for: "#search-tabs"
@ -41,6 +42,7 @@ press-key: "ArrowUp"
press-key: "ArrowUp" press-key: "ArrowUp"
press-key: "ArrowUp" press-key: "ArrowUp"
press-key: "ArrowUp" press-key: "ArrowUp"
press-key: "ArrowUp"
press-key: "Enter" press-key: "Enter"
// Waiting for the search results to appear... // Waiting for the search results to appear...
wait-for: "#search-tabs" wait-for: "#search-tabs"

View file

@ -73,7 +73,7 @@ assert: "//*[@class='dir-entry' and @open]/*[text()='sub_mod']"
// Only "another_folder" should be "open" in "lib2". // Only "another_folder" should be "open" in "lib2".
assert: "//*[@class='dir-entry' and not(@open)]/*[text()='another_mod']" assert: "//*[@class='dir-entry' and not(@open)]/*[text()='another_mod']"
// All other trees should be collapsed. // All other trees should be collapsed.
assert-count: ("//*[@id='source-sidebar']/details[not(text()='lib2') and not(@open)]", 8) assert-count: ("//*[@id='source-sidebar']/details[not(text()='lib2') and not(@open)]", 9)
// We now switch to mobile mode. // We now switch to mobile mode.
set-window-size: (600, 600) set-window-size: (600, 600)

View file

@ -102,7 +102,7 @@ assert: ".source-sidebar-expanded"
// We check that the first entry of the sidebar is collapsed // We check that the first entry of the sidebar is collapsed
assert-property: ("#source-sidebar details:first-of-type", {"open": "false"}) assert-property: ("#source-sidebar details:first-of-type", {"open": "false"})
assert-text: ("#source-sidebar details:first-of-type > summary", "http") assert-text: ("#source-sidebar details:first-of-type > summary", "extend_css")
// We now click on it. // We now click on it.
click: "#source-sidebar details:first-of-type > summary" click: "#source-sidebar details:first-of-type > summary"
assert-property: ("#source-sidebar details:first-of-type", {"open": "true"}) assert-property: ("#source-sidebar details:first-of-type", {"open": "true"})

View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "extend_css"
version = "0.1.0"

View file

@ -0,0 +1,7 @@
[package]
name = "extend_css"
version = "0.1.0"
edition = "2018"
[lib]
path = "lib.rs"

View file

@ -0,0 +1,3 @@
.extend {
color: red !important;
}

View file

@ -0,0 +1 @@
//! <div class="extend">text in red</div>

View file

@ -1,6 +0,0 @@
// check-pass
// compile-flags: -Chelp
// check-stdout
// regex-error-pattern: -C\s+incremental
pub struct Foo;

View file

@ -1,51 +0,0 @@
-C ar=val -- this option is deprecated and does nothing
-C code-model=val -- choose the code model to use (`rustc --print code-models` for details)
-C codegen-units=val -- divide crate into N units to optimize in parallel
-C control-flow-guard=val -- use Windows Control Flow Guard (default: no)
-C debug-assertions=val -- explicitly enable the `cfg(debug_assertions)` directive
-C debuginfo=val -- debug info emission level (0-2, none, line-directives-only, line-tables-only, limited, or full; default: 0)
-C default-linker-libraries=val -- allow the linker to link its default libraries (default: no)
-C embed-bitcode=val -- emit bitcode in rlibs (default: yes)
-C extra-filename=val -- extra data to put in each output filename
-C force-frame-pointers=val -- force use of the frame pointers
-C force-unwind-tables=val -- force use of unwind tables
-C incremental=val -- enable incremental compilation
-C inline-threshold=val -- set the threshold for inlining a function
-C instrument-coverage=val -- instrument the generated code to support LLVM source-based code coverage reports (note, the compiler build config must include `profiler = true`); implies `-C symbol-mangling-version=v0`. Optional values are:
`=all` (implicit value)
`=except-unused-generics`
`=except-unused-functions`
`=off` (default)
-C link-arg=val -- a single extra argument to append to the linker invocation (can be used several times)
-C link-args=val -- extra arguments to append to the linker invocation (space separated)
-C link-dead-code=val -- keep dead code at link time (useful for code coverage) (default: no)
-C link-self-contained=val -- control whether to link Rust provided C objects/libraries or rely
on C toolchain installed in the system
-C linker=val -- system linker to link outputs with
-C linker-flavor=val -- linker flavor
-C linker-plugin-lto=val -- generate build artifacts that are compatible with linker-based LTO
-C llvm-args=val -- a list of arguments to pass to LLVM (space separated)
-C lto=val -- perform LLVM link-time optimizations
-C metadata=val -- metadata to mangle symbol names with
-C no-prepopulate-passes=val -- give an empty list of passes to the pass manager
-C no-redzone=val -- disable the use of the redzone
-C no-stack-check=val -- this option is deprecated and does nothing
-C no-vectorize-loops=val -- disable loop vectorization optimization passes
-C no-vectorize-slp=val -- disable LLVM's SLP vectorization pass
-C opt-level=val -- optimization level (0-3, s, or z; default: 0)
-C overflow-checks=val -- use overflow checks for integer arithmetic
-C panic=val -- panic strategy to compile crate with
-C passes=val -- a list of extra LLVM passes to run (space separated)
-C prefer-dynamic=val -- prefer dynamic linking to static linking (default: no)
-C profile-generate=val -- compile the program with profiling instrumentation
-C profile-use=val -- use the given `.profdata` file for profile-guided optimization
-C relocation-model=val -- control generation of position-independent code (PIC) (`rustc --print relocation-models` for details)
-C remark=val -- print remarks for these optimization passes (space separated, or "all")
-C rpath=val -- set rpath values in libs/exes (default: no)
-C save-temps=val -- save all temporary output files during compilation (default: no)
-C soft-float=val -- use soft float ABI (*eabihf targets only) (default: no)
-C split-debuginfo=val -- how to handle split-debuginfo, a platform-specific option
-C strip=val -- tell the linker which information to strip (`none` (default), `debuginfo` or `symbols`)
-C symbol-mangling-version=val -- which mangling version to use for symbol names ('legacy' (default) or 'v0')
-C target-cpu=val -- select target processor (`rustc --print target-cpus` for details)
-C target-feature=val -- target specific attributes. (`rustc --print target-features` for details). This feature is unsafe.

View file

@ -1,6 +0,0 @@
// check-pass
// compile-flags: -Zhelp
// check-stdout
// regex-error-pattern: -Z\s+self-profile
pub struct Foo;

View file

@ -1,220 +0,0 @@
-Z allow-features=val -- only allow the listed language features to be enabled in code (comma separated)
-Z always-encode-mir=val -- encode MIR of all functions into the crate metadata (default: no)
-Z asm-comments=val -- generate comments into the assembly (may change behavior) (default: no)
-Z assert-incr-state=val -- assert that the incremental cache is in given state: either `loaded` or `not-loaded`.
-Z assume-incomplete-release=val -- make cfg(version) treat the current version as incomplete (default: no)
-Z binary-dep-depinfo=val -- include artifacts (sysroot, crate dependencies) used during compilation in dep-info (default: no)
-Z box-noalias=val -- emit noalias metadata for box (default: yes)
-Z branch-protection=val -- set options for branch target identification and pointer authentication on AArch64
-Z cf-protection=val -- instrument control-flow architecture protection
-Z cgu-partitioning-strategy=val -- the codegen unit partitioning strategy to use
-Z codegen-backend=val -- the backend to use
-Z combine-cgu=val -- combine CGUs into a single one
-Z crate-attr=val -- inject the given attribute in the crate
-Z debug-info-for-profiling=val -- emit discriminators and other data necessary for AutoFDO
-Z debug-macros=val -- emit line numbers debug info inside macros (default: no)
-Z deduplicate-diagnostics=val -- deduplicate identical diagnostics (default: yes)
-Z dep-info-omit-d-target=val -- in dep-info output, omit targets for tracking dependencies of the dep-info files themselves (default: no)
-Z dep-tasks=val -- print tasks that execute and the color their dep node gets (requires debug build) (default: no)
-Z diagnostic-width=val -- set the current output width for diagnostic truncation
-Z dlltool=val -- import library generation tool (windows-gnu only)
-Z dont-buffer-diagnostics=val -- emit diagnostics rather than buffering (breaks NLL error downgrading, sorting) (default: no)
-Z drop-tracking=val -- enables drop tracking in generators (default: no)
-Z drop-tracking-mir=val -- enables drop tracking on MIR in generators (default: no)
-Z dual-proc-macros=val -- load proc macros for both target and host, but only link to the target (default: no)
-Z dump-dep-graph=val -- dump the dependency graph to $RUST_DEP_GRAPH (default: /tmp/dep_graph.gv) (default: no)
-Z dump-drop-tracking-cfg=val -- dump drop-tracking control-flow graph as a `.dot` file (default: no)
-Z dump-mir=val -- dump MIR state to file.
`val` is used to select which passes and functions to dump. For example:
`all` matches all passes and functions,
`foo` matches all passes for functions whose name contains 'foo',
`foo & ConstProp` only the 'ConstProp' pass for function names containing 'foo',
`foo | bar` all passes for function names containing 'foo' or 'bar'.
-Z dump-mir-dataflow=val -- in addition to `.mir` files, create graphviz `.dot` files with dataflow results (default: no)
-Z dump-mir-dir=val -- the directory the MIR is dumped into (default: `mir_dump`)
-Z dump-mir-exclude-pass-number=val -- exclude the pass number when dumping MIR (used in tests) (default: no)
-Z dump-mir-graphviz=val -- in addition to `.mir` files, create graphviz `.dot` files (and with `-Z instrument-coverage`, also create a `.dot` file for the MIR-derived coverage graph) (default: no)
-Z dump-mir-spanview=val -- in addition to `.mir` files, create `.html` files to view spans for all `statement`s (including terminators), only `terminator` spans, or computed `block` spans (one span encompassing a block's terminator and all statements). If `-Z instrument-coverage` is also enabled, create an additional `.html` file showing the computed coverage spans.
-Z dump-mono-stats=val -- output statistics about monomorphization collection
-Z dump-mono-stats-format=val -- the format to use for -Z dump-mono-stats (`markdown` (default) or `json`)
-Z dwarf-version=val -- version of DWARF debug information to emit (default: 2 or 4, depending on platform)
-Z dylib-lto=val -- enables LTO for dylib crate type
-Z emit-stack-sizes=val -- emit a section containing stack size metadata (default: no)
-Z emit-thin-lto=val -- emit the bc module with thin LTO info (default: yes)
-Z export-executable-symbols=val -- export symbols from executables, as if they were dynamic libraries
-Z extra-const-ub-checks=val -- turns on more checks to detect const UB, which can be slow (default: no)
-Z fewer-names=val -- reduce memory use by retaining fewer names within compilation artifacts (LLVM-IR) (default: no)
-Z flatten-format-args=val -- flatten nested format_args!() and literals into a simplified format_args!() call (default: no)
-Z force-unstable-if-unmarked=val -- force all crates to be `rustc_private` unstable (default: no)
-Z fuel=val -- set the optimization fuel quota for a crate
-Z function-sections=val -- whether each function should go in its own section
-Z future-incompat-test=val -- forces all lints to be future incompatible, used for internal testing (default: no)
-Z gcc-ld=val -- implementation of ld used by cc
-Z graphviz-dark-mode=val -- use dark-themed colors in graphviz output (default: no)
-Z graphviz-font=val -- use the given `fontname` in graphviz output; can be overridden by setting environment variable `RUSTC_GRAPHVIZ_FONT` (default: `Courier, monospace`)
-Z hir-stats=val -- print some statistics about AST and HIR (default: no)
-Z human-readable-cgu-names=val -- generate human-readable, predictable names for codegen units (default: no)
-Z identify-regions=val -- display unnamed regions as `'<id>`, using a non-ident unique id (default: no)
-Z incremental-ignore-spans=val -- ignore spans during ICH computation -- used for testing (default: no)
-Z incremental-info=val -- print high-level information about incremental reuse (or the lack thereof) (default: no)
-Z incremental-relative-spans=val -- hash spans relative to their parent item for incr. comp. (default: no)
-Z incremental-verify-ich=val -- verify incr. comp. hashes of green query instances (default: no)
-Z inline-in-all-cgus=val -- control whether `#[inline]` functions are in all CGUs
-Z inline-llvm=val -- enable LLVM inlining (default: yes)
-Z inline-mir=val -- enable MIR inlining (default: no)
-Z inline-mir-hint-threshold=val -- inlining threshold for functions with inline hint (default: 100)
-Z inline-mir-threshold=val -- a default MIR inlining threshold (default: 50)
-Z input-stats=val -- gather statistics about the input (default: no)
-Z instrument-coverage=val -- instrument the generated code to support LLVM source-based code coverage reports (note, the compiler build config must include `profiler = true`); implies `-C symbol-mangling-version=v0`. Optional values are:
`=all` (implicit value)
`=except-unused-generics`
`=except-unused-functions`
`=off` (default)
-Z instrument-mcount=val -- insert function instrument code for mcount-based tracing (default: no)
-Z instrument-xray=val -- insert function instrument code for XRay-based tracing (default: no)
Optional extra settings:
`=always`
`=never`
`=ignore-loops`
`=instruction-threshold=N`
`=skip-entry`
`=skip-exit`
Multiple options can be combined with commas.
-Z keep-hygiene-data=val -- keep hygiene data after analysis (default: no)
-Z layout-seed=val -- seed layout randomization
-Z link-directives=val -- honor #[link] directives in the compiled crate (default: yes)
-Z link-native-libraries=val -- link native libraries in the linker invocation (default: yes)
-Z link-only=val -- link the `.rlink` file generated by `-Z no-link` (default: no)
-Z llvm-plugins=val -- a list LLVM plugins to enable (space separated)
-Z llvm-time-trace=val -- generate JSON tracing data file from LLVM data (default: no)
-Z location-detail=val -- what location details should be tracked when using caller_location, either `none`, or a comma separated list of location details, for which valid options are `file`, `line`, and `column` (default: `file,line,column`)
-Z lower-impl-trait-in-trait-to-assoc-ty=val -- modify the lowering strategy for `impl Trait` in traits so that they are lowered to generic associated types
-Z ls=val -- list the symbols defined by a library crate (default: no)
-Z macro-backtrace=val -- show macro backtraces (default: no)
-Z maximal-hir-to-mir-coverage=val -- save as much information as possible about the correspondence between MIR and HIR as source scopes (default: no)
-Z merge-functions=val -- control the operation of the MergeFunctions LLVM pass, taking the same values as the target option of the same name
-Z meta-stats=val -- gather metadata statistics (default: no)
-Z mir-emit-retag=val -- emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 (default: no)
-Z mir-enable-passes=val -- use like `-Zmir-enable-passes=+DestProp,-InstCombine`. Forces the specified passes to be enabled, overriding all other checks. Passes that are not specified are enabled or disabled by other flags as usual.
-Z mir-opt-level=val -- MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)
-Z mir-pretty-relative-line-numbers=val -- use line numbers relative to the function in mir pretty printing
-Z move-size-limit=val -- the size at which the `large_assignments` lint starts to be emitted
-Z mutable-noalias=val -- emit noalias metadata for mutable references (default: yes)
-Z nll-facts=val -- dump facts from NLL analysis into side files (default: no)
-Z nll-facts-dir=val -- the directory the NLL facts are dumped into (default: `nll-facts`)
-Z no-analysis=val -- parse and expand the source, but run no analysis
-Z no-codegen=val -- run all passes except codegen; no output
-Z no-generate-arange-section=val -- omit DWARF address ranges that give faster lookups
-Z no-jump-tables=val -- disable the jump tables and lookup tables that can be generated from a switch case lowering
-Z no-leak-check=val -- disable the 'leak check' for subtyping; unsound, but useful for tests
-Z no-link=val -- compile without linking
-Z no-parallel-llvm=val -- run LLVM in non-parallel mode (while keeping codegen-units and ThinLTO)
-Z no-profiler-runtime=val -- prevent automatic injection of the profiler_builtins crate
-Z no-unique-section-names=val -- do not use unique names for text and data sections when -Z function-sections is used
-Z normalize-docs=val -- normalize associated items in rustdoc when generating documentation
-Z oom=val -- panic strategy for out-of-memory handling
-Z osx-rpath-install-name=val -- pass `-install_name @rpath/...` to the macOS linker (default: no)
-Z packed-bundled-libs=val -- change rlib format to store native libraries as archives
-Z panic-abort-tests=val -- support compiling tests with panic=abort (default: no)
-Z panic-in-drop=val -- panic strategy for panics in drops
-Z parse-only=val -- parse only; do not compile, assemble, or link (default: no)
-Z perf-stats=val -- print some performance-related statistics (default: no)
-Z plt=val -- whether to use the PLT when calling into shared libraries;
only has effect for PIC code on systems with ELF binaries
(default: PLT is disabled if full relro is enabled)
-Z polonius=val -- enable polonius-based borrow-checker (default: no)
-Z polymorphize=val -- perform polymorphization analysis
-Z pre-link-arg=val -- a single extra argument to prepend the linker invocation (can be used several times)
-Z pre-link-args=val -- extra arguments to prepend to the linker invocation (space separated)
-Z precise-enum-drop-elaboration=val -- use a more precise version of drop elaboration for matches on enums (default: yes). This results in better codegen, but has caused miscompilations on some tier 2 platforms. See #77382 and #74551.
-Z print-fuel=val -- make rustc print the total optimization fuel used by a crate
-Z print-llvm-passes=val -- print the LLVM optimization passes being run (default: no)
-Z print-mono-items=val -- print the result of the monomorphization collection pass
-Z print-type-sizes=val -- print layout information for each type encountered (default: no)
-Z proc-macro-backtrace=val -- show backtraces for panics during proc-macro execution (default: no)
-Z proc-macro-execution-strategy=val -- how to run proc-macro code (default: same-thread)
-Z profile=val -- insert profiling code (default: no)
-Z profile-closures=val -- profile size of closures
-Z profile-emit=val -- file path to emit profiling data at runtime when using 'profile' (default based on relative source path)
-Z profile-sample-use=val -- use the given `.prof` file for sampled profile-guided optimization (also known as AutoFDO)
-Z profiler-runtime=val -- name of the profiler runtime crate to automatically inject (default: `profiler_builtins`)
-Z query-dep-graph=val -- enable queries of the dependency graph for regression testing (default: no)
-Z randomize-layout=val -- randomize the layout of types (default: no)
-Z relax-elf-relocations=val -- whether ELF relocations can be relaxed
-Z relro-level=val -- choose which RELRO level to use
-Z remap-cwd-prefix=val -- remap paths under the current working directory to this path prefix
-Z report-delayed-bugs=val -- immediately print bugs registered with `delay_span_bug` (default: no)
-Z sanitizer=val -- use a sanitizer
-Z sanitizer-memory-track-origins=val -- enable origins tracking in MemorySanitizer
-Z sanitizer-recover=val -- enable recovery for selected sanitizers
-Z saturating-float-casts=val -- make float->int casts UB-free: numbers outside the integer type's range are clipped to the max/min integer respectively, and NaN is mapped to 0 (default: yes)
-Z self-profile=val -- run the self profiler and output the raw event data
-Z self-profile-counter=val -- counter used by the self profiler (default: `wall-time`), one of:
`wall-time` (monotonic clock, i.e. `std::time::Instant`)
`instructions:u` (retired instructions, userspace-only)
`instructions-minus-irqs:u` (subtracting hardware interrupt counts for extra accuracy)
-Z self-profile-events=val -- specify the events recorded by the self profiler;
for example: `-Z self-profile-events=default,query-keys`
all options: none, all, default, generic-activity, query-provider, query-cache-hit
query-blocked, incr-cache-load, incr-result-hashing, query-keys, function-args, args, llvm, artifact-sizes
-Z share-generics=val -- make the current crate share its generic instantiations
-Z show-span=val -- show spans for compiler debugging (expr|pat|ty)
-Z simulate-remapped-rust-src-base=val -- simulate the effect of remap-debuginfo = true at bootstrapping by remapping path to rust's source base directory. only meant for testing purposes
-Z span-debug=val -- forward proc_macro::Span's `Debug` impl to `Span`
-Z span-free-formats=val -- exclude spans when debug-printing compiler state (default: no)
-Z split-dwarf-inlining=val -- provide minimal debug info in the object/executable to facilitate online symbolication/stack traces in the absence of .dwo/.dwp files when using Split DWARF
-Z split-dwarf-kind=val -- split dwarf variant (only if -Csplit-debuginfo is enabled and on relevant platform)
(default: `split`)
`split`: sections which do not require relocation are written into a DWARF object (`.dwo`)
file which is ignored by the linker
`single`: sections which do not require relocation are written into object file but ignored
by the linker
-Z src-hash-algorithm=val -- hash algorithm of source files in debug info (`md5`, `sha1`, or `sha256`)
-Z stack-protector=val -- control stack smash protection strategy (`rustc --print stack-protector-strategies` for details)
-Z strict-init-checks=val -- control if mem::uninitialized and mem::zeroed panic on more UB
-Z strip=val -- tell the linker which information to strip (`none` (default), `debuginfo` or `symbols`)
-Z symbol-mangling-version=val -- which mangling version to use for symbol names ('legacy' (default) or 'v0')
-Z teach=val -- show extended diagnostic help (default: no)
-Z temps-dir=val -- the directory the intermediate files are written to
-Z terminal-urls=val -- use the OSC 8 hyperlink terminal specification to print hyperlinks in the compiler output
-Z thinlto=val -- enable ThinLTO when possible
-Z thir-unsafeck=val -- use the THIR unsafety checker (default: no)
-Z threads=val -- use a thread pool with N threads
-Z time-llvm-passes=val -- measure time of each LLVM pass (default: no)
-Z time-passes=val -- measure time of each rustc pass (default: no)
-Z time-passes-format=val -- the format to use for -Z time-passes (`text` (default) or `json`)
-Z tiny-const-eval-limit=val -- sets a tiny, non-configurable limit for const eval; useful for compiler tests
-Z tls-model=val -- choose the TLS model to use (`rustc --print tls-models` for details)
-Z trace-macros=val -- for every macro invocation, print its name and arguments (default: no)
-Z track-diagnostics=val -- tracks where in rustc a diagnostic was emitted
-Z trait-solver=val -- specify the trait solver mode used by rustc (default: classic)
-Z translate-additional-ftl=val -- additional fluent translation to preferentially use (for testing translation)
-Z translate-directionality-markers=val -- emit directionality isolation markers in translated diagnostics
-Z translate-lang=val -- language identifier for diagnostic output
-Z translate-remapped-path-to-local-path=val -- translate remapped paths into local paths when possible (default: yes)
-Z trap-unreachable=val -- generate trap instructions for unreachable intrinsics (default: use target setting, usually yes)
-Z treat-err-as-bug=val -- treat error number `val` that occurs as bug
-Z trim-diagnostic-paths=val -- in diagnostics, use heuristics to shorten paths referring to items
-Z tune-cpu=val -- select processor to schedule for (`rustc --print target-cpus` for details)
-Z ui-testing=val -- emit compiler diagnostics in a form suitable for UI testing (default: no)
-Z uninit-const-chunk-threshold=val -- allow generating const initializers with mixed init/uninit chunks, and set the maximum number of chunks for which this is allowed (default: 16)
-Z unleash-the-miri-inside-of-you=val -- take the brakes off const evaluation. NOTE: this is unsound (default: no)
-Z unpretty=val -- present the input source, unstable (and less-pretty) variants;
`normal`, `identified`,
`expanded`, `expanded,identified`,
`expanded,hygiene` (with internal representations),
`ast-tree` (raw AST before expansion),
`ast-tree,expanded` (raw AST after expansion),
`hir` (the HIR), `hir,identified`,
`hir,typed` (HIR with types for each node),
`hir-tree` (dump the raw HIR),
`mir` (the MIR), or `mir-cfg` (graphviz formatted MIR)
-Z unsound-mir-opts=val -- enable unsound and buggy MIR optimizations (default: no)
-Z unstable-options=val -- adds unstable command line options to rustc interface (default: no)
-Z use-ctors-section=val -- use legacy .ctors section for initializers rather than .init_array
-Z validate-mir=val -- validate MIR after each transformation
-Z verbose=val -- in general, enable more debug printouts (default: no)
-Z verify-llvm-ir=val -- verify LLVM IR (default: no)
-Z virtual-function-elimination=val -- enables dead virtual function elimination optimization. Requires `-Clto[=[fat,yes]]`
-Z wasi-exec-model=val -- whether to build a wasi command or reactor

View file

@ -1,9 +1,10 @@
error[E0282]: type annotations needed error[E0275]: overflow evaluating the requirement `for<'a> &'a mut Bar well-formed`
--> $DIR/issue-95230.rs:9:13 --> $DIR/issue-95230.rs:9:13
| |
LL | for<'a> &'a mut Self:; LL | for<'a> &'a mut Self:;
| ^^^^^^^^^^^^ cannot infer type for mutable reference `&'a mut Bar` | ^^^^^^^^^^^^
| |
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_95230`)
note: required by a bound in `Bar` note: required by a bound in `Bar`
--> $DIR/issue-95230.rs:9:13 --> $DIR/issue-95230.rs:9:13
| |
@ -15,4 +16,4 @@ LL | for<'a> &'a mut Self:;
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0282`. For more information about this error, try `rustc --explain E0275`.

View file

@ -1,45 +0,0 @@
#![allow(unused_labels)]
// FIXME(#108019): outdated Unicode table
// fn foo() {
// '🥺 loop {
// break
// }
// }
fn bar() {
'🐱 loop {
//~^ ERROR labeled expression must be followed by `:`
//~| ERROR lifetimes or labels cannot contain emojis
break
}
}
fn qux() {
'a🐱 loop {
//~^ ERROR labeled expression must be followed by `:`
//~| ERROR lifetimes or labels cannot contain emojis
break
}
}
fn quux() {
'1🐱 loop {
//~^ ERROR labeled expression must be followed by `:`
//~| ERROR lifetimes or labels cannot start with a number
break
}
}
fn x<'🐱>() -> &'🐱 () {
//~^ ERROR lifetimes or labels cannot contain emojis
//~| ERROR lifetimes or labels cannot contain emojis
&()
}
fn y() {
'a🐱: loop {}
//~^ ERROR lifetimes or labels cannot contain emojis
}
fn main() {}

View file

@ -1,86 +0,0 @@
error: labeled expression must be followed by `:`
--> $DIR/issue-108019-bad-emoji-recovery.rs:11:5
|
LL | '🐱 loop {
| ^--- help: add `:` after the label
| |
| _____the label
| |
LL | |
LL | |
LL | | break
LL | | }
| |_____^
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
error: labeled expression must be followed by `:`
--> $DIR/issue-108019-bad-emoji-recovery.rs:19:5
|
LL | 'a🐱 loop {
| ^---- help: add `:` after the label
| |
| _____the label
| |
LL | |
LL | |
LL | | break
LL | | }
| |_____^
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
error: labeled expression must be followed by `:`
--> $DIR/issue-108019-bad-emoji-recovery.rs:27:5
|
LL | '1🐱 loop {
| ^---- help: add `:` after the label
| |
| _____the label
| |
LL | |
LL | |
LL | | break
LL | | }
| |_____^
|
= note: labels are used before loops and blocks, allowing e.g., `break 'label` to them
error: lifetimes or labels cannot contain emojis
--> $DIR/issue-108019-bad-emoji-recovery.rs:11:5
|
LL | '🐱 loop {
| ^^^
error: lifetimes or labels cannot contain emojis
--> $DIR/issue-108019-bad-emoji-recovery.rs:19:5
|
LL | 'a🐱 loop {
| ^^^^
error: lifetimes or labels cannot start with a number
--> $DIR/issue-108019-bad-emoji-recovery.rs:27:5
|
LL | '1🐱 loop {
| ^^^^
error: lifetimes or labels cannot contain emojis
--> $DIR/issue-108019-bad-emoji-recovery.rs:34:6
|
LL | fn x<'🐱>() -> &'🐱 () {
| ^^^
error: lifetimes or labels cannot contain emojis
--> $DIR/issue-108019-bad-emoji-recovery.rs:34:16
|
LL | fn x<'🐱>() -> &'🐱 () {
| ^^^
error: lifetimes or labels cannot contain emojis
--> $DIR/issue-108019-bad-emoji-recovery.rs:41:5
|
LL | 'a🐱: loop {}
| ^^^^
error: aborting due to 9 previous errors

View file

@ -0,0 +1,49 @@
// normalize-stderr-test: "long-type-\d+" -> "long-type-hash"
// Fixes #110131
//
// The issue is that we were constructing an `ImplDerived` cause code for the
// `&'a T: IntoIterator<Item = &'a u8>` obligation for `Helper::new`, which is
// incorrect because derived obligations are only expected to come from *traits*.
struct SeqBuffer<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
iter: <&'a T as IntoIterator>::IntoIter,
}
struct Helper<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
buf: SeqBuffer<'a, T>,
}
impl<'a, T> Helper<'a, T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
fn new(sq: &'a T) -> Self {
loop {}
}
}
struct BitReaderWrapper<T>(T);
impl<'a, T> IntoIterator for &'a BitReaderWrapper<T>
where
&'a T: IntoIterator<Item = &'a u8>,
{
type Item = u32;
type IntoIter = Helper<'a, T>;
//~^ ERROR `Helper<'a, T>` is not an iterator
fn into_iter(self) -> Self::IntoIter {
Helper::new(&self.0)
//~^ ERROR overflow evaluating the requirement `&_: IntoIterator`
}
}
fn main() {}

View file

@ -0,0 +1,38 @@
error[E0277]: `Helper<'a, T>` is not an iterator
--> $DIR/inherent-bound-in-probe.rs:40:21
|
LL | type IntoIter = Helper<'a, T>;
| ^^^^^^^^^^^^^ `Helper<'a, T>` is not an iterator
|
= help: the trait `Iterator` is not implemented for `Helper<'a, T>`
note: required by a bound in `std::iter::IntoIterator::IntoIter`
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
error[E0275]: overflow evaluating the requirement `&_: IntoIterator`
--> $DIR/inherent-bound-in-probe.rs:44:17
|
LL | Helper::new(&self.0)
| ^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inherent_bound_in_probe`)
note: required for `&BitReaderWrapper<_>` to implement `IntoIterator`
--> $DIR/inherent-bound-in-probe.rs:34:13
|
LL | impl<'a, T> IntoIterator for &'a BitReaderWrapper<T>
| ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
LL | where
LL | &'a T: IntoIterator<Item = &'a u8>,
| ------------- unsatisfied trait bound introduced here
= note: 126 redundant requirements hidden
= note: required for `&BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<BitReaderWrapper<...>>>>>` to implement `IntoIterator`
= note: the full type name has been written to '$TEST_BUILD_DIR/methods/inherent-bound-in-probe/inherent-bound-in-probe.long-type-hash.txt'
note: required by a bound in `Helper<'a, T>`
--> $DIR/inherent-bound-in-probe.rs:25:25
|
LL | &'a T: IntoIterator<Item = &'a u8>,
| ^^^^^^^^^^^^^ required by this bound in `Helper<'a, T>`
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0275, E0277.
For more information about an error, try `rustc --explain E0275`.

View file

@ -1,6 +1,6 @@
struct S<'1> { s: &'1 usize } struct S<'1> { s: &'1 usize }
//~^ ERROR lifetimes or labels cannot start with a number //~^ ERROR lifetimes cannot start with a number
//~| ERROR lifetimes or labels cannot start with a number //~| ERROR lifetimes cannot start with a number
fn main() { fn main() {
// verify that the parse error doesn't stop type checking // verify that the parse error doesn't stop type checking
let x: usize = ""; let x: usize = "";

View file

@ -6,13 +6,13 @@ LL | let x: usize = "";
| | | |
| expected due to this | expected due to this
error: lifetimes or labels cannot start with a number error: lifetimes cannot start with a number
--> $DIR/numeric-lifetime.rs:1:10 --> $DIR/numeric-lifetime.rs:1:10
| |
LL | struct S<'1> { s: &'1 usize } LL | struct S<'1> { s: &'1 usize }
| ^^ | ^^
error: lifetimes or labels cannot start with a number error: lifetimes cannot start with a number
--> $DIR/numeric-lifetime.rs:1:20 --> $DIR/numeric-lifetime.rs:1:20
| |
LL | struct S<'1> { s: &'1 usize } LL | struct S<'1> { s: &'1 usize }

View file

@ -0,0 +1,7 @@
// compile-flags: --test
fn align_offset_weird_strides() {
#[test]
//~^ ERROR the `#[test]` attribute may only be used on a non-associated function
struct A5(u32, u8);
}

View file

@ -0,0 +1,16 @@
error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/issue-109816.rs:4:5
|
LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL |
LL | struct A5(u32, u8);
| ------------------- expected a non-associated function, found a struct
|
help: replace with conditional compilation to make the item only exist when tests are being run
|
LL | #[cfg(test)]
|
error: aborting due to previous error

View file

@ -1,18 +1,16 @@
// #[test] attribute is not allowed on associated functions or methods
// reworded error message
// compile-flags:--test // compile-flags:--test
struct A {} struct A {}
impl A { impl A {
#[test] #[test]
//~^ ERROR the `#[test]` attribute may only be used on a non-associated function
fn new() -> A { fn new() -> A {
//~^ ERROR `#[test]` attribute is only allowed on non associated functions
A {} A {}
} }
#[test] #[test]
//~^ ERROR the `#[test]` attribute may only be used on a non-associated function
fn recovery_witness() -> A { fn recovery_witness() -> A {
//~^ ERROR `#[test]` attribute is only allowed on non associated functions
A {} A {}
} }
} }

View file

@ -1,20 +1,24 @@
error: `#[test]` attribute is only allowed on non associated functions error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-attr-non-associated-functions.rs:9:5 --> $DIR/test-attr-non-associated-functions.rs:6:5
|
LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
|
help: replace with conditional compilation to make the item only exist when tests are being run
|
LL | #[cfg(test)]
| |
LL | / fn new() -> A {
LL | |
LL | | A {}
LL | | }
| |_____^
error: `#[test]` attribute is only allowed on non associated functions error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-attr-non-associated-functions.rs:14:5 --> $DIR/test-attr-non-associated-functions.rs:11:5
|
LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
|
help: replace with conditional compilation to make the item only exist when tests are being run
|
LL | #[cfg(test)]
| |
LL | / fn recovery_witness() -> A {
LL | |
LL | | A {}
LL | | }
| |_____^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View file

@ -2,7 +2,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:3:1 --> $DIR/test-on-not-fn.rs:3:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | mod test {} LL | mod test {}
| ----------- expected a non-associated function, found a module | ----------- expected a non-associated function, found a module
| |
@ -15,7 +15,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:6:1 --> $DIR/test-on-not-fn.rs:6:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | / mod loooooooooooooong_teeeeeeeeeest { LL | / mod loooooooooooooong_teeeeeeeeeest {
LL | | /* LL | | /*
LL | | this is a comment LL | | this is a comment
@ -34,7 +34,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:20:1 --> $DIR/test-on-not-fn.rs:20:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | extern "C" {} LL | extern "C" {}
| ------------- expected a non-associated function, found an extern block | ------------- expected a non-associated function, found an extern block
| |
@ -47,7 +47,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:23:1 --> $DIR/test-on-not-fn.rs:23:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | trait Foo {} LL | trait Foo {}
| ------------ expected a non-associated function, found a trait | ------------ expected a non-associated function, found a trait
| |
@ -60,7 +60,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:26:1 --> $DIR/test-on-not-fn.rs:26:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | impl Foo for i32 {} LL | impl Foo for i32 {}
| ------------------- expected a non-associated function, found an implementation | ------------------- expected a non-associated function, found an implementation
| |
@ -73,7 +73,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:29:1 --> $DIR/test-on-not-fn.rs:29:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | const FOO: i32 = -1_i32; LL | const FOO: i32 = -1_i32;
| ------------------------ expected a non-associated function, found a constant item | ------------------------ expected a non-associated function, found a constant item
| |
@ -86,7 +86,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:32:1 --> $DIR/test-on-not-fn.rs:32:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | static BAR: u64 = 10_000_u64; LL | static BAR: u64 = 10_000_u64;
| ----------------------------- expected a non-associated function, found a static item | ----------------------------- expected a non-associated function, found a static item
| |
@ -99,7 +99,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:35:1 --> $DIR/test-on-not-fn.rs:35:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | / enum MyUnit { LL | / enum MyUnit {
LL | | Unit, LL | | Unit,
LL | | } LL | | }
@ -114,7 +114,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:40:1 --> $DIR/test-on-not-fn.rs:40:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | struct NewI32(i32); LL | struct NewI32(i32);
| ------------------- expected a non-associated function, found a struct | ------------------- expected a non-associated function, found a struct
| |
@ -127,7 +127,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:43:1 --> $DIR/test-on-not-fn.rs:43:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | / union Spooky { LL | / union Spooky {
LL | | x: i32, LL | | x: i32,
LL | | y: u32, LL | | y: u32,
@ -143,7 +143,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:50:1 --> $DIR/test-on-not-fn.rs:50:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | #[derive(Copy, Clone, Debug)] LL | #[derive(Copy, Clone, Debug)]
LL | / struct MoreAttrs { LL | / struct MoreAttrs {
LL | | a: i32, LL | | a: i32,
@ -160,7 +160,7 @@ warning: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:61:1 --> $DIR/test-on-not-fn.rs:61:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ the `#[test]` macro causes a function to be run on a test and has no effect on non-functions | ^^^^^^^ the `#[test]` macro causes a function to be run as a test and has no effect on non-functions
LL | foo!(); LL | foo!();
| ------- expected a non-associated function, found an item macro invocation | ------- expected a non-associated function, found an item macro invocation
| |

View file

@ -13,7 +13,7 @@ fn needs_bar<S: Bar>() {}
fn test<T: Foo1<Assoc1 = <T as Foo2>::Assoc2> + Foo2<Assoc2 = <T as Foo1>::Assoc1>>() { fn test<T: Foo1<Assoc1 = <T as Foo2>::Assoc2> + Foo2<Assoc2 = <T as Foo1>::Assoc1>>() {
needs_bar::<T::Assoc1>(); needs_bar::<T::Assoc1>();
//~^ ERROR type annotations needed //~^ ERROR overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
} }
fn main() {} fn main() {}

View file

@ -1,10 +1,10 @@
error[E0283]: type annotations needed: cannot satisfy `<T as Foo1>::Assoc1: Bar` error[E0275]: overflow evaluating the requirement `<T as Foo1>::Assoc1: Bar`
--> $DIR/recursive-self-normalization-2.rs:15:5 --> $DIR/recursive-self-normalization-2.rs:15:5
| |
LL | needs_bar::<T::Assoc1>(); LL | needs_bar::<T::Assoc1>();
| ^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^
| |
= note: cannot satisfy `<T as Foo1>::Assoc1: Bar` = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization_2`)
note: required by a bound in `needs_bar` note: required by a bound in `needs_bar`
--> $DIR/recursive-self-normalization-2.rs:12:17 --> $DIR/recursive-self-normalization-2.rs:12:17
| |
@ -13,4 +13,4 @@ LL | fn needs_bar<S: Bar>() {}
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0283`. For more information about this error, try `rustc --explain E0275`.

View file

@ -9,7 +9,7 @@ fn needs_bar<S: Bar>() {}
fn test<T: Foo<Assoc = <T as Foo>::Assoc>>() { fn test<T: Foo<Assoc = <T as Foo>::Assoc>>() {
needs_bar::<T::Assoc>(); needs_bar::<T::Assoc>();
//~^ ERROR type annotations needed //~^ ERROR overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
} }
fn main() {} fn main() {}

View file

@ -1,10 +1,10 @@
error[E0283]: type annotations needed: cannot satisfy `<T as Foo>::Assoc: Bar` error[E0275]: overflow evaluating the requirement `<T as Foo>::Assoc: Bar`
--> $DIR/recursive-self-normalization.rs:11:5 --> $DIR/recursive-self-normalization.rs:11:5
| |
LL | needs_bar::<T::Assoc>(); LL | needs_bar::<T::Assoc>();
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
| |
= note: cannot satisfy `<T as Foo>::Assoc: Bar` = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`recursive_self_normalization`)
note: required by a bound in `needs_bar` note: required by a bound in `needs_bar`
--> $DIR/recursive-self-normalization.rs:8:17 --> $DIR/recursive-self-normalization.rs:8:17
| |
@ -13,4 +13,4 @@ LL | fn needs_bar<S: Bar>() {}
error: aborting due to previous error error: aborting due to previous error
For more information about this error, try `rustc --explain E0283`. For more information about this error, try `rustc --explain E0275`.