Skip to content

Commit

Permalink
Auto merge of #126396 - fmease:rollup-3j7f6wk, r=fmease
Browse files Browse the repository at this point in the history
Rollup of 6 pull requests

Successful merges:

 - #126347 (Simplify `try_*`'s signature on `Iterator`)
 - #126348 (Improve error message if dependency installation in tidy fails)
 - #126366 (Add a new trait to retrieve StableMir definition Ty)
 - #126370 (compiletest: Stricter parsing of `//@ normalize-*` headers)
 - #126379 (interpret: update doc comment for find_closest_untracked_caller_location)
 - #126384 (add tracking issue for is_none_or)

Failed merges:

 - #126388 (const-eval: make lint scope computation consistent)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Jun 13, 2024
2 parents 921645c + f1a4f30 commit 9fdbfe1
Show file tree
Hide file tree
Showing 13 changed files with 277 additions and 87 deletions.
10 changes: 7 additions & 3 deletions compiler/rustc_const_eval/src/interpret/eval_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ impl<'tcx, Prov: Provenance> Frame<'tcx, Prov> {
impl<'tcx, Prov: Provenance, Extra> Frame<'tcx, Prov, Extra> {
/// Get the current location within the Frame.
///
/// If this is `Left`, we are not currently executing any particular statement in
/// If this is `Right`, we are not currently executing any particular statement in
/// this frame (can happen e.g. during frame initialization, and during unwinding on
/// frames without cleanup code).
///
Expand Down Expand Up @@ -500,15 +500,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
}
}

/// Returns the span of the currently executed statement/terminator.
/// This is the span typically used for error reporting.
#[inline(always)]
pub fn cur_span(&self) -> Span {
// This deliberately does *not* honor `requires_caller_location` since it is used for much
// more than just panics.
self.stack().last().map_or(self.tcx.span, |f| f.current_span())
}

/// Find the first stack frame that is within the current crate, if any;
/// otherwise return the crate's HirId.
#[inline(always)]
/// Find the first stack frame that is within the current crate, if any, otherwise return the crate's HirId
pub fn best_lint_scope(&self) -> hir::HirId {
self.stack()
.iter()
Expand Down Expand Up @@ -632,7 +635,8 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
}

/// Walks up the callstack from the intrinsic's callsite, searching for the first callsite in a
/// frame which is not `#[track_caller]`. This is the fancy version of `cur_span`.
/// frame which is not `#[track_caller]`. This matches the `caller_location` intrinsic,
/// and is primarily intended for the panic machinery.
pub(crate) fn find_closest_untracked_caller_location(&self) -> Span {
for frame in self.stack().iter().rev() {
debug!("find_closest_untracked_caller_location: checking frame {:?}", frame.instance);
Expand Down
37 changes: 36 additions & 1 deletion compiler/stable_mir/src/crate_def.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! Module that define a common trait for things that represent a crate definition,
//! such as, a function, a trait, an enum, and any other definitions.
use crate::ty::Span;
use crate::ty::{GenericArgs, Span, Ty};
use crate::{with, Crate, Symbol};

/// A unique identification number for each item accessible for the current compilation unit.
Expand Down Expand Up @@ -52,6 +52,23 @@ pub trait CrateDef {
}
}

/// A trait that can be used to retrieve a definition's type.
///
/// Note that not every CrateDef has a type `Ty`. They should not implement this trait.
pub trait CrateDefType: CrateDef {
/// Returns the type of this crate item.
fn ty(&self) -> Ty {
with(|cx| cx.def_ty(self.def_id()))
}

/// Retrieve the type of this definition by instantiating and normalizing it with `args`.
///
/// This will panic if instantiation fails.
fn ty_with_args(&self, args: &GenericArgs) -> Ty {
with(|cx| cx.def_ty_with_args(self.def_id(), args))
}
}

macro_rules! crate_def {
( $(#[$attr:meta])*
$vis:vis $name:ident $(;)?
Expand All @@ -67,3 +84,21 @@ macro_rules! crate_def {
}
};
}

macro_rules! crate_def_with_ty {
( $(#[$attr:meta])*
$vis:vis $name:ident $(;)?
) => {
$(#[$attr])*
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
$vis struct $name(pub DefId);

impl CrateDef for $name {
fn def_id(&self) -> DefId {
self.0
}
}

impl CrateDefType for $name {}
};
}
8 changes: 5 additions & 3 deletions compiler/stable_mir/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ use std::fmt::Debug;
use std::io;

use crate::compiler_interface::with;
pub use crate::crate_def::CrateDef;
pub use crate::crate_def::DefId;
pub use crate::crate_def::{CrateDef, CrateDefType, DefId};
pub use crate::error::*;
use crate::mir::Body;
use crate::mir::Mutability;
Expand Down Expand Up @@ -115,12 +114,15 @@ pub enum CtorKind {

pub type Filename = String;

crate_def! {
crate_def_with_ty! {
/// Holds information about an item in a crate.
pub CrateItem;
}

impl CrateItem {
/// This will return the body of an item.
///
/// This will panic if no body is available.
pub fn body(&self) -> mir::Body {
with(|cx| cx.mir_body(self.0))
}
Expand Down
28 changes: 22 additions & 6 deletions compiler/stable_mir/src/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ use super::{
with, DefId, Error, Symbol,
};
use crate::abi::Layout;
use crate::crate_def::{CrateDef, CrateDefType};
use crate::mir::alloc::{read_target_int, read_target_uint, AllocId};
use crate::mir::mono::StaticDef;
use crate::target::MachineInfo;
use crate::{crate_def::CrateDef, mir::mono::StaticDef};
use crate::{Filename, Opaque};
use std::fmt::{self, Debug, Display, Formatter};
use std::ops::Range;
Expand Down Expand Up @@ -504,6 +505,15 @@ impl TyKind {
pub fn discriminant_ty(&self) -> Option<Ty> {
self.rigid().map(|ty| with(|cx| cx.rigid_ty_discriminant_ty(ty)))
}

/// Deconstruct a function type if this is one.
pub fn fn_def(&self) -> Option<(FnDef, &GenericArgs)> {
if let TyKind::RigidTy(RigidTy::FnDef(def, args)) = self {
Some((*def, args))
} else {
None
}
}
}

pub struct TypeAndMut {
Expand Down Expand Up @@ -629,7 +639,7 @@ impl ForeignModule {
}
}

crate_def! {
crate_def_with_ty! {
/// Hold information about a ForeignItem in a crate.
pub ForeignDef;
}
Expand All @@ -647,7 +657,7 @@ pub enum ForeignItemKind {
Type(Ty),
}

crate_def! {
crate_def_with_ty! {
/// Hold information about a function definition in a crate.
pub FnDef;
}
Expand All @@ -668,9 +678,15 @@ impl FnDef {
pub fn is_intrinsic(&self) -> bool {
self.as_intrinsic().is_some()
}

/// Get the function signature for this function definition.
pub fn fn_sig(&self) -> PolyFnSig {
let kind = self.ty().kind();
kind.fn_sig().unwrap()
}
}

crate_def! {
crate_def_with_ty! {
pub IntrinsicDef;
}

Expand Down Expand Up @@ -710,7 +726,7 @@ crate_def! {
pub BrNamedDef;
}

crate_def! {
crate_def_with_ty! {
pub AdtDef;
}

Expand Down Expand Up @@ -866,7 +882,7 @@ crate_def! {
pub GenericDef;
}

crate_def! {
crate_def_with_ty! {
pub ConstDef;
}

Expand Down
21 changes: 11 additions & 10 deletions library/core/src/iter/traits/iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2080,8 +2080,7 @@ pub trait Iterator {
fn try_collect<B>(&mut self) -> ChangeOutputType<Self::Item, B>
where
Self: Sized,
<Self as Iterator>::Item: Try,
<<Self as Iterator>::Item as Try>::Residual: Residual<B>,
Self::Item: Try<Residual: Residual<B>>,
B: FromIterator<<Self::Item as Try>::Output>,
{
try_process(ByRefSized(self), |i| i.collect())
Expand Down Expand Up @@ -2689,12 +2688,13 @@ pub trait Iterator {
#[inline]
#[unstable(feature = "iterator_try_reduce", reason = "new API", issue = "87053")]
#[rustc_do_not_const_check]
fn try_reduce<F, R>(&mut self, f: F) -> ChangeOutputType<R, Option<R::Output>>
fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> ChangeOutputType<R, Option<R::Output>>
where
Self: Sized,
F: FnMut(Self::Item, Self::Item) -> R,
R: Try<Output = Self::Item>,
R::Residual: Residual<Option<Self::Item>>,
R: Try<Output = Self::Item, Residual: Residual<Option<Self::Item>>>,
{
let first = match self.next() {
Some(i) => i,
Expand Down Expand Up @@ -2956,12 +2956,13 @@ pub trait Iterator {
#[inline]
#[unstable(feature = "try_find", reason = "new API", issue = "63178")]
#[rustc_do_not_const_check]
fn try_find<F, R>(&mut self, f: F) -> ChangeOutputType<R, Option<Self::Item>>
fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> ChangeOutputType<R, Option<Self::Item>>
where
Self: Sized,
F: FnMut(&Self::Item) -> R,
R: Try<Output = bool>,
R::Residual: Residual<Option<Self::Item>>,
R: Try<Output = bool, Residual: Residual<Option<Self::Item>>>,
{
#[inline]
fn check<I, V, R>(
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -672,7 +672,7 @@ impl<T> Option<T> {
/// ```
#[must_use]
#[inline]
#[unstable(feature = "is_none_or", issue = "none")]
#[unstable(feature = "is_none_or", issue = "126383")]
pub fn is_none_or(self, f: impl FnOnce(T) -> bool) -> bool {
match self {
None => true,
Expand Down
48 changes: 27 additions & 21 deletions src/tools/compiletest/src/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use crate::common::{Config, Debugger, FailMode, Mode, PassMode};
use crate::header::cfg::parse_cfg_name_directive;
use crate::header::cfg::MatchOutcome;
use crate::header::needs::CachedNeedsConditions;
use crate::util::static_regex;
use crate::{extract_cdb_version, extract_gdb_version};

mod cfg;
Expand Down Expand Up @@ -1186,11 +1187,11 @@ impl Config {
}
}

fn parse_custom_normalization(&self, mut line: &str, prefix: &str) -> Option<(String, String)> {
fn parse_custom_normalization(&self, line: &str, prefix: &str) -> Option<(String, String)> {
if parse_cfg_name_directive(self, line, prefix).outcome == MatchOutcome::Match {
let from = parse_normalization_string(&mut line)?;
let to = parse_normalization_string(&mut line)?;
Some((from, to))
let (regex, replacement) = parse_normalize_rule(line)
.unwrap_or_else(|| panic!("couldn't parse custom normalization rule: `{line}`"));
Some((regex, replacement))
} else {
None
}
Expand Down Expand Up @@ -1311,24 +1312,29 @@ fn expand_variables(mut value: String, config: &Config) -> String {
value
}

/// Finds the next quoted string `"..."` in `line`, and extract the content from it. Move the `line`
/// variable after the end of the quoted string.
///
/// # Examples
///
/// ```
/// let mut s = "normalize-stderr-32bit: \"something (32 bits)\" -> \"something ($WORD bits)\".";
/// let first = parse_normalization_string(&mut s);
/// assert_eq!(first, Some("something (32 bits)".to_owned()));
/// assert_eq!(s, " -> \"something ($WORD bits)\".");
/// Parses the regex and replacement values of a `//@ normalize-*` header,
/// in the format:
/// ```text
/// normalize-*: "REGEX" -> "REPLACEMENT"
/// ```
fn parse_normalization_string(line: &mut &str) -> Option<String> {
// FIXME support escapes in strings.
let begin = line.find('"')? + 1;
let end = line[begin..].find('"')? + begin;
let result = line[begin..end].to_owned();
*line = &line[end + 1..];
Some(result)
fn parse_normalize_rule(header: &str) -> Option<(String, String)> {
// FIXME(#126370): A colon after the header name should be mandatory, but
// currently is not, and there are many tests that lack the colon.
// FIXME: Support escaped double-quotes in strings.
let captures = static_regex!(
r#"(?x) # (verbose mode regex)
^
[^:\s]+:?\s* # (header name followed by optional colon)
"(?<regex>[^"]*)" # "REGEX"
\s+->\s+ # ->
"(?<replacement>[^"]*)" # "REPLACEMENT"
$
"#
)
.captures(header)?;
let regex = captures["regex"].to_owned();
let replacement = captures["replacement"].to_owned();
Some((regex, replacement))
}

pub fn extract_llvm_version(version: &str) -> Option<u32> {
Expand Down
Loading

0 comments on commit 9fdbfe1

Please sign in to comment.