Auto merge of #124547 - matthiaskrgr:rollup-9tv8upg, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #124519 (adapt a codegen test for llvm 19) - #124524 (Add StaticForeignItem and use it on ForeignItemKind) - #124540 (Give proof tree visitors the ability to instantiate nested goals directly) - #124543 (codegen tests: Tolerate `range()` qualifications in enum tests) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
f973a15a10
@ -3126,6 +3126,35 @@ pub struct StaticItem {
|
||||
pub expr: Option<P<Expr>>,
|
||||
}
|
||||
|
||||
/// A static item in `extern` block.
|
||||
// This struct is identical to StaticItem for now but it's going to have a safety attribute.
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub struct StaticForeignItem {
|
||||
pub ty: P<Ty>,
|
||||
pub mutability: Mutability,
|
||||
pub expr: Option<P<Expr>>,
|
||||
}
|
||||
|
||||
impl From<StaticItem> for StaticForeignItem {
|
||||
fn from(static_item: StaticItem) -> StaticForeignItem {
|
||||
StaticForeignItem {
|
||||
ty: static_item.ty,
|
||||
mutability: static_item.mutability,
|
||||
expr: static_item.expr,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<StaticForeignItem> for StaticItem {
|
||||
fn from(static_item: StaticForeignItem) -> StaticItem {
|
||||
StaticItem {
|
||||
ty: static_item.ty,
|
||||
mutability: static_item.mutability,
|
||||
expr: static_item.expr,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub struct ConstItem {
|
||||
pub defaultness: Defaultness,
|
||||
@ -3329,7 +3358,7 @@ fn try_from(item_kind: ItemKind) -> Result<AssocItemKind, ItemKind> {
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub enum ForeignItemKind {
|
||||
/// A foreign static item (`static FOO: u8`).
|
||||
Static(P<Ty>, Mutability, Option<P<Expr>>),
|
||||
Static(Box<StaticForeignItem>),
|
||||
/// An foreign function.
|
||||
Fn(Box<Fn>),
|
||||
/// An foreign type.
|
||||
@ -3341,8 +3370,8 @@ pub enum ForeignItemKind {
|
||||
impl From<ForeignItemKind> for ItemKind {
|
||||
fn from(foreign_item_kind: ForeignItemKind) -> ItemKind {
|
||||
match foreign_item_kind {
|
||||
ForeignItemKind::Static(a, b, c) => {
|
||||
ItemKind::Static(StaticItem { ty: a, mutability: b, expr: c }.into())
|
||||
ForeignItemKind::Static(box static_foreign_item) => {
|
||||
ItemKind::Static(Box::new(static_foreign_item.into()))
|
||||
}
|
||||
ForeignItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
|
||||
ForeignItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
|
||||
@ -3356,8 +3385,8 @@ impl TryFrom<ItemKind> for ForeignItemKind {
|
||||
|
||||
fn try_from(item_kind: ItemKind) -> Result<ForeignItemKind, ItemKind> {
|
||||
Ok(match item_kind {
|
||||
ItemKind::Static(box StaticItem { ty: a, mutability: b, expr: c }) => {
|
||||
ForeignItemKind::Static(a, b, c)
|
||||
ItemKind::Static(box static_item) => {
|
||||
ForeignItemKind::Static(Box::new(static_item.into()))
|
||||
}
|
||||
ItemKind::Fn(fn_kind) => ForeignItemKind::Fn(fn_kind),
|
||||
ItemKind::TyAlias(ty_alias_kind) => ForeignItemKind::TyAlias(ty_alias_kind),
|
||||
@ -3382,8 +3411,8 @@ mod size_asserts {
|
||||
static_assert_size!(Expr, 72);
|
||||
static_assert_size!(ExprKind, 40);
|
||||
static_assert_size!(Fn, 160);
|
||||
static_assert_size!(ForeignItem, 96);
|
||||
static_assert_size!(ForeignItemKind, 24);
|
||||
static_assert_size!(ForeignItem, 88);
|
||||
static_assert_size!(ForeignItemKind, 16);
|
||||
static_assert_size!(GenericArg, 24);
|
||||
static_assert_size!(GenericBound, 88);
|
||||
static_assert_size!(Generics, 40);
|
||||
|
@ -1261,7 +1261,7 @@ pub fn noop_flat_map_item<K: NoopVisitItemKind>(
|
||||
impl NoopVisitItemKind for ForeignItemKind {
|
||||
fn noop_visit(&mut self, visitor: &mut impl MutVisitor) {
|
||||
match self {
|
||||
ForeignItemKind::Static(ty, _, expr) => {
|
||||
ForeignItemKind::Static(box StaticForeignItem { ty, mutability: _, expr }) => {
|
||||
visitor.visit_ty(ty);
|
||||
visit_opt(expr, |expr| visitor.visit_expr(expr));
|
||||
}
|
||||
|
@ -642,7 +642,7 @@ fn walk<'a, V: Visitor<'a>>(
|
||||
) -> V::Result {
|
||||
let &Item { id, span, ident, ref vis, .. } = item;
|
||||
match self {
|
||||
ForeignItemKind::Static(ty, _, expr) => {
|
||||
ForeignItemKind::Static(box StaticForeignItem { ty, mutability: _, expr }) => {
|
||||
try_visit!(visitor.visit_ty(ty));
|
||||
visit_opt!(visitor, visit_expr, expr);
|
||||
}
|
||||
|
@ -662,10 +662,10 @@ fn lower_foreign_item(&mut self, i: &ForeignItem) -> &'hir hir::ForeignItem<'hir
|
||||
|
||||
hir::ForeignItemKind::Fn(fn_dec, fn_args, generics)
|
||||
}
|
||||
ForeignItemKind::Static(t, m, _) => {
|
||||
let ty =
|
||||
self.lower_ty(t, ImplTraitContext::Disallowed(ImplTraitPosition::StaticTy));
|
||||
hir::ForeignItemKind::Static(ty, *m)
|
||||
ForeignItemKind::Static(box StaticForeignItem { ty, mutability, expr: _ }) => {
|
||||
let ty = self
|
||||
.lower_ty(ty, ImplTraitContext::Disallowed(ImplTraitPosition::StaticTy));
|
||||
hir::ForeignItemKind::Static(ty, *mutability)
|
||||
}
|
||||
ForeignItemKind::TyAlias(..) => hir::ForeignItemKind::Type,
|
||||
ForeignItemKind::MacCall(_) => panic!("macro shouldn't exist here"),
|
||||
|
@ -1185,8 +1185,8 @@ fn visit_foreign_item(&mut self, fi: &'a ForeignItem) {
|
||||
self.check_foreign_ty_genericless(generics, where_clauses);
|
||||
self.check_foreign_item_ascii_only(fi.ident);
|
||||
}
|
||||
ForeignItemKind::Static(_, _, body) => {
|
||||
self.check_foreign_kind_bodyless(fi.ident, "static", body.as_ref().map(|b| b.span));
|
||||
ForeignItemKind::Static(box StaticForeignItem { ty: _, mutability: _, expr }) => {
|
||||
self.check_foreign_kind_bodyless(fi.ident, "static", expr.as_ref().map(|b| b.span));
|
||||
self.check_foreign_item_ascii_only(fi.ident);
|
||||
}
|
||||
ForeignItemKind::MacCall(..) => {}
|
||||
|
@ -30,15 +30,17 @@ fn print_foreign_item(&mut self, item: &ast::ForeignItem) {
|
||||
ast::ForeignItemKind::Fn(box ast::Fn { defaultness, sig, generics, body }) => {
|
||||
self.print_fn_full(sig, ident, generics, vis, *defaultness, body.as_deref(), attrs);
|
||||
}
|
||||
ast::ForeignItemKind::Static(ty, mutbl, body) => self.print_item_const(
|
||||
ast::ForeignItemKind::Static(box ast::StaticForeignItem { ty, mutability, expr }) => {
|
||||
self.print_item_const(
|
||||
ident,
|
||||
Some(*mutbl),
|
||||
Some(*mutability),
|
||||
&ast::Generics::default(),
|
||||
ty,
|
||||
body.as_deref(),
|
||||
expr.as_deref(),
|
||||
vis,
|
||||
ast::Defaultness::Final,
|
||||
),
|
||||
)
|
||||
}
|
||||
ast::ForeignItemKind::TyAlias(box ast::TyAlias {
|
||||
defaultness,
|
||||
generics,
|
||||
|
@ -60,14 +60,14 @@ pub struct GoalEvaluation<'tcx> {
|
||||
pub evaluation: CanonicalGoalEvaluation<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
#[derive(Eq, PartialEq, Debug)]
|
||||
pub struct CanonicalGoalEvaluation<'tcx> {
|
||||
pub goal: CanonicalInput<'tcx>,
|
||||
pub kind: CanonicalGoalEvaluationKind<'tcx>,
|
||||
pub result: QueryResult<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
#[derive(Eq, PartialEq, Debug)]
|
||||
pub enum CanonicalGoalEvaluationKind<'tcx> {
|
||||
Overflow,
|
||||
CycleInStack,
|
||||
@ -86,7 +86,7 @@ pub struct AddedGoalsEvaluation<'tcx> {
|
||||
pub result: Result<Certainty, NoSolution>,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq)]
|
||||
#[derive(Eq, PartialEq, Debug)]
|
||||
pub struct GoalEvaluationStep<'tcx> {
|
||||
pub instantiated_goal: QueryInput<'tcx, ty::Predicate<'tcx>>,
|
||||
|
||||
|
@ -1191,7 +1191,11 @@ pub fn parse_foreign_item(
|
||||
ident_span: ident.span,
|
||||
const_span,
|
||||
});
|
||||
ForeignItemKind::Static(ty, Mutability::Not, expr)
|
||||
ForeignItemKind::Static(Box::new(StaticForeignItem {
|
||||
ty,
|
||||
mutability: Mutability::Not,
|
||||
expr,
|
||||
}))
|
||||
}
|
||||
_ => return self.error_bad_item_kind(span, &kind, "`extern` blocks"),
|
||||
},
|
||||
|
@ -209,7 +209,7 @@ fn visit_use_tree(&mut self, use_tree: &'a UseTree, id: NodeId, _nested: bool) {
|
||||
|
||||
fn visit_foreign_item(&mut self, fi: &'a ForeignItem) {
|
||||
let def_kind = match fi.kind {
|
||||
ForeignItemKind::Static(_, mutability, _) => {
|
||||
ForeignItemKind::Static(box StaticForeignItem { ty: _, mutability, expr: _ }) => {
|
||||
DefKind::Static { mutability, nested: false }
|
||||
}
|
||||
ForeignItemKind::Fn(_) => DefKind::Fn,
|
||||
|
@ -34,9 +34,9 @@ pub struct InspectConfig {
|
||||
pub struct InspectGoal<'a, 'tcx> {
|
||||
infcx: &'a InferCtxt<'tcx>,
|
||||
depth: usize,
|
||||
orig_values: &'a [ty::GenericArg<'tcx>],
|
||||
orig_values: Vec<ty::GenericArg<'tcx>>,
|
||||
goal: Goal<'tcx, ty::Predicate<'tcx>>,
|
||||
evaluation: &'a inspect::GoalEvaluation<'tcx>,
|
||||
evaluation: inspect::CanonicalGoalEvaluation<'tcx>,
|
||||
}
|
||||
|
||||
pub struct InspectCandidate<'a, 'tcx> {
|
||||
@ -57,6 +57,10 @@ pub fn result(&self) -> Result<Certainty, NoSolution> {
|
||||
self.result.map(|c| c.value.certainty)
|
||||
}
|
||||
|
||||
pub fn goal(&self) -> &'a InspectGoal<'a, 'tcx> {
|
||||
self.goal
|
||||
}
|
||||
|
||||
/// Certainty passed into `evaluate_added_goals_and_make_canonical_response`.
|
||||
///
|
||||
/// If this certainty is `Yes`, then we must be confident that the candidate
|
||||
@ -74,46 +78,55 @@ pub fn shallow_certainty(&self) -> Certainty {
|
||||
/// the state of the `infcx`.
|
||||
pub fn visit_nested_no_probe<V: ProofTreeVisitor<'tcx>>(&self, visitor: &mut V) -> V::Result {
|
||||
if self.goal.depth < visitor.config().max_depth {
|
||||
for goal in self.instantiate_nested_goals(visitor.span()) {
|
||||
try_visit!(visitor.visit_goal(&goal));
|
||||
}
|
||||
}
|
||||
|
||||
V::Result::output()
|
||||
}
|
||||
|
||||
/// Instantiate the nested goals for the candidate without rolling back their
|
||||
/// inference constraints. This function modifies the state of the `infcx`.
|
||||
pub fn instantiate_nested_goals(&self, span: Span) -> Vec<InspectGoal<'a, 'tcx>> {
|
||||
let infcx = self.goal.infcx;
|
||||
let param_env = self.goal.goal.param_env;
|
||||
let mut orig_values = self.goal.orig_values.to_vec();
|
||||
let mut instantiated_goals = vec![];
|
||||
for goal in &self.nested_goals {
|
||||
let goal = canonical::instantiate_canonical_state(
|
||||
let instantiated_goals: Vec<_> = self
|
||||
.nested_goals
|
||||
.iter()
|
||||
.map(|goal| {
|
||||
canonical::instantiate_canonical_state(
|
||||
infcx,
|
||||
visitor.span(),
|
||||
span,
|
||||
param_env,
|
||||
&mut orig_values,
|
||||
*goal,
|
||||
);
|
||||
instantiated_goals.push(goal);
|
||||
}
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
let () = canonical::instantiate_canonical_state(
|
||||
infcx,
|
||||
visitor.span(),
|
||||
span,
|
||||
param_env,
|
||||
&mut orig_values,
|
||||
self.final_state,
|
||||
);
|
||||
|
||||
for &goal in &instantiated_goals {
|
||||
instantiated_goals
|
||||
.into_iter()
|
||||
.map(|goal| {
|
||||
let proof_tree = match goal.predicate.kind().no_bound_vars() {
|
||||
Some(ty::PredicateKind::NormalizesTo(ty::NormalizesTo { alias, term })) => {
|
||||
let unconstrained_term = match term.unpack() {
|
||||
ty::TermKind::Ty(_) => infcx
|
||||
.next_ty_var(TypeVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: visitor.span(),
|
||||
})
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span })
|
||||
.into(),
|
||||
ty::TermKind::Const(ct) => infcx
|
||||
.next_const_var(
|
||||
ct.ty(),
|
||||
ConstVariableOrigin {
|
||||
param_def_id: None,
|
||||
span: visitor.span(),
|
||||
},
|
||||
ConstVariableOrigin { param_def_id: None, span },
|
||||
)
|
||||
.into(),
|
||||
};
|
||||
@ -129,22 +142,16 @@ pub fn visit_nested_no_probe<V: ProofTreeVisitor<'tcx>>(&self, visitor: &mut V)
|
||||
})
|
||||
.1;
|
||||
let InferOk { value: (), obligations: _ } = infcx
|
||||
.at(&ObligationCause::dummy(), param_env)
|
||||
.at(&ObligationCause::dummy_with_span(span), param_env)
|
||||
.eq(DefineOpaqueTypes::Yes, term, unconstrained_term)
|
||||
.unwrap();
|
||||
proof_tree
|
||||
}
|
||||
_ => infcx.evaluate_root_goal(goal, GenerateProofTree::Yes).1,
|
||||
};
|
||||
try_visit!(visitor.visit_goal(&InspectGoal::new(
|
||||
infcx,
|
||||
self.goal.depth + 1,
|
||||
&proof_tree.unwrap(),
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
V::Result::output()
|
||||
InspectGoal::new(infcx, self.goal.depth + 1, proof_tree.unwrap())
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Visit all nested goals of this candidate, rolling back
|
||||
@ -164,7 +171,7 @@ pub fn goal(&self) -> Goal<'tcx, ty::Predicate<'tcx>> {
|
||||
}
|
||||
|
||||
pub fn result(&self) -> Result<Certainty, NoSolution> {
|
||||
self.evaluation.evaluation.result.map(|c| c.value.certainty)
|
||||
self.evaluation.result.map(|c| c.value.certainty)
|
||||
}
|
||||
|
||||
fn candidates_recur(
|
||||
@ -221,7 +228,7 @@ fn candidates_recur(
|
||||
|
||||
pub fn candidates(&'a self) -> Vec<InspectCandidate<'a, 'tcx>> {
|
||||
let mut candidates = vec![];
|
||||
let last_eval_step = match self.evaluation.evaluation.kind {
|
||||
let last_eval_step = match self.evaluation.kind {
|
||||
inspect::CanonicalGoalEvaluationKind::Overflow
|
||||
| inspect::CanonicalGoalEvaluationKind::CycleInStack
|
||||
| inspect::CanonicalGoalEvaluationKind::ProvisionalCacheHit => {
|
||||
@ -254,18 +261,15 @@ pub fn unique_applicable_candidate(&'a self) -> Option<InspectCandidate<'a, 'tcx
|
||||
candidates.pop().filter(|_| candidates.is_empty())
|
||||
}
|
||||
|
||||
fn new(
|
||||
infcx: &'a InferCtxt<'tcx>,
|
||||
depth: usize,
|
||||
root: &'a inspect::GoalEvaluation<'tcx>,
|
||||
) -> Self {
|
||||
match root.kind {
|
||||
inspect::GoalEvaluationKind::Root { ref orig_values } => InspectGoal {
|
||||
fn new(infcx: &'a InferCtxt<'tcx>, depth: usize, root: inspect::GoalEvaluation<'tcx>) -> Self {
|
||||
let inspect::GoalEvaluation { uncanonicalized_goal, kind, evaluation } = root;
|
||||
match kind {
|
||||
inspect::GoalEvaluationKind::Root { orig_values } => InspectGoal {
|
||||
infcx,
|
||||
depth,
|
||||
orig_values,
|
||||
goal: root.uncanonicalized_goal.fold_with(&mut EagerResolver::new(infcx)),
|
||||
evaluation: root,
|
||||
goal: uncanonicalized_goal.fold_with(&mut EagerResolver::new(infcx)),
|
||||
evaluation,
|
||||
},
|
||||
inspect::GoalEvaluationKind::Nested { .. } => unreachable!(),
|
||||
}
|
||||
@ -294,6 +298,6 @@ fn visit_proof_tree<V: ProofTreeVisitor<'tcx>>(
|
||||
) -> V::Result {
|
||||
let (_, proof_tree) = self.evaluate_root_goal(goal, GenerateProofTree::Yes);
|
||||
let proof_tree = proof_tree.unwrap();
|
||||
visitor.visit_goal(&InspectGoal::new(self, 0, &proof_tree))
|
||||
visitor.visit_goal(&InspectGoal::new(self, 0, proof_tree))
|
||||
}
|
||||
}
|
||||
|
@ -446,7 +446,18 @@ pub fn eq_item_kind(l: &ItemKind, r: &ItemKind) -> bool {
|
||||
pub fn eq_foreign_item_kind(l: &ForeignItemKind, r: &ForeignItemKind) -> bool {
|
||||
use ForeignItemKind::*;
|
||||
match (l, r) {
|
||||
(Static(lt, lm, le), Static(rt, rm, re)) => lm == rm && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
(
|
||||
Static(box StaticForeignItem {
|
||||
ty: lt,
|
||||
mutability: lm,
|
||||
expr: le,
|
||||
}),
|
||||
Static(box StaticForeignItem {
|
||||
ty: rt,
|
||||
mutability: rm,
|
||||
expr: re,
|
||||
}),
|
||||
) => lm == rm && eq_ty(lt, rt) && eq_expr_opt(le, re),
|
||||
(
|
||||
Fn(box ast::Fn {
|
||||
defaultness: ld,
|
||||
|
@ -3325,11 +3325,11 @@ fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String>
|
||||
.map(|(s, _, _)| format!("{};", s))
|
||||
}
|
||||
}
|
||||
ast::ForeignItemKind::Static(ref ty, mutability, _) => {
|
||||
ast::ForeignItemKind::Static(ref static_foreign_item) => {
|
||||
// FIXME(#21): we're dropping potential comments in between the
|
||||
// function kw here.
|
||||
let vis = format_visibility(context, &self.vis);
|
||||
let mut_str = format_mutability(mutability);
|
||||
let mut_str = format_mutability(static_foreign_item.mutability);
|
||||
let prefix = format!(
|
||||
"{}static {}{}:",
|
||||
vis,
|
||||
@ -3340,7 +3340,7 @@ fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String>
|
||||
rewrite_assign_rhs(
|
||||
context,
|
||||
prefix,
|
||||
&**ty,
|
||||
&static_foreign_item.ty,
|
||||
&RhsAssignKind::Ty,
|
||||
shape.sub_width(1)?,
|
||||
)
|
||||
|
@ -11,7 +11,7 @@ pub enum Enum0 {
|
||||
B,
|
||||
}
|
||||
|
||||
// CHECK: define noundef i8 @match0{{.*}}
|
||||
// CHECK: define noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match0{{.*}}
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: %1 = icmp eq i8 %0, 2
|
||||
// CHECK-NEXT: %2 = and i8 %0, 1
|
||||
@ -32,7 +32,7 @@ pub enum Enum1 {
|
||||
C,
|
||||
}
|
||||
|
||||
// CHECK: define noundef i8 @match1{{.*}}
|
||||
// CHECK: define noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match1{{.*}}
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: %1 = add i8 %0, -2
|
||||
// CHECK-NEXT: %2 = zext i8 %1 to i64
|
||||
@ -91,7 +91,7 @@ pub enum Enum2 {
|
||||
E,
|
||||
}
|
||||
|
||||
// CHECK: define noundef i8 @match2{{.*}}
|
||||
// CHECK: define noundef{{( range\(i8 [0-9]+, [0-9]+\))?}} i8 @match2{{.*}}
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: %1 = add i8 %0, 2
|
||||
// CHECK-NEXT: %2 = zext i8 %1 to i64
|
||||
|
@ -47,7 +47,7 @@ pub unsafe fn read_byte_assume_init(p: &MaybeUninit<u8>) -> u8 {
|
||||
p.assume_init_read()
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef i32 @copy_char(
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef {{(range\(.*\) )?}}i32 @copy_char(
|
||||
#[no_mangle]
|
||||
pub unsafe fn copy_char(p: *const char) -> char {
|
||||
// CHECK-NOT: load
|
||||
@ -58,7 +58,7 @@ pub unsafe fn copy_char(p: *const char) -> char {
|
||||
*p
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef i32 @read_char(
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef {{(range\(.*\) )?}}i32 @read_char(
|
||||
#[no_mangle]
|
||||
pub unsafe fn read_char(p: *const char) -> char {
|
||||
// CHECK-NOT: load
|
||||
@ -80,7 +80,7 @@ pub unsafe fn read_char_maybe_uninit(p: *const MaybeUninit<char>) -> MaybeUninit
|
||||
p.read()
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef i32 @read_char_assume_init(
|
||||
// CHECK-LABEL: define {{(dso_local )?}}noundef {{(range\(.*\) )?}}i32 @read_char_assume_init(
|
||||
#[no_mangle]
|
||||
pub unsafe fn read_char_assume_init(p: &MaybeUninit<char>) -> char {
|
||||
// CHECK-NOT: load
|
||||
|
@ -11,15 +11,15 @@ ast-stats-1 Attribute 64 ( 1.0%) 2 32
|
||||
ast-stats-1 - Normal 32 ( 0.5%) 1
|
||||
ast-stats-1 - DocComment 32 ( 0.5%) 1
|
||||
ast-stats-1 Local 80 ( 1.2%) 1 80
|
||||
ast-stats-1 Arm 96 ( 1.4%) 2 48
|
||||
ast-stats-1 ForeignItem 96 ( 1.4%) 1 96
|
||||
ast-stats-1 - Fn 96 ( 1.4%) 1
|
||||
ast-stats-1 ForeignItem 88 ( 1.3%) 1 88
|
||||
ast-stats-1 - Fn 88 ( 1.3%) 1
|
||||
ast-stats-1 Arm 96 ( 1.5%) 2 48
|
||||
ast-stats-1 FnDecl 120 ( 1.8%) 5 24
|
||||
ast-stats-1 FieldDef 160 ( 2.4%) 2 80
|
||||
ast-stats-1 Stmt 160 ( 2.4%) 5 32
|
||||
ast-stats-1 - Let 32 ( 0.5%) 1
|
||||
ast-stats-1 - MacCall 32 ( 0.5%) 1
|
||||
ast-stats-1 - Expr 96 ( 1.4%) 3
|
||||
ast-stats-1 - Expr 96 ( 1.5%) 3
|
||||
ast-stats-1 Param 160 ( 2.4%) 4 40
|
||||
ast-stats-1 Block 192 ( 2.9%) 6 32
|
||||
ast-stats-1 Variant 208 ( 3.1%) 2 104
|
||||
@ -28,7 +28,7 @@ ast-stats-1 - Trait 352 ( 5.3%) 4
|
||||
ast-stats-1 AssocItem 352 ( 5.3%) 4 88
|
||||
ast-stats-1 - Type 176 ( 2.7%) 2
|
||||
ast-stats-1 - Fn 176 ( 2.7%) 2
|
||||
ast-stats-1 GenericParam 480 ( 7.2%) 5 96
|
||||
ast-stats-1 GenericParam 480 ( 7.3%) 5 96
|
||||
ast-stats-1 Pat 504 ( 7.6%) 7 72
|
||||
ast-stats-1 - Struct 72 ( 1.1%) 1
|
||||
ast-stats-1 - Wild 72 ( 1.1%) 1
|
||||
@ -53,7 +53,7 @@ ast-stats-1 - Impl 136 ( 2.1%) 1
|
||||
ast-stats-1 - Fn 272 ( 4.1%) 2
|
||||
ast-stats-1 - Use 408 ( 6.2%) 3
|
||||
ast-stats-1 ----------------------------------------------------------------
|
||||
ast-stats-1 Total 6_624
|
||||
ast-stats-1 Total 6_616
|
||||
ast-stats-1
|
||||
ast-stats-2 POST EXPANSION AST STATS
|
||||
ast-stats-2 Name Accumulated Size Count Item Size
|
||||
@ -65,9 +65,9 @@ ast-stats-2 ExprField 48 ( 0.7%) 1 48
|
||||
ast-stats-2 WherePredicate 56 ( 0.8%) 1 56
|
||||
ast-stats-2 - BoundPredicate 56 ( 0.8%) 1
|
||||
ast-stats-2 Local 80 ( 1.1%) 1 80
|
||||
ast-stats-2 ForeignItem 88 ( 1.2%) 1 88
|
||||
ast-stats-2 - Fn 88 ( 1.2%) 1
|
||||
ast-stats-2 Arm 96 ( 1.3%) 2 48
|
||||
ast-stats-2 ForeignItem 96 ( 1.3%) 1 96
|
||||
ast-stats-2 - Fn 96 ( 1.3%) 1
|
||||
ast-stats-2 InlineAsm 120 ( 1.7%) 1 120
|
||||
ast-stats-2 FnDecl 120 ( 1.7%) 5 24
|
||||
ast-stats-2 Attribute 128 ( 1.8%) 4 32
|
||||
@ -86,7 +86,7 @@ ast-stats-2 - Trait 352 ( 4.9%) 4
|
||||
ast-stats-2 AssocItem 352 ( 4.9%) 4 88
|
||||
ast-stats-2 - Type 176 ( 2.4%) 2
|
||||
ast-stats-2 - Fn 176 ( 2.4%) 2
|
||||
ast-stats-2 GenericParam 480 ( 6.6%) 5 96
|
||||
ast-stats-2 GenericParam 480 ( 6.7%) 5 96
|
||||
ast-stats-2 Pat 504 ( 7.0%) 7 72
|
||||
ast-stats-2 - Struct 72 ( 1.0%) 1
|
||||
ast-stats-2 - Wild 72 ( 1.0%) 1
|
||||
@ -113,7 +113,7 @@ ast-stats-2 - Impl 136 ( 1.9%) 1
|
||||
ast-stats-2 - Fn 272 ( 3.8%) 2
|
||||
ast-stats-2 - Use 544 ( 7.5%) 4
|
||||
ast-stats-2 ----------------------------------------------------------------
|
||||
ast-stats-2 Total 7_224
|
||||
ast-stats-2 Total 7_216
|
||||
ast-stats-2
|
||||
hir-stats HIR STATS
|
||||
hir-stats Name Accumulated Size Count Item Size
|
||||
|
Loading…
Reference in New Issue
Block a user