提交 c4693bc9 编写于 作者: B bors

Auto merge of #99078 - Dylan-DPC:rollup-gnw6cli, r=Dylan-DPC

Rollup of 7 pull requests

Successful merges:

 - #98350 (Implement support for DWARF version 5.)
 - #98915 (Clarify deriving code)
 - #98980 (fix ICE in ConstProp)
 - #99008 (Adding suggestion for E0530)
 - #99043 (Collapse some weirdly-wrapping derives)
 - #99048 (Remove a string comparison about types)
 - #99070 (Update integer_atomics tracking issue)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
...@@ -80,7 +80,7 @@ pub fn expand_deriving_clone( ...@@ -80,7 +80,7 @@ pub fn expand_deriving_clone(
name: sym::clone, name: sym::clone,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: Vec::new(), nonself_args: Vec::new(),
ret_ty: Self_, ret_ty: Self_,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: false, unify_fieldless_variants: false,
...@@ -160,8 +160,8 @@ fn cs_clone( ...@@ -160,8 +160,8 @@ fn cs_clone(
let ctor_path; let ctor_path;
let all_fields; let all_fields;
let fn_path = cx.std_path(&[sym::clone, sym::Clone, sym::clone]); let fn_path = cx.std_path(&[sym::clone, sym::Clone, sym::clone]);
let subcall = |cx: &mut ExtCtxt<'_>, field: &FieldInfo<'_>| { let subcall = |cx: &mut ExtCtxt<'_>, field: &FieldInfo| {
let args = vec![cx.expr_addr_of(field.span, field.self_.clone())]; let args = vec![cx.expr_addr_of(field.span, field.self_expr.clone())];
cx.expr_call_global(field.span, fn_path.clone(), args) cx.expr_call_global(field.span, fn_path.clone(), args)
}; };
......
...@@ -32,7 +32,7 @@ pub fn expand_deriving_eq( ...@@ -32,7 +32,7 @@ pub fn expand_deriving_eq(
name: sym::assert_receiver_is_total_eq, name: sym::assert_receiver_is_total_eq,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![], nonself_args: vec![],
ret_ty: Unit, ret_ty: Unit,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
use crate::deriving::generic::*; use crate::deriving::generic::*;
use crate::deriving::path_std; use crate::deriving::path_std;
use rustc_ast::ptr::P; use rustc_ast::MetaItem;
use rustc_ast::{self as ast, MetaItem};
use rustc_expand::base::{Annotatable, ExtCtxt}; use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_span::symbol::{sym, Ident}; use rustc_span::symbol::{sym, Ident};
use rustc_span::Span; use rustc_span::Span;
...@@ -28,7 +27,7 @@ pub fn expand_deriving_ord( ...@@ -28,7 +27,7 @@ pub fn expand_deriving_ord(
name: sym::cmp, name: sym::cmp,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty: Path(path_std!(cmp::Ordering)), ret_ty: Path(path_std!(cmp::Ordering)),
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
...@@ -40,84 +39,54 @@ pub fn expand_deriving_ord( ...@@ -40,84 +39,54 @@ pub fn expand_deriving_ord(
trait_def.expand(cx, mitem, item, push) trait_def.expand(cx, mitem, item, push)
} }
pub fn ordering_collapsed(
cx: &mut ExtCtxt<'_>,
span: Span,
self_arg_tags: &[Ident],
) -> P<ast::Expr> {
let lft = cx.expr_addr_of(span, cx.expr_ident(span, self_arg_tags[0]));
let rgt = cx.expr_addr_of(span, cx.expr_ident(span, self_arg_tags[1]));
let fn_cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]);
cx.expr_call_global(span, fn_cmp_path, vec![lft, rgt])
}
pub fn cs_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOrExpr { pub fn cs_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOrExpr {
let test_id = Ident::new(sym::cmp, span); let test_id = Ident::new(sym::cmp, span);
let equals_path = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal])); let equal_path = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal]));
let cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]); let cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]);
// Builds: // Builds:
// //
// match ::std::cmp::Ord::cmp(&self_field1, &other_field1) { // match ::core::cmp::Ord::cmp(&self.x, &other.x) {
// ::std::cmp::Ordering::Equal => // ::std::cmp::Ordering::Equal =>
// match ::std::cmp::Ord::cmp(&self_field2, &other_field2) { // ::core::cmp::Ord::cmp(&self.y, &other.y),
// ::std::cmp::Ordering::Equal => { // cmp => cmp,
// ...
// } // }
// cmp => cmp
// },
// cmp => cmp
// }
//
let expr = cs_fold( let expr = cs_fold(
// foldr nests the if-elses correctly, leaving the first field // foldr nests the if-elses correctly, leaving the first field
// as the outermost one, and the last as the innermost. // as the outermost one, and the last as the innermost.
false, false,
|cx, span, old, self_f, other_fs| {
// match new {
// ::std::cmp::Ordering::Equal => old,
// cmp => cmp
// }
let new = {
let [other_f] = other_fs else {
cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`");
};
let args =
vec![cx.expr_addr_of(span, self_f), cx.expr_addr_of(span, other_f.clone())];
cx.expr_call_global(span, cmp_path.clone(), args)
};
let eq_arm = cx.arm(span, cx.pat_path(span, equals_path.clone()), old);
let neq_arm = cx.arm(span, cx.pat_ident(span, test_id), cx.expr_ident(span, test_id));
cx.expr_match(span, new, vec![eq_arm, neq_arm])
},
|cx, args| match args {
Some((span, self_f, other_fs)) => {
let new = {
let [other_f] = other_fs else {
cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`");
};
let args =
vec![cx.expr_addr_of(span, self_f), cx.expr_addr_of(span, other_f.clone())];
cx.expr_call_global(span, cmp_path.clone(), args)
};
new
}
None => cx.expr_path(equals_path.clone()),
},
Box::new(|cx, span, tag_tuple| {
if tag_tuple.len() != 2 {
cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`")
} else {
ordering_collapsed(cx, span, tag_tuple)
}
}),
cx, cx,
span, span,
substr, substr,
|cx, fold| match fold {
CsFold::Single(field) => {
let [other_expr] = &field.other_selflike_exprs[..] else {
cx.span_bug(field.span, "not exactly 2 arguments in `derive(Ord)`");
};
let args = vec![
cx.expr_addr_of(field.span, field.self_expr.clone()),
cx.expr_addr_of(field.span, other_expr.clone()),
];
cx.expr_call_global(field.span, cmp_path.clone(), args)
}
CsFold::Combine(span, expr1, expr2) => {
let eq_arm = cx.arm(span, cx.pat_path(span, equal_path.clone()), expr1);
let neq_arm =
cx.arm(span, cx.pat_ident(span, test_id), cx.expr_ident(span, test_id));
cx.expr_match(span, expr2, vec![eq_arm, neq_arm])
}
CsFold::Fieldless => cx.expr_path(equal_path.clone()),
CsFold::EnumNonMatching(span, tag_tuple) => {
if tag_tuple.len() != 2 {
cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`")
} else {
let lft = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[0]));
let rgt = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[1]));
let fn_cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]);
cx.expr_call_global(span, fn_cmp_path, vec![lft, rgt])
}
}
},
); );
BlockOrExpr::new_expr(expr) BlockOrExpr::new_expr(expr)
} }
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
use crate::deriving::generic::*; use crate::deriving::generic::*;
use crate::deriving::{path_local, path_std}; use crate::deriving::{path_local, path_std};
use rustc_ast::ptr::P; use rustc_ast::{BinOpKind, MetaItem};
use rustc_ast::{BinOpKind, Expr, MetaItem};
use rustc_expand::base::{Annotatable, ExtCtxt}; use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Span; use rustc_span::Span;
...@@ -23,33 +22,22 @@ fn cs_op( ...@@ -23,33 +22,22 @@ fn cs_op(
combiner: BinOpKind, combiner: BinOpKind,
base: bool, base: bool,
) -> BlockOrExpr { ) -> BlockOrExpr {
let op = |cx: &mut ExtCtxt<'_>, span: Span, self_f: P<Expr>, other_fs: &[P<Expr>]| {
let [other_f] = other_fs else {
cx.span_bug(span, "not exactly 2 arguments in `derive(PartialEq)`");
};
cx.expr_binary(span, op, self_f, other_f.clone())
};
let expr = cs_fold( let expr = cs_fold(
true, // use foldl true, // use foldl
|cx, span, subexpr, self_f, other_fs| {
let eq = op(cx, span, self_f, other_fs);
cx.expr_binary(span, combiner, subexpr, eq)
},
|cx, args| {
match args {
Some((span, self_f, other_fs)) => {
// Special-case the base case to generate cleaner code.
op(cx, span, self_f, other_fs)
}
None => cx.expr_bool(span, base),
}
},
Box::new(|cx, span, _| cx.expr_bool(span, !base)),
cx, cx,
span, span,
substr, substr,
|cx, fold| match fold {
CsFold::Single(field) => {
let [other_expr] = &field.other_selflike_exprs[..] else {
cx.span_bug(field.span, "not exactly 2 arguments in `derive(PartialEq)`");
};
cx.expr_binary(field.span, op, field.self_expr.clone(), other_expr.clone())
}
CsFold::Combine(span, expr1, expr2) => cx.expr_binary(span, combiner, expr1, expr2),
CsFold::Fieldless => cx.expr_bool(span, base),
CsFold::EnumNonMatching(span, _tag_tuple) => cx.expr_bool(span, !base),
},
); );
BlockOrExpr::new_expr(expr) BlockOrExpr::new_expr(expr)
} }
...@@ -69,7 +57,7 @@ fn cs_ne(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOr ...@@ -69,7 +57,7 @@ fn cs_ne(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOr
name: $name, name: $name,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty: Path(path_local!(bool)), ret_ty: Path(path_local!(bool)),
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
......
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
use crate::deriving::generic::*; use crate::deriving::generic::*;
use crate::deriving::{path_std, pathvec_std}; use crate::deriving::{path_std, pathvec_std};
use rustc_ast::ptr::P; use rustc_ast::MetaItem;
use rustc_ast::{Expr, MetaItem};
use rustc_expand::base::{Annotatable, ExtCtxt}; use rustc_expand::base::{Annotatable, ExtCtxt};
use rustc_span::symbol::{sym, Ident}; use rustc_span::symbol::{sym, Ident};
use rustc_span::Span; use rustc_span::Span;
...@@ -26,7 +25,7 @@ pub fn expand_deriving_partial_ord( ...@@ -26,7 +25,7 @@ pub fn expand_deriving_partial_ord(
name: sym::partial_cmp, name: sym::partial_cmp,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(self_ref(), sym::other)], nonself_args: vec![(self_ref(), sym::other)],
ret_ty, ret_ty,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: true, unify_fieldless_variants: true,
...@@ -50,79 +49,54 @@ pub fn expand_deriving_partial_ord( ...@@ -50,79 +49,54 @@ pub fn expand_deriving_partial_ord(
pub fn cs_partial_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOrExpr { pub fn cs_partial_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> BlockOrExpr {
let test_id = Ident::new(sym::cmp, span); let test_id = Ident::new(sym::cmp, span);
let ordering = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal])); let equal_path = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal]));
let ordering_expr = cx.expr_path(ordering.clone());
let partial_cmp_path = cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp]); let partial_cmp_path = cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp]);
// Builds: // Builds:
// //
// match ::std::cmp::PartialOrd::partial_cmp(&self_field1, &other_field1) { // match ::core::cmp::PartialOrd::partial_cmp(&self.x, &other.x) {
// ::std::option::Option::Some(::std::cmp::Ordering::Equal) => // ::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
// match ::std::cmp::PartialOrd::partial_cmp(&self_field2, &other_field2) { // ::core::cmp::PartialOrd::partial_cmp(&self.y, &other.y),
// ::std::option::Option::Some(::std::cmp::Ordering::Equal) => { // cmp => cmp,
// ...
// }
// cmp => cmp
// },
// cmp => cmp
// } // }
//
let expr = cs_fold( let expr = cs_fold(
// foldr nests the if-elses correctly, leaving the first field // foldr nests the if-elses correctly, leaving the first field
// as the outermost one, and the last as the innermost. // as the outermost one, and the last as the innermost.
false, false,
|cx, span, old, self_f, other_fs| {
// match new {
// Some(::std::cmp::Ordering::Equal) => old,
// cmp => cmp
// }
let new = {
let [other_f] = other_fs else {
cx.span_bug(span, "not exactly 2 arguments in `derive(PartialOrd)`");
};
let args =
vec![cx.expr_addr_of(span, self_f), cx.expr_addr_of(span, other_f.clone())];
cx.expr_call_global(span, partial_cmp_path.clone(), args)
};
let eq_arm = cx.arm(span, cx.pat_some(span, cx.pat_path(span, ordering.clone())), old);
let neq_arm = cx.arm(span, cx.pat_ident(span, test_id), cx.expr_ident(span, test_id));
cx.expr_match(span, new, vec![eq_arm, neq_arm])
},
|cx: &mut ExtCtxt<'_>, args: Option<(Span, P<Expr>, &[P<Expr>])>| match args {
Some((span, self_f, other_fs)) => {
let new = {
let [other_f] = other_fs else {
cx.span_bug(span, "not exactly 2 arguments in `derive(Ord)`");
};
let args =
vec![cx.expr_addr_of(span, self_f), cx.expr_addr_of(span, other_f.clone())];
cx.expr_call_global(span, partial_cmp_path.clone(), args)
};
new
}
None => cx.expr_some(span, ordering_expr.clone()),
},
Box::new(|cx, span, tag_tuple| {
if tag_tuple.len() != 2 {
cx.span_bug(span, "not exactly 2 arguments in `derive(PartialOrd)`")
} else {
let lft = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[0]));
let rgt = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[1]));
let fn_partial_cmp_path =
cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp]);
cx.expr_call_global(span, fn_partial_cmp_path, vec![lft, rgt])
}
}),
cx, cx,
span, span,
substr, substr,
|cx, fold| match fold {
CsFold::Single(field) => {
let [other_expr] = &field.other_selflike_exprs[..] else {
cx.span_bug(field.span, "not exactly 2 arguments in `derive(Ord)`");
};
let args = vec![
cx.expr_addr_of(field.span, field.self_expr.clone()),
cx.expr_addr_of(field.span, other_expr.clone()),
];
cx.expr_call_global(field.span, partial_cmp_path.clone(), args)
}
CsFold::Combine(span, expr1, expr2) => {
let eq_arm =
cx.arm(span, cx.pat_some(span, cx.pat_path(span, equal_path.clone())), expr1);
let neq_arm =
cx.arm(span, cx.pat_ident(span, test_id), cx.expr_ident(span, test_id));
cx.expr_match(span, expr2, vec![eq_arm, neq_arm])
}
CsFold::Fieldless => cx.expr_some(span, cx.expr_path(equal_path.clone())),
CsFold::EnumNonMatching(span, tag_tuple) => {
if tag_tuple.len() != 2 {
cx.span_bug(span, "not exactly 2 arguments in `derive(PartialOrd)`")
} else {
let lft = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[0]));
let rgt = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[1]));
let fn_partial_cmp_path =
cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp]);
cx.expr_call_global(span, fn_partial_cmp_path, vec![lft, rgt])
}
}
},
); );
BlockOrExpr::new_expr(expr) BlockOrExpr::new_expr(expr)
} }
...@@ -28,7 +28,7 @@ pub fn expand_deriving_debug( ...@@ -28,7 +28,7 @@ pub fn expand_deriving_debug(
name: sym::fmt, name: sym::fmt,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: true, explicit_self: true,
args: vec![(fmtr, sym::f)], nonself_args: vec![(fmtr, sym::f)],
ret_ty: Path(path_std!(fmt::Result)), ret_ty: Path(path_std!(fmt::Result)),
attributes: Vec::new(), attributes: Vec::new(),
unify_fieldless_variants: false, unify_fieldless_variants: false,
...@@ -53,7 +53,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> ...@@ -53,7 +53,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
// We want to make sure we have the ctxt set so that we can use unstable methods // We want to make sure we have the ctxt set so that we can use unstable methods
let span = cx.with_def_site_ctxt(span); let span = cx.with_def_site_ctxt(span);
let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked)); let name = cx.expr_lit(span, ast::LitKind::Str(ident.name, ast::StrStyle::Cooked));
let fmt = substr.nonself_args[0].clone(); let fmt = substr.nonselflike_args[0].clone();
// Struct and tuples are similar enough that we use the same code for both, // Struct and tuples are similar enough that we use the same code for both,
// with some extra pieces for structs due to the field names. // with some extra pieces for structs due to the field names.
...@@ -96,7 +96,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> ...@@ -96,7 +96,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
args.push(name); args.push(name);
} }
// Use double indirection to make sure this works for unsized types // Use double indirection to make sure this works for unsized types
let field = cx.expr_addr_of(field.span, field.self_.clone()); let field = cx.expr_addr_of(field.span, field.self_expr.clone());
let field = cx.expr_addr_of(field.span, field); let field = cx.expr_addr_of(field.span, field);
args.push(field); args.push(field);
} }
...@@ -116,7 +116,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> ...@@ -116,7 +116,7 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
} }
// Use double indirection to make sure this works for unsized types // Use double indirection to make sure this works for unsized types
let value_ref = cx.expr_addr_of(field.span, field.self_.clone()); let value_ref = cx.expr_addr_of(field.span, field.self_expr.clone());
value_exprs.push(cx.expr_addr_of(field.span, value_ref)); value_exprs.push(cx.expr_addr_of(field.span, value_ref));
} }
......
...@@ -36,7 +36,10 @@ pub fn expand_deriving_rustc_decodable( ...@@ -36,7 +36,10 @@ pub fn expand_deriving_rustc_decodable(
)], )],
}, },
explicit_self: false, explicit_self: false,
args: vec![(Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut), sym::d)], nonself_args: vec![(
Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut),
sym::d,
)],
ret_ty: Path(Path::new_( ret_ty: Path(Path::new_(
pathvec_std!(result::Result), pathvec_std!(result::Result),
vec![ vec![
...@@ -63,7 +66,7 @@ fn decodable_substructure( ...@@ -63,7 +66,7 @@ fn decodable_substructure(
substr: &Substructure<'_>, substr: &Substructure<'_>,
krate: Symbol, krate: Symbol,
) -> BlockOrExpr { ) -> BlockOrExpr {
let decoder = substr.nonself_args[0].clone(); let decoder = substr.nonselflike_args[0].clone();
let recurse = vec![ let recurse = vec![
Ident::new(krate, trait_span), Ident::new(krate, trait_span),
Ident::new(sym::Decodable, trait_span), Ident::new(sym::Decodable, trait_span),
......
...@@ -34,7 +34,7 @@ pub fn expand_deriving_default( ...@@ -34,7 +34,7 @@ pub fn expand_deriving_default(
name: kw::Default, name: kw::Default,
generics: Bounds::empty(), generics: Bounds::empty(),
explicit_self: false, explicit_self: false,
args: Vec::new(), nonself_args: Vec::new(),
ret_ty: Self_, ret_ty: Self_,
attributes: attrs, attributes: attrs,
unify_fieldless_variants: false, unify_fieldless_variants: false,
......
...@@ -120,7 +120,10 @@ pub fn expand_deriving_rustc_encodable( ...@@ -120,7 +120,10 @@ pub fn expand_deriving_rustc_encodable(
)], )],
}, },
explicit_self: true, explicit_self: true,
args: vec![(Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut), sym::s)], nonself_args: vec![(
Ref(Box::new(Path(Path::new_local(typaram))), Mutability::Mut),
sym::s,
)],
ret_ty: Path(Path::new_( ret_ty: Path(Path::new_(
pathvec_std!(result::Result), pathvec_std!(result::Result),
vec![ vec![
...@@ -147,7 +150,7 @@ fn encodable_substructure( ...@@ -147,7 +150,7 @@ fn encodable_substructure(
substr: &Substructure<'_>, substr: &Substructure<'_>,
krate: Symbol, krate: Symbol,
) -> BlockOrExpr { ) -> BlockOrExpr {
let encoder = substr.nonself_args[0].clone(); let encoder = substr.nonselflike_args[0].clone();
// throw an underscore in front to suppress unused variable warnings // throw an underscore in front to suppress unused variable warnings
let blkarg = Ident::new(sym::_e, trait_span); let blkarg = Ident::new(sym::_e, trait_span);
let blkencoder = cx.expr_ident(trait_span, blkarg); let blkencoder = cx.expr_ident(trait_span, blkarg);
...@@ -165,12 +168,12 @@ fn encodable_substructure( ...@@ -165,12 +168,12 @@ fn encodable_substructure(
let fn_emit_struct_field_path = let fn_emit_struct_field_path =
cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_struct_field]); cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_struct_field]);
let mut stmts = Vec::new(); let mut stmts = Vec::new();
for (i, &FieldInfo { name, ref self_, span, .. }) in fields.iter().enumerate() { for (i, &FieldInfo { name, ref self_expr, span, .. }) in fields.iter().enumerate() {
let name = match name { let name = match name {
Some(id) => id.name, Some(id) => id.name,
None => Symbol::intern(&format!("_field{}", i)), None => Symbol::intern(&format!("_field{}", i)),
}; };
let self_ref = cx.expr_addr_of(span, self_.clone()); let self_ref = cx.expr_addr_of(span, self_expr.clone());
let enc = cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]); let enc = cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]);
let lambda = cx.lambda1(span, enc, blkarg); let lambda = cx.lambda1(span, enc, blkarg);
let call = cx.expr_call_global( let call = cx.expr_call_global(
...@@ -234,8 +237,8 @@ fn encodable_substructure( ...@@ -234,8 +237,8 @@ fn encodable_substructure(
let mut stmts = Vec::new(); let mut stmts = Vec::new();
if !fields.is_empty() { if !fields.is_empty() {
let last = fields.len() - 1; let last = fields.len() - 1;
for (i, &FieldInfo { ref self_, span, .. }) in fields.iter().enumerate() { for (i, &FieldInfo { ref self_expr, span, .. }) in fields.iter().enumerate() {
let self_ref = cx.expr_addr_of(span, self_.clone()); let self_ref = cx.expr_addr_of(span, self_expr.clone());
let enc = let enc =
cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]); cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]);
let lambda = cx.lambda1(span, enc, blkarg); let lambda = cx.lambda1(span, enc, blkarg);
......
...@@ -30,7 +30,7 @@ pub fn expand_deriving_hash( ...@@ -30,7 +30,7 @@ pub fn expand_deriving_hash(
name: sym::hash, name: sym::hash,
generics: Bounds { bounds: vec![(typaram, vec![path_std!(hash::Hasher)])] }, generics: Bounds { bounds: vec![(typaram, vec![path_std!(hash::Hasher)])] },
explicit_self: true, explicit_self: true,
args: vec![(Ref(Box::new(Path(arg)), Mutability::Mut), sym::state)], nonself_args: vec![(Ref(Box::new(Path(arg)), Mutability::Mut), sym::state)],
ret_ty: Unit, ret_ty: Unit,
attributes: vec![], attributes: vec![],
unify_fieldless_variants: true, unify_fieldless_variants: true,
...@@ -49,7 +49,7 @@ fn hash_substructure( ...@@ -49,7 +49,7 @@ fn hash_substructure(
trait_span: Span, trait_span: Span,
substr: &Substructure<'_>, substr: &Substructure<'_>,
) -> BlockOrExpr { ) -> BlockOrExpr {
let [state_expr] = substr.nonself_args else { let [state_expr] = substr.nonselflike_args else {
cx.span_bug(trait_span, "incorrect number of arguments in `derive(Hash)`"); cx.span_bug(trait_span, "incorrect number of arguments in `derive(Hash)`");
}; };
let call_hash = |span, thing_expr| { let call_hash = |span, thing_expr| {
...@@ -82,7 +82,9 @@ fn hash_substructure( ...@@ -82,7 +82,9 @@ fn hash_substructure(
}; };
stmts.extend( stmts.extend(
fields.iter().map(|FieldInfo { ref self_, span, .. }| call_hash(*span, self_.clone())), fields
.iter()
.map(|FieldInfo { ref self_expr, span, .. }| call_hash(*span, self_expr.clone())),
); );
BlockOrExpr::new_stmts(stmts) BlockOrExpr::new_stmts(stmts)
} }
...@@ -19,7 +19,7 @@ index 092b7cf..158cf71 100644 ...@@ -19,7 +19,7 @@ index 092b7cf..158cf71 100644
#[stable(feature = "integer_atomics_stable", since = "1.34.0")] #[stable(feature = "integer_atomics_stable", since = "1.34.0")]
impl RefUnwindSafe for crate::sync::atomic::AtomicI64 {} impl RefUnwindSafe for crate::sync::atomic::AtomicI64 {}
-#[cfg(target_has_atomic_load_store = "128")] -#[cfg(target_has_atomic_load_store = "128")]
-#[unstable(feature = "integer_atomics", issue = "32976")] -#[unstable(feature = "integer_atomics", issue = "99069")]
-impl RefUnwindSafe for crate::sync::atomic::AtomicI128 {} -impl RefUnwindSafe for crate::sync::atomic::AtomicI128 {}
#[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_has_atomic_load_store = "ptr")]
...@@ -29,7 +29,7 @@ index 092b7cf..158cf71 100644 ...@@ -29,7 +29,7 @@ index 092b7cf..158cf71 100644
#[stable(feature = "integer_atomics_stable", since = "1.34.0")] #[stable(feature = "integer_atomics_stable", since = "1.34.0")]
impl RefUnwindSafe for crate::sync::atomic::AtomicU64 {} impl RefUnwindSafe for crate::sync::atomic::AtomicU64 {}
-#[cfg(target_has_atomic_load_store = "128")] -#[cfg(target_has_atomic_load_store = "128")]
-#[unstable(feature = "integer_atomics", issue = "32976")] -#[unstable(feature = "integer_atomics", issue = "99069")]
-impl RefUnwindSafe for crate::sync::atomic::AtomicU128 {} -impl RefUnwindSafe for crate::sync::atomic::AtomicU128 {}
#[cfg(target_has_atomic_load_store = "8")] #[cfg(target_has_atomic_load_store = "8")]
...@@ -46,14 +46,14 @@ index d9de37e..8293fce 100644 ...@@ -46,14 +46,14 @@ index d9de37e..8293fce 100644
-atomic_int! { -atomic_int! {
- cfg(target_has_atomic = "128"), - cfg(target_has_atomic = "128"),
- cfg(target_has_atomic_equal_alignment = "128"), - cfg(target_has_atomic_equal_alignment = "128"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), - rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- cfg_attr(not(test), rustc_diagnostic_item = "AtomicI128"), - cfg_attr(not(test), rustc_diagnostic_item = "AtomicI128"),
- "i128", - "i128",
- "#![feature(integer_atomics)]\n\n", - "#![feature(integer_atomics)]\n\n",
...@@ -66,14 +66,14 @@ index d9de37e..8293fce 100644 ...@@ -66,14 +66,14 @@ index d9de37e..8293fce 100644
-atomic_int! { -atomic_int! {
- cfg(target_has_atomic = "128"), - cfg(target_has_atomic = "128"),
- cfg(target_has_atomic_equal_alignment = "128"), - cfg(target_has_atomic_equal_alignment = "128"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), - rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
- unstable(feature = "integer_atomics", issue = "32976"), - unstable(feature = "integer_atomics", issue = "99069"),
- cfg_attr(not(test), rustc_diagnostic_item = "AtomicU128"), - cfg_attr(not(test), rustc_diagnostic_item = "AtomicU128"),
- "u128", - "u128",
- "#![feature(integer_atomics)]\n\n", - "#![feature(integer_atomics)]\n\n",
......
...@@ -103,14 +103,14 @@ pub fn finalize(&self, sess: &Session) { ...@@ -103,14 +103,14 @@ pub fn finalize(&self, sess: &Session) {
// for macOS to understand. For more info see #11352 // for macOS to understand. For more info see #11352
// This can be overridden using --llvm-opts -dwarf-version,N. // This can be overridden using --llvm-opts -dwarf-version,N.
// Android has the same issue (#22398) // Android has the same issue (#22398)
if let Some(version) = sess.target.dwarf_version { let dwarf_version =
llvm::LLVMRustAddModuleFlag( sess.opts.debugging_opts.dwarf_version.unwrap_or(sess.target.default_dwarf_version);
self.llmod, llvm::LLVMRustAddModuleFlag(
llvm::LLVMModFlagBehavior::Warning, self.llmod,
"Dwarf Version\0".as_ptr().cast(), llvm::LLVMModFlagBehavior::Warning,
version, "Dwarf Version\0".as_ptr().cast(),
) dwarf_version,
} );
// Indicate that we want CodeView debug information on MSVC // Indicate that we want CodeView debug information on MSVC
if sess.target.is_like_msvc { if sess.target.is_like_msvc {
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
use rustc_session::Limit; use rustc_session::Limit;
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
use rustc_target::abi::{Align, Size}; use rustc_target::abi::{Align, Size};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi as CallAbi;
use crate::interpret::{ use crate::interpret::{
self, compile_time_machine, AllocId, ConstAllocation, Frame, ImmTy, InterpCx, InterpResult, self, compile_time_machine, AllocId, ConstAllocation, Frame, ImmTy, InterpCx, InterpResult,
...@@ -263,7 +263,7 @@ fn load_mir( ...@@ -263,7 +263,7 @@ fn load_mir(
fn find_mir_or_eval_fn( fn find_mir_or_eval_fn(
ecx: &mut InterpCx<'mir, 'tcx, Self>, ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: ty::Instance<'tcx>, instance: ty::Instance<'tcx>,
_abi: Abi, _abi: CallAbi,
args: &[OpTy<'tcx>], args: &[OpTy<'tcx>],
_dest: &PlaceTy<'tcx>, _dest: &PlaceTy<'tcx>,
_ret: Option<mir::BasicBlock>, _ret: Option<mir::BasicBlock>,
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::def_id::DefId; use rustc_span::def_id::DefId;
use rustc_target::abi::Size; use rustc_target::abi::Size;
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi as CallAbi;
use super::{ use super::{
AllocId, AllocRange, Allocation, ConstAllocation, Frame, ImmTy, InterpCx, InterpResult, AllocId, AllocRange, Allocation, ConstAllocation, Frame, ImmTy, InterpCx, InterpResult,
...@@ -138,7 +138,7 @@ pub trait Machine<'mir, 'tcx>: Sized { ...@@ -138,7 +138,7 @@ pub trait Machine<'mir, 'tcx>: Sized {
/// Whether to enforce integers and floats not having provenance. /// Whether to enforce integers and floats not having provenance.
fn enforce_number_no_provenance(ecx: &InterpCx<'mir, 'tcx, Self>) -> bool; fn enforce_number_no_provenance(ecx: &InterpCx<'mir, 'tcx, Self>) -> bool;
/// Whether function calls should be [ABI](Abi)-checked. /// Whether function calls should be [ABI](CallAbi)-checked.
fn enforce_abi(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool { fn enforce_abi(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool {
true true
} }
...@@ -169,7 +169,7 @@ fn load_mir( ...@@ -169,7 +169,7 @@ fn load_mir(
fn find_mir_or_eval_fn( fn find_mir_or_eval_fn(
ecx: &mut InterpCx<'mir, 'tcx, Self>, ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: ty::Instance<'tcx>, instance: ty::Instance<'tcx>,
abi: Abi, abi: CallAbi,
args: &[OpTy<'tcx, Self::PointerTag>], args: &[OpTy<'tcx, Self::PointerTag>],
destination: &PlaceTy<'tcx, Self::PointerTag>, destination: &PlaceTy<'tcx, Self::PointerTag>,
target: Option<mir::BasicBlock>, target: Option<mir::BasicBlock>,
...@@ -181,7 +181,7 @@ fn find_mir_or_eval_fn( ...@@ -181,7 +181,7 @@ fn find_mir_or_eval_fn(
fn call_extra_fn( fn call_extra_fn(
ecx: &mut InterpCx<'mir, 'tcx, Self>, ecx: &mut InterpCx<'mir, 'tcx, Self>,
fn_val: Self::ExtraFnVal, fn_val: Self::ExtraFnVal,
abi: Abi, abi: CallAbi,
args: &[OpTy<'tcx, Self::PointerTag>], args: &[OpTy<'tcx, Self::PointerTag>],
destination: &PlaceTy<'tcx, Self::PointerTag>, destination: &PlaceTy<'tcx, Self::PointerTag>,
target: Option<mir::BasicBlock>, target: Option<mir::BasicBlock>,
...@@ -483,7 +483,7 @@ fn checked_binop_checks_overflow(_ecx: &InterpCx<$mir, $tcx, Self>) -> bool { ...@@ -483,7 +483,7 @@ fn checked_binop_checks_overflow(_ecx: &InterpCx<$mir, $tcx, Self>) -> bool {
fn call_extra_fn( fn call_extra_fn(
_ecx: &mut InterpCx<$mir, $tcx, Self>, _ecx: &mut InterpCx<$mir, $tcx, Self>,
fn_val: !, fn_val: !,
_abi: Abi, _abi: CallAbi,
_args: &[OpTy<$tcx>], _args: &[OpTy<$tcx>],
_destination: &PlaceTy<$tcx, Self::PointerTag>, _destination: &PlaceTy<$tcx, Self::PointerTag>,
_target: Option<mir::BasicBlock>, _target: Option<mir::BasicBlock>,
......
...@@ -78,6 +78,7 @@ pub fn new_dyn_trait( ...@@ -78,6 +78,7 @@ pub fn new_dyn_trait(
} }
#[inline] #[inline]
#[cfg_attr(debug_assertions, track_caller)] // only in debug builds due to perf (see #98980)
pub fn to_scalar_or_uninit(self) -> ScalarMaybeUninit<Tag> { pub fn to_scalar_or_uninit(self) -> ScalarMaybeUninit<Tag> {
match self { match self {
Immediate::Scalar(val) => val, Immediate::Scalar(val) => val,
...@@ -87,11 +88,13 @@ pub fn to_scalar_or_uninit(self) -> ScalarMaybeUninit<Tag> { ...@@ -87,11 +88,13 @@ pub fn to_scalar_or_uninit(self) -> ScalarMaybeUninit<Tag> {
} }
#[inline] #[inline]
#[cfg_attr(debug_assertions, track_caller)] // only in debug builds due to perf (see #98980)
pub fn to_scalar(self) -> InterpResult<'tcx, Scalar<Tag>> { pub fn to_scalar(self) -> InterpResult<'tcx, Scalar<Tag>> {
self.to_scalar_or_uninit().check_init() self.to_scalar_or_uninit().check_init()
} }
#[inline] #[inline]
#[cfg_attr(debug_assertions, track_caller)] // only in debug builds due to perf (see #98980)
pub fn to_scalar_or_uninit_pair(self) -> (ScalarMaybeUninit<Tag>, ScalarMaybeUninit<Tag>) { pub fn to_scalar_or_uninit_pair(self) -> (ScalarMaybeUninit<Tag>, ScalarMaybeUninit<Tag>) {
match self { match self {
Immediate::ScalarPair(val1, val2) => (val1, val2), Immediate::ScalarPair(val1, val2) => (val1, val2),
...@@ -101,6 +104,7 @@ pub fn to_scalar_or_uninit_pair(self) -> (ScalarMaybeUninit<Tag>, ScalarMaybeUni ...@@ -101,6 +104,7 @@ pub fn to_scalar_or_uninit_pair(self) -> (ScalarMaybeUninit<Tag>, ScalarMaybeUni
} }
#[inline] #[inline]
#[cfg_attr(debug_assertions, track_caller)] // only in debug builds due to perf (see #98980)
pub fn to_scalar_pair(self) -> InterpResult<'tcx, (Scalar<Tag>, Scalar<Tag>)> { pub fn to_scalar_pair(self) -> InterpResult<'tcx, (Scalar<Tag>, Scalar<Tag>)> {
let (val1, val2) = self.to_scalar_or_uninit_pair(); let (val1, val2) = self.to_scalar_or_uninit_pair();
Ok((val1.check_init()?, val2.check_init()?)) Ok((val1.check_init()?, val2.check_init()?))
......
...@@ -1438,18 +1438,8 @@ pub fn generator_kind(&self) -> Option<GeneratorKind> { ...@@ -1438,18 +1438,8 @@ pub fn generator_kind(&self) -> Option<GeneratorKind> {
} }
/// The type of source expression that caused this generator to be created. /// The type of source expression that caused this generator to be created.
#[derive( #[derive(Clone, PartialEq, PartialOrd, Eq, Hash, Debug, Copy)]
Clone, #[derive(HashStable_Generic, Encodable, Decodable)]
PartialEq,
PartialOrd,
Eq,
Hash,
HashStable_Generic,
Encodable,
Decodable,
Debug,
Copy
)]
pub enum GeneratorKind { pub enum GeneratorKind {
/// An explicit `async` block or the body of an async function. /// An explicit `async` block or the body of an async function.
Async(AsyncGeneratorKind), Async(AsyncGeneratorKind),
...@@ -1481,18 +1471,8 @@ pub fn descr(&self) -> &'static str { ...@@ -1481,18 +1471,8 @@ pub fn descr(&self) -> &'static str {
/// ///
/// This helps error messages but is also used to drive coercions in /// This helps error messages but is also used to drive coercions in
/// type-checking (see #60424). /// type-checking (see #60424).
#[derive( #[derive(Clone, PartialEq, PartialOrd, Eq, Hash, Debug, Copy)]
Clone, #[derive(HashStable_Generic, Encodable, Decodable)]
PartialEq,
PartialOrd,
Eq,
Hash,
HashStable_Generic,
Encodable,
Decodable,
Debug,
Copy
)]
pub enum AsyncGeneratorKind { pub enum AsyncGeneratorKind {
/// An explicit `async` block written by the user. /// An explicit `async` block written by the user.
Block, Block,
......
...@@ -733,6 +733,7 @@ fn test_debugging_options_tracking_hash() { ...@@ -733,6 +733,7 @@ fn test_debugging_options_tracking_hash() {
tracked!(dep_info_omit_d_target, true); tracked!(dep_info_omit_d_target, true);
tracked!(drop_tracking, true); tracked!(drop_tracking, true);
tracked!(dual_proc_macros, true); tracked!(dual_proc_macros, true);
tracked!(dwarf_version, Some(5));
tracked!(fewer_names, Some(true)); tracked!(fewer_names, Some(true));
tracked!(force_unstable_if_unmarked, true); tracked!(force_unstable_if_unmarked, true);
tracked!(fuel, Some(("abc".to_string(), 99))); tracked!(fuel, Some(("abc".to_string(), 99)));
......
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
self, ConstKind, EarlyBinder, Instance, ParamEnv, Ty, TyCtxt, TypeVisitable, self, ConstKind, EarlyBinder, Instance, ParamEnv, Ty, TyCtxt, TypeVisitable,
}; };
use rustc_span::{def_id::DefId, Span}; use rustc_span::{def_id::DefId, Span};
use rustc_target::abi::{HasDataLayout, Size, TargetDataLayout}; use rustc_target::abi::{self, HasDataLayout, Size, TargetDataLayout};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi as CallAbi;
use rustc_trait_selection::traits; use rustc_trait_selection::traits;
use crate::MirPass; use crate::MirPass;
...@@ -195,7 +195,7 @@ fn load_mir( ...@@ -195,7 +195,7 @@ fn load_mir(
fn find_mir_or_eval_fn( fn find_mir_or_eval_fn(
_ecx: &mut InterpCx<'mir, 'tcx, Self>, _ecx: &mut InterpCx<'mir, 'tcx, Self>,
_instance: ty::Instance<'tcx>, _instance: ty::Instance<'tcx>,
_abi: Abi, _abi: CallAbi,
_args: &[OpTy<'tcx>], _args: &[OpTy<'tcx>],
_destination: &PlaceTy<'tcx>, _destination: &PlaceTy<'tcx>,
_target: Option<BasicBlock>, _target: Option<BasicBlock>,
...@@ -659,6 +659,11 @@ fn eval_rvalue_with_identities( ...@@ -659,6 +659,11 @@ fn eval_rvalue_with_identities(
(Ok(_), Ok(_)) => return this.ecx.eval_rvalue_into_place(rvalue, place), (Ok(_), Ok(_)) => return this.ecx.eval_rvalue_into_place(rvalue, place),
}; };
if !matches!(const_arg.layout.abi, abi::Abi::Scalar(..)) {
// We cannot handle Scalar Pair stuff.
return this.ecx.eval_rvalue_into_place(rvalue, place);
}
let arg_value = const_arg.to_scalar()?.to_bits(const_arg.layout.size)?; let arg_value = const_arg.to_scalar()?.to_bits(const_arg.layout.size)?;
let dest = this.ecx.eval_place(place)?; let dest = this.ecx.eval_place(place)?;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
use rustc_session::lint; use rustc_session::lint;
use rustc_span::{def_id::DefId, Span}; use rustc_span::{def_id::DefId, Span};
use rustc_target::abi::{HasDataLayout, Size, TargetDataLayout}; use rustc_target::abi::{HasDataLayout, Size, TargetDataLayout};
use rustc_target::spec::abi::Abi; use rustc_target::spec::abi::Abi as CallAbi;
use rustc_trait_selection::traits; use rustc_trait_selection::traits;
use crate::MirLint; use crate::MirLint;
...@@ -191,7 +191,7 @@ fn load_mir( ...@@ -191,7 +191,7 @@ fn load_mir(
fn find_mir_or_eval_fn( fn find_mir_or_eval_fn(
_ecx: &mut InterpCx<'mir, 'tcx, Self>, _ecx: &mut InterpCx<'mir, 'tcx, Self>,
_instance: ty::Instance<'tcx>, _instance: ty::Instance<'tcx>,
_abi: Abi, _abi: CallAbi,
_args: &[OpTy<'tcx>], _args: &[OpTy<'tcx>],
_destination: &PlaceTy<'tcx>, _destination: &PlaceTy<'tcx>,
_target: Option<BasicBlock>, _target: Option<BasicBlock>,
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
use tracing::debug; use tracing::debug;
use crate::imports::{Import, ImportKind, ImportResolver}; use crate::imports::{Import, ImportKind, ImportResolver};
use crate::late::Rib; use crate::late::{PatternSource, Rib};
use crate::path_names_to_string; use crate::path_names_to_string;
use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BindingError, Finalize}; use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BindingError, Finalize};
use crate::{HasGenericParams, MacroRulesScope, Module, ModuleKind, ModuleOrUniformRoot}; use crate::{HasGenericParams, MacroRulesScope, Module, ModuleKind, ModuleOrUniformRoot};
...@@ -896,25 +896,40 @@ pub(crate) fn into_struct_error( ...@@ -896,25 +896,40 @@ pub(crate) fn into_struct_error(
err err
} }
ResolutionError::BindingShadowsSomethingUnacceptable { ResolutionError::BindingShadowsSomethingUnacceptable {
shadowing_binding_descr, shadowing_binding,
name, name,
participle, participle,
article, article,
shadowed_binding_descr, shadowed_binding,
shadowed_binding_span, shadowed_binding_span,
} => { } => {
let shadowed_binding_descr = shadowed_binding.descr();
let mut err = struct_span_err!( let mut err = struct_span_err!(
self.session, self.session,
span, span,
E0530, E0530,
"{}s cannot shadow {}s", "{}s cannot shadow {}s",
shadowing_binding_descr, shadowing_binding.descr(),
shadowed_binding_descr, shadowed_binding_descr,
); );
err.span_label( err.span_label(
span, span,
format!("cannot be named the same as {} {}", article, shadowed_binding_descr), format!("cannot be named the same as {} {}", article, shadowed_binding_descr),
); );
match (shadowing_binding, shadowed_binding) {
(
PatternSource::Match,
Res::Def(DefKind::Ctor(CtorOf::Variant | CtorOf::Struct, CtorKind::Fn), _),
) => {
err.span_suggestion(
span,
"try specify the pattern arguments",
format!("{}(..)", name),
Applicability::Unspecified,
);
}
_ => (),
}
let msg = let msg =
format!("the {} `{}` is {} here", shadowed_binding_descr, name, participle); format!("the {} `{}` is {} here", shadowed_binding_descr, name, participle);
err.span_label(shadowed_binding_span, msg); err.span_label(shadowed_binding_span, msg);
......
...@@ -50,7 +50,7 @@ struct BindingInfo { ...@@ -50,7 +50,7 @@ struct BindingInfo {
} }
#[derive(Copy, Clone, PartialEq, Eq, Debug)] #[derive(Copy, Clone, PartialEq, Eq, Debug)]
enum PatternSource { pub enum PatternSource {
Match, Match,
Let, Let,
For, For,
...@@ -64,7 +64,7 @@ enum IsRepeatExpr { ...@@ -64,7 +64,7 @@ enum IsRepeatExpr {
} }
impl PatternSource { impl PatternSource {
fn descr(self) -> &'static str { pub fn descr(self) -> &'static str {
match self { match self {
PatternSource::Match => "match binding", PatternSource::Match => "match binding",
PatternSource::Let => "let binding", PatternSource::Let => "let binding",
...@@ -2845,11 +2845,11 @@ fn try_resolve_as_non_binding( ...@@ -2845,11 +2845,11 @@ fn try_resolve_as_non_binding(
self.report_error( self.report_error(
ident.span, ident.span,
ResolutionError::BindingShadowsSomethingUnacceptable { ResolutionError::BindingShadowsSomethingUnacceptable {
shadowing_binding_descr: pat_src.descr(), shadowing_binding: pat_src,
name: ident.name, name: ident.name,
participle: if binding.is_import() { "imported" } else { "defined" }, participle: if binding.is_import() { "imported" } else { "defined" },
article: binding.res().article(), article: binding.res().article(),
shadowed_binding_descr: binding.res().descr(), shadowed_binding: binding.res(),
shadowed_binding_span: binding.span, shadowed_binding_span: binding.span,
}, },
); );
...@@ -2861,11 +2861,11 @@ fn try_resolve_as_non_binding( ...@@ -2861,11 +2861,11 @@ fn try_resolve_as_non_binding(
self.report_error( self.report_error(
ident.span, ident.span,
ResolutionError::BindingShadowsSomethingUnacceptable { ResolutionError::BindingShadowsSomethingUnacceptable {
shadowing_binding_descr: pat_src.descr(), shadowing_binding: pat_src,
name: ident.name, name: ident.name,
participle: "defined", participle: "defined",
article: res.article(), article: res.article(),
shadowed_binding_descr: res.descr(), shadowed_binding: res,
shadowed_binding_span: self.r.opt_span(def_id).expect("const parameter defined outside of local crate"), shadowed_binding_span: self.r.opt_span(def_id).expect("const parameter defined outside of local crate"),
} }
); );
......
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
use diagnostics::{ImportSuggestion, LabelSuggestion, Suggestion}; use diagnostics::{ImportSuggestion, LabelSuggestion, Suggestion};
use imports::{Import, ImportKind, ImportResolver, NameResolution}; use imports::{Import, ImportKind, ImportResolver, NameResolution};
use late::{HasGenericParams, PathSource}; use late::{HasGenericParams, PathSource, PatternSource};
use macros::{MacroRulesBinding, MacroRulesScope, MacroRulesScopeRef}; use macros::{MacroRulesBinding, MacroRulesScope, MacroRulesScopeRef};
use crate::access_levels::AccessLevelsVisitor; use crate::access_levels::AccessLevelsVisitor;
...@@ -230,11 +230,11 @@ enum ResolutionError<'a> { ...@@ -230,11 +230,11 @@ enum ResolutionError<'a> {
), ),
/// Error E0530: `X` bindings cannot shadow `Y`s. /// Error E0530: `X` bindings cannot shadow `Y`s.
BindingShadowsSomethingUnacceptable { BindingShadowsSomethingUnacceptable {
shadowing_binding_descr: &'static str, shadowing_binding: PatternSource,
name: Symbol, name: Symbol,
participle: &'static str, participle: &'static str,
article: &'static str, article: &'static str,
shadowed_binding_descr: &'static str, shadowed_binding: Res,
shadowed_binding_span: Span, shadowed_binding_span: Span,
}, },
/// Error E0128: generic parameters with a default cannot use forward-declared identifiers. /// Error E0128: generic parameters with a default cannot use forward-declared identifiers.
......
...@@ -1272,6 +1272,8 @@ pub(crate) fn parse_branch_protection( ...@@ -1272,6 +1272,8 @@ pub(crate) fn parse_branch_protection(
computed `block` spans (one span encompassing a block's terminator and \ computed `block` spans (one span encompassing a block's terminator and \
all statements). If `-Z instrument-coverage` is also enabled, create \ all statements). If `-Z instrument-coverage` is also enabled, create \
an additional `.html` file showing the computed coverage spans."), an additional `.html` file showing the computed coverage spans."),
dwarf_version: Option<u32> = (None, parse_opt_number, [TRACKED],
"version of DWARF debug information to emit (default: 2 or 4, depending on platform)"),
emit_stack_sizes: bool = (false, parse_bool, [UNTRACKED], emit_stack_sizes: bool = (false, parse_bool, [UNTRACKED],
"emit a section containing stack size metadata (default: no)"), "emit a section containing stack size metadata (default: no)"),
fewer_names: Option<bool> = (None, parse_opt_bool, [TRACKED], fewer_names: Option<bool> = (None, parse_opt_bool, [TRACKED],
......
...@@ -1498,6 +1498,12 @@ fn validate_commandline_args_with_session_available(sess: &Session) { ...@@ -1498,6 +1498,12 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
)) ))
} }
} }
if let Some(dwarf_version) = sess.opts.debugging_opts.dwarf_version {
if dwarf_version > 5 {
sess.err(&format!("requested DWARF version {} is greater than 5", dwarf_version));
}
}
} }
/// Holds data on the current incremental compilation session, if there is one. /// Holds data on the current incremental compilation session, if there is one.
......
...@@ -244,18 +244,8 @@ fn from_str(s: &str) -> Result<InlineAsmArch, ()> { ...@@ -244,18 +244,8 @@ fn from_str(s: &str) -> Result<InlineAsmArch, ()> {
} }
} }
#[derive( #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Hash)]
Copy, #[derive(HashStable_Generic, Encodable, Decodable)]
Clone,
Encodable,
Decodable,
Debug,
Eq,
PartialEq,
PartialOrd,
Hash,
HashStable_Generic
)]
pub enum InlineAsmReg { pub enum InlineAsmReg {
X86(X86InlineAsmReg), X86(X86InlineAsmReg),
Arm(ArmInlineAsmReg), Arm(ArmInlineAsmReg),
...@@ -406,18 +396,8 @@ pub fn overlapping_regs(self, mut cb: impl FnMut(InlineAsmReg)) { ...@@ -406,18 +396,8 @@ pub fn overlapping_regs(self, mut cb: impl FnMut(InlineAsmReg)) {
} }
} }
#[derive( #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Hash)]
Copy, #[derive(HashStable_Generic, Encodable, Decodable)]
Clone,
Encodable,
Decodable,
Debug,
Eq,
PartialEq,
PartialOrd,
Hash,
HashStable_Generic
)]
pub enum InlineAsmRegClass { pub enum InlineAsmRegClass {
X86(X86InlineAsmRegClass), X86(X86InlineAsmRegClass),
Arm(ArmInlineAsmRegClass), Arm(ArmInlineAsmRegClass),
...@@ -620,18 +600,8 @@ pub fn is_clobber_only(self, arch: InlineAsmArch) -> bool { ...@@ -620,18 +600,8 @@ pub fn is_clobber_only(self, arch: InlineAsmArch) -> bool {
} }
} }
#[derive( #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Hash)]
Copy, #[derive(HashStable_Generic, Encodable, Decodable)]
Clone,
Encodable,
Decodable,
Debug,
Eq,
PartialEq,
PartialOrd,
Hash,
HashStable_Generic
)]
pub enum InlineAsmRegOrRegClass { pub enum InlineAsmRegOrRegClass {
Reg(InlineAsmReg), Reg(InlineAsmReg),
RegClass(InlineAsmRegClass), RegClass(InlineAsmRegClass),
...@@ -808,18 +778,8 @@ pub fn allocatable_registers( ...@@ -808,18 +778,8 @@ pub fn allocatable_registers(
} }
} }
#[derive( #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Hash)]
Copy, #[derive(HashStable_Generic, Encodable, Decodable)]
Clone,
Encodable,
Decodable,
Debug,
Eq,
PartialEq,
PartialOrd,
Hash,
HashStable_Generic
)]
pub enum InlineAsmClobberAbi { pub enum InlineAsmClobberAbi {
X86, X86,
X86_64Win, X86_64Win,
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
pub fn opts() -> TargetOptions { pub fn opts() -> TargetOptions {
let mut base = super::linux_base::opts(); let mut base = super::linux_base::opts();
base.os = "android".into(); base.os = "android".into();
base.dwarf_version = Some(2); base.default_dwarf_version = 2;
base.position_independent_executables = true; base.position_independent_executables = true;
base.has_thread_local = false; base.has_thread_local = false;
// This is for backward compatibility, see https://github.com/rust-lang/rust/issues/49867 // This is for backward compatibility, see https://github.com/rust-lang/rust/issues/49867
......
...@@ -28,7 +28,7 @@ pub fn opts(os: &'static str) -> TargetOptions { ...@@ -28,7 +28,7 @@ pub fn opts(os: &'static str) -> TargetOptions {
executables: true, executables: true,
families: cvs!["unix"], families: cvs!["unix"],
is_like_osx: true, is_like_osx: true,
dwarf_version: Some(2), default_dwarf_version: 2,
frame_pointer: FramePointer::Always, frame_pointer: FramePointer::Always,
has_rpath: true, has_rpath: true,
dll_suffix: ".dylib".into(), dll_suffix: ".dylib".into(),
......
...@@ -9,7 +9,7 @@ pub fn opts() -> TargetOptions { ...@@ -9,7 +9,7 @@ pub fn opts() -> TargetOptions {
has_rpath: true, has_rpath: true,
position_independent_executables: true, position_independent_executables: true,
relro_level: RelroLevel::Full, relro_level: RelroLevel::Full,
dwarf_version: Some(2), default_dwarf_version: 2,
..Default::default() ..Default::default()
} }
} }
...@@ -10,7 +10,7 @@ pub fn opts() -> TargetOptions { ...@@ -10,7 +10,7 @@ pub fn opts() -> TargetOptions {
position_independent_executables: true, position_independent_executables: true,
relro_level: RelroLevel::Full, relro_level: RelroLevel::Full,
abi_return_struct_as_int: true, abi_return_struct_as_int: true,
dwarf_version: Some(2), default_dwarf_version: 2,
..Default::default() ..Default::default()
} }
} }
...@@ -1275,9 +1275,9 @@ pub struct TargetOptions { ...@@ -1275,9 +1275,9 @@ pub struct TargetOptions {
pub is_like_msvc: bool, pub is_like_msvc: bool,
/// Whether a target toolchain is like WASM. /// Whether a target toolchain is like WASM.
pub is_like_wasm: bool, pub is_like_wasm: bool,
/// Version of DWARF to use if not using the default. /// Default supported version of DWARF on this platform.
/// Useful because some platforms (osx, bsd) only want up to DWARF2. /// Useful because some platforms (osx, bsd) only want up to DWARF2.
pub dwarf_version: Option<u32>, pub default_dwarf_version: u32,
/// Whether the linker support GNU-like arguments such as -O. Defaults to true. /// Whether the linker support GNU-like arguments such as -O. Defaults to true.
pub linker_is_gnu: bool, pub linker_is_gnu: bool,
/// The MinGW toolchain has a known issue that prevents it from correctly /// The MinGW toolchain has a known issue that prevents it from correctly
...@@ -1539,7 +1539,7 @@ fn default() -> TargetOptions { ...@@ -1539,7 +1539,7 @@ fn default() -> TargetOptions {
is_like_windows: false, is_like_windows: false,
is_like_msvc: false, is_like_msvc: false,
is_like_wasm: false, is_like_wasm: false,
dwarf_version: None, default_dwarf_version: 4,
linker_is_gnu: true, linker_is_gnu: true,
allows_weak_linkage: true, allows_weak_linkage: true,
has_rpath: false, has_rpath: false,
...@@ -1778,13 +1778,13 @@ pub fn from_json(obj: Json) -> Result<(Target, TargetWarnings), String> { ...@@ -1778,13 +1778,13 @@ pub fn from_json(obj: Json) -> Result<(Target, TargetWarnings), String> {
base.$key_name = s; base.$key_name = s;
} }
} ); } );
($key_name:ident, Option<u32>) => ( { ($key_name:ident, u32) => ( {
let name = (stringify!($key_name)).replace("_", "-"); let name = (stringify!($key_name)).replace("_", "-");
if let Some(s) = obj.remove(&name).and_then(|b| b.as_u64()) { if let Some(s) = obj.remove(&name).and_then(|b| b.as_u64()) {
if s < 1 || s > 5 { if s < 1 || s > 5 {
return Err("Not a valid DWARF version number".into()); return Err("Not a valid DWARF version number".into());
} }
base.$key_name = Some(s as u32); base.$key_name = s as u32;
} }
} ); } );
($key_name:ident, Option<u64>) => ( { ($key_name:ident, Option<u64>) => ( {
...@@ -2143,7 +2143,7 @@ pub fn from_json(obj: Json) -> Result<(Target, TargetWarnings), String> { ...@@ -2143,7 +2143,7 @@ pub fn from_json(obj: Json) -> Result<(Target, TargetWarnings), String> {
key!(is_like_windows, bool); key!(is_like_windows, bool);
key!(is_like_msvc, bool); key!(is_like_msvc, bool);
key!(is_like_wasm, bool); key!(is_like_wasm, bool);
key!(dwarf_version, Option<u32>); key!(default_dwarf_version, u32);
key!(linker_is_gnu, bool); key!(linker_is_gnu, bool);
key!(allows_weak_linkage, bool); key!(allows_weak_linkage, bool);
key!(has_rpath, bool); key!(has_rpath, bool);
...@@ -2387,7 +2387,7 @@ fn to_json(&self) -> Json { ...@@ -2387,7 +2387,7 @@ fn to_json(&self) -> Json {
target_option_val!(is_like_windows); target_option_val!(is_like_windows);
target_option_val!(is_like_msvc); target_option_val!(is_like_msvc);
target_option_val!(is_like_wasm); target_option_val!(is_like_wasm);
target_option_val!(dwarf_version); target_option_val!(default_dwarf_version);
target_option_val!(linker_is_gnu); target_option_val!(linker_is_gnu);
target_option_val!(allows_weak_linkage); target_option_val!(allows_weak_linkage);
target_option_val!(has_rpath); target_option_val!(has_rpath);
......
...@@ -11,7 +11,7 @@ pub fn opts() -> TargetOptions { ...@@ -11,7 +11,7 @@ pub fn opts() -> TargetOptions {
position_independent_executables: true, position_independent_executables: true,
relro_level: RelroLevel::Full, relro_level: RelroLevel::Full,
use_ctors_section: true, use_ctors_section: true,
dwarf_version: Some(2), default_dwarf_version: 2,
..Default::default() ..Default::default()
} }
} }
...@@ -11,7 +11,7 @@ pub fn opts() -> TargetOptions { ...@@ -11,7 +11,7 @@ pub fn opts() -> TargetOptions {
position_independent_executables: true, position_independent_executables: true,
frame_pointer: FramePointer::Always, // FIXME 43575: should be MayOmit... frame_pointer: FramePointer::Always, // FIXME 43575: should be MayOmit...
relro_level: RelroLevel::Full, relro_level: RelroLevel::Full,
dwarf_version: Some(2), default_dwarf_version: 2,
..Default::default() ..Default::default()
} }
} }
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
use rustc_infer::infer::{self, TyCtxtInferExt}; use rustc_infer::infer::{self, TyCtxtInferExt};
use rustc_infer::traits; use rustc_infer::traits;
use rustc_middle::lint::in_external_macro; use rustc_middle::lint::in_external_macro;
use rustc_middle::ty::subst::GenericArgKind;
use rustc_middle::ty::{self, Binder, IsSuggestable, Subst, ToPredicate, Ty}; use rustc_middle::ty::{self, Binder, IsSuggestable, Subst, ToPredicate, Ty};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Span; use rustc_span::Span;
...@@ -238,25 +237,29 @@ pub fn suggest_deref_ref_or_into( ...@@ -238,25 +237,29 @@ pub fn suggest_deref_ref_or_into(
); );
} }
} }
} else if found.to_string().starts_with("Option<") } else if let ty::Adt(found_adt, found_substs) = found.kind()
&& expected.to_string() == "Option<&str>" && self.tcx.is_diagnostic_item(sym::Option, found_adt.did())
&& let ty::Adt(expected_adt, expected_substs) = expected.kind()
&& self.tcx.is_diagnostic_item(sym::Option, expected_adt.did())
&& let ty::Ref(_, inner_ty, _) = expected_substs.type_at(0).kind()
&& inner_ty.is_str()
{ {
if let ty::Adt(_def, subst) = found.kind() { let ty = found_substs.type_at(0);
if subst.len() != 0 { let mut peeled = ty;
if let GenericArgKind::Type(ty) = subst[0].unpack() { let mut ref_cnt = 0;
let peeled = ty.peel_refs().to_string(); while let ty::Ref(_, inner, _) = peeled.kind() {
if peeled == "String" { peeled = *inner;
let ref_cnt = ty.to_string().len() - peeled.len(); ref_cnt += 1;
let result = format!(".map(|x| &*{}x)", "*".repeat(ref_cnt)); }
err.span_suggestion_verbose( if let ty::Adt(adt, _) = peeled.kind()
expr.span.shrink_to_hi(), && self.tcx.is_diagnostic_item(sym::String, adt.did())
"try converting the passed type into a `&str`", {
result, err.span_suggestion_verbose(
Applicability::MaybeIncorrect, expr.span.shrink_to_hi(),
); "try converting the passed type into a `&str`",
} format!(".map(|x| &*{}x)", "*".repeat(ref_cnt)),
} Applicability::MaybeIncorrect,
} );
} }
} }
} }
......
...@@ -217,7 +217,7 @@ impl RefUnwindSafe for crate::sync::atomic::AtomicI32 {} ...@@ -217,7 +217,7 @@ impl RefUnwindSafe for crate::sync::atomic::AtomicI32 {}
#[stable(feature = "integer_atomics_stable", since = "1.34.0")] #[stable(feature = "integer_atomics_stable", since = "1.34.0")]
impl RefUnwindSafe for crate::sync::atomic::AtomicI64 {} impl RefUnwindSafe for crate::sync::atomic::AtomicI64 {}
#[cfg(target_has_atomic_load_store = "128")] #[cfg(target_has_atomic_load_store = "128")]
#[unstable(feature = "integer_atomics", issue = "32976")] #[unstable(feature = "integer_atomics", issue = "99069")]
impl RefUnwindSafe for crate::sync::atomic::AtomicI128 {} impl RefUnwindSafe for crate::sync::atomic::AtomicI128 {}
#[cfg(target_has_atomic_load_store = "ptr")] #[cfg(target_has_atomic_load_store = "ptr")]
...@@ -236,7 +236,7 @@ impl RefUnwindSafe for crate::sync::atomic::AtomicU32 {} ...@@ -236,7 +236,7 @@ impl RefUnwindSafe for crate::sync::atomic::AtomicU32 {}
#[stable(feature = "integer_atomics_stable", since = "1.34.0")] #[stable(feature = "integer_atomics_stable", since = "1.34.0")]
impl RefUnwindSafe for crate::sync::atomic::AtomicU64 {} impl RefUnwindSafe for crate::sync::atomic::AtomicU64 {}
#[cfg(target_has_atomic_load_store = "128")] #[cfg(target_has_atomic_load_store = "128")]
#[unstable(feature = "integer_atomics", issue = "32976")] #[unstable(feature = "integer_atomics", issue = "99069")]
impl RefUnwindSafe for crate::sync::atomic::AtomicU128 {} impl RefUnwindSafe for crate::sync::atomic::AtomicU128 {}
#[cfg(target_has_atomic_load_store = "8")] #[cfg(target_has_atomic_load_store = "8")]
......
...@@ -2692,7 +2692,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2692,7 +2692,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicI8"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicI8"),
"i8", "i8",
"", "",
...@@ -2712,7 +2712,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2712,7 +2712,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicU8"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicU8"),
"u8", "u8",
"", "",
...@@ -2732,7 +2732,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2732,7 +2732,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicI16"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicI16"),
"i16", "i16",
"", "",
...@@ -2752,7 +2752,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2752,7 +2752,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicU16"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicU16"),
"u16", "u16",
"", "",
...@@ -2772,7 +2772,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2772,7 +2772,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicI32"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicI32"),
"i32", "i32",
"", "",
...@@ -2792,7 +2792,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2792,7 +2792,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicU32"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicU32"),
"u32", "u32",
"", "",
...@@ -2812,7 +2812,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2812,7 +2812,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicI64"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicI64"),
"i64", "i64",
"", "",
...@@ -2832,7 +2832,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2832,7 +2832,7 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
stable(feature = "integer_atomics_stable", since = "1.34.0"), stable(feature = "integer_atomics_stable", since = "1.34.0"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicU64"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicU64"),
"u64", "u64",
"", "",
...@@ -2845,14 +2845,14 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2845,14 +2845,14 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
atomic_int! { atomic_int! {
cfg(target_has_atomic = "128"), cfg(target_has_atomic = "128"),
cfg(target_has_atomic_equal_alignment = "128"), cfg(target_has_atomic_equal_alignment = "128"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicI128"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicI128"),
"i128", "i128",
"#![feature(integer_atomics)]\n\n", "#![feature(integer_atomics)]\n\n",
...@@ -2865,14 +2865,14 @@ pub fn as_mut_ptr(&self) -> *mut $int_type { ...@@ -2865,14 +2865,14 @@ pub fn as_mut_ptr(&self) -> *mut $int_type {
atomic_int! { atomic_int! {
cfg(target_has_atomic = "128"), cfg(target_has_atomic = "128"),
cfg(target_has_atomic_equal_alignment = "128"), cfg(target_has_atomic_equal_alignment = "128"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"),
unstable(feature = "integer_atomics", issue = "32976"), unstable(feature = "integer_atomics", issue = "99069"),
cfg_attr(not(test), rustc_diagnostic_item = "AtomicU128"), cfg_attr(not(test), rustc_diagnostic_item = "AtomicU128"),
"u128", "u128",
"#![feature(integer_atomics)]\n\n", "#![feature(integer_atomics)]\n\n",
......
## `dwarf-version`
This option controls the version of DWARF that the compiler emits, on platforms
that use DWARF to encode debug information. It takes one of the following
values:
* `2`: DWARF version 2 (the default on certain platforms, like macOS).
* `4`: DWARF version 4 (the default on certain platforms, like Linux).
* `5`: DWARF version 5.
// Makes sure that `-Z dwarf-version=5` causes `rustc` to emit DWARF version 5.
// assembly-output: emit-asm
// compile-flags: -g --target x86_64-unknown-linux-gnu -Z dwarf-version=5
// needs-llvm-components: x86
#![feature(no_core, lang_items)]
#![crate_type = "rlib"]
#![no_core]
#[lang = "sized"]
trait Sized {}
#[lang = "copy"]
trait Copy {}
pub fn wibble() {}
// CHECK: .section .debug_info
// CHECK-NOT: .short 2
// CHECK-NOT: .short 4
// CHECK: .short 5
// check-pass
// compile-flags: -Zmir-opt-level=4 --emit=mir
#![allow(unused)]
fn a() -> usize { 0 }
fn bar(_: u32) {}
fn baz() -> *const dyn Fn(u32) { unimplemented!() }
fn foo() {
match () {
_ if baz() == &bar as &dyn Fn(u32) => (),
() => (),
}
}
fn main() {
}
...@@ -5,7 +5,10 @@ LL | struct Empty2(); ...@@ -5,7 +5,10 @@ LL | struct Empty2();
| ---------------- the tuple struct `Empty2` is defined here | ---------------- the tuple struct `Empty2` is defined here
... ...
LL | Empty2 => () LL | Empty2 => ()
| ^^^^^^ cannot be named the same as a tuple struct | ^^^^^^
| |
| cannot be named the same as a tuple struct
| help: try specify the pattern arguments: `Empty2(..)`
error[E0530]: match bindings cannot shadow tuple structs error[E0530]: match bindings cannot shadow tuple structs
--> $DIR/empty-struct-tuple-pat.rs:25:9 --> $DIR/empty-struct-tuple-pat.rs:25:9
...@@ -14,7 +17,10 @@ LL | use empty_struct::*; ...@@ -14,7 +17,10 @@ LL | use empty_struct::*;
| --------------- the tuple struct `XEmpty6` is imported here | --------------- the tuple struct `XEmpty6` is imported here
... ...
LL | XEmpty6 => () LL | XEmpty6 => ()
| ^^^^^^^ cannot be named the same as a tuple struct | ^^^^^^^
| |
| cannot be named the same as a tuple struct
| help: try specify the pattern arguments: `XEmpty6(..)`
error[E0532]: expected unit struct, unit variant or constant, found tuple variant `E::Empty4` error[E0532]: expected unit struct, unit variant or constant, found tuple variant `E::Empty4`
--> $DIR/empty-struct-tuple-pat.rs:29:9 --> $DIR/empty-struct-tuple-pat.rs:29:9
......
...@@ -5,7 +5,10 @@ LL | use declarations_for_tuple_field_count_errors::*; ...@@ -5,7 +5,10 @@ LL | use declarations_for_tuple_field_count_errors::*;
| -------------------------------------------- the tuple struct `Z1` is imported here | -------------------------------------------- the tuple struct `Z1` is imported here
... ...
LL | Z1 => {} LL | Z1 => {}
| ^^ cannot be named the same as a tuple struct | ^^
| |
| cannot be named the same as a tuple struct
| help: try specify the pattern arguments: `Z1(..)`
error[E0532]: expected tuple struct or tuple variant, found unit struct `Z0` error[E0532]: expected tuple struct or tuple variant, found unit struct `Z0`
--> $DIR/pat-tuple-field-count-cross.rs:9:9 --> $DIR/pat-tuple-field-count-cross.rs:9:9
......
...@@ -5,7 +5,10 @@ LL | struct Z1(); ...@@ -5,7 +5,10 @@ LL | struct Z1();
| ------------ the tuple struct `Z1` is defined here | ------------ the tuple struct `Z1` is defined here
... ...
LL | Z1 => {} LL | Z1 => {}
| ^^ cannot be named the same as a tuple struct | ^^
| |
| cannot be named the same as a tuple struct
| help: try specify the pattern arguments: `Z1(..)`
error[E0532]: expected tuple struct or tuple variant, found unit struct `Z0` error[E0532]: expected tuple struct or tuple variant, found unit struct `Z0`
--> $DIR/pat-tuple-overfield.rs:52:9 --> $DIR/pat-tuple-overfield.rs:52:9
......
...@@ -5,7 +5,10 @@ LL | struct TupleStruct(); ...@@ -5,7 +5,10 @@ LL | struct TupleStruct();
| --------------------- the tuple struct `TupleStruct` is defined here | --------------------- the tuple struct `TupleStruct` is defined here
... ...
LL | TupleStruct => {} LL | TupleStruct => {}
| ^^^^^^^^^^^ cannot be named the same as a tuple struct | ^^^^^^^^^^^
| |
| cannot be named the same as a tuple struct
| help: try specify the pattern arguments: `TupleStruct(..)`
error[E0530]: match bindings cannot shadow tuple variants error[E0530]: match bindings cannot shadow tuple variants
--> $DIR/pattern-binding-disambiguation.rs:33:9 --> $DIR/pattern-binding-disambiguation.rs:33:9
...@@ -14,7 +17,10 @@ LL | use E::*; ...@@ -14,7 +17,10 @@ LL | use E::*;
| ---- the tuple variant `TupleVariant` is imported here | ---- the tuple variant `TupleVariant` is imported here
... ...
LL | TupleVariant => {} LL | TupleVariant => {}
| ^^^^^^^^^^^^ cannot be named the same as a tuple variant | ^^^^^^^^^^^^
| |
| cannot be named the same as a tuple variant
| help: try specify the pattern arguments: `TupleVariant(..)`
error[E0530]: match bindings cannot shadow struct variants error[E0530]: match bindings cannot shadow struct variants
--> $DIR/pattern-binding-disambiguation.rs:36:9 --> $DIR/pattern-binding-disambiguation.rs:36:9
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册