Auto merge of #63592 - Centril:rollup-7c6dg3e, r=Centril
Rollup of 9 pull requests Successful merges: - #63155 (Add UWP MSVC targets) - #63165 (Add builtin targets for mips64(el)-unknown-linux-muslabi64) - #63306 (Adapt AddRetag for shallow retagging) - #63467 (Add Catalyst (iOS apps running on macOS) target) - #63546 (Remove uses of `mem::uninitialized()` from cloudabi) - #63572 (remove unused Level::PhaseFatal) - #63577 (Test HRTB issue accepted by compiler) - #63582 (Fix ICE #63226) - #63586 (cleanup: Remove `Spanned` where possible) Failed merges: r? @ghost
This commit is contained in:
commit
f7af19c279
66 changed files with 501 additions and 223 deletions
|
@ -144,7 +144,7 @@ then you may need to force rustbuild to use an older version. This can be done
|
|||
by manually calling the appropriate vcvars file before running the bootstrap.
|
||||
|
||||
```batch
|
||||
> CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
|
||||
> CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
|
||||
> python x.py build
|
||||
```
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
|
|||
}
|
||||
|
||||
PatKind::Struct(_, ref subpats, _) => {
|
||||
let pats_exit = self.pats_all(subpats.iter().map(|f| &f.node.pat), pred);
|
||||
let pats_exit = self.pats_all(subpats.iter().map(|f| &f.pat), pred);
|
||||
self.add_ast_node(pat.hir_id.local_id, &[pats_exit])
|
||||
}
|
||||
|
||||
|
|
|
@ -704,9 +704,9 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) {
|
|||
PatKind::Struct(ref qpath, ref fields, _) => {
|
||||
visitor.visit_qpath(qpath, pattern.hir_id, pattern.span);
|
||||
for field in fields {
|
||||
visitor.visit_id(field.node.hir_id);
|
||||
visitor.visit_ident(field.node.ident);
|
||||
visitor.visit_pat(&field.node.pat)
|
||||
visitor.visit_id(field.hir_id);
|
||||
visitor.visit_ident(field.ident);
|
||||
visitor.visit_pat(&field.pat)
|
||||
}
|
||||
}
|
||||
PatKind::Tuple(ref tuple_elements, _) => {
|
||||
|
|
|
@ -2691,16 +2691,12 @@ impl<'a> LoweringContext<'a> {
|
|||
|
||||
let fs = fields
|
||||
.iter()
|
||||
.map(|f| {
|
||||
Spanned {
|
||||
span: f.span,
|
||||
node: hir::FieldPat {
|
||||
hir_id: self.next_id(),
|
||||
ident: f.node.ident,
|
||||
pat: self.lower_pat(&f.node.pat),
|
||||
is_shorthand: f.node.is_shorthand,
|
||||
},
|
||||
}
|
||||
.map(|f| hir::FieldPat {
|
||||
hir_id: self.next_id(),
|
||||
ident: f.ident,
|
||||
pat: self.lower_pat(&f.pat),
|
||||
is_shorthand: f.is_shorthand,
|
||||
span: f.span,
|
||||
})
|
||||
.collect();
|
||||
hir::PatKind::Struct(qpath, fs, etc)
|
||||
|
|
|
@ -877,7 +877,7 @@ impl Pat {
|
|||
match self.node {
|
||||
PatKind::Binding(.., Some(ref p)) => p.walk_(it),
|
||||
PatKind::Struct(_, ref fields, _) => {
|
||||
fields.iter().all(|field| field.node.pat.walk_(it))
|
||||
fields.iter().all(|field| field.pat.walk_(it))
|
||||
}
|
||||
PatKind::TupleStruct(_, ref s, _) | PatKind::Tuple(ref s, _) => {
|
||||
s.iter().all(|p| p.walk_(it))
|
||||
|
@ -923,6 +923,7 @@ pub struct FieldPat {
|
|||
/// The pattern the field is destructured to.
|
||||
pub pat: P<Pat>,
|
||||
pub is_shorthand: bool,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
/// Explicit binding annotations given in the HIR for a binding. Note
|
||||
|
@ -968,7 +969,7 @@ pub enum PatKind {
|
|||
|
||||
/// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`).
|
||||
/// The `bool` is `true` in the presence of a `..`.
|
||||
Struct(QPath, HirVec<Spanned<FieldPat>>, bool),
|
||||
Struct(QPath, HirVec<FieldPat>, bool),
|
||||
|
||||
/// A tuple struct/variant pattern `Variant(x, y, .., z)`.
|
||||
/// If the `..` pattern fragment is present, then `Option<usize>` denotes its position.
|
||||
|
|
|
@ -1670,14 +1670,14 @@ impl<'a> State<'a> {
|
|||
&fields[..],
|
||||
|s, f| {
|
||||
s.cbox(INDENT_UNIT);
|
||||
if !f.node.is_shorthand {
|
||||
s.print_ident(f.node.ident);
|
||||
if !f.is_shorthand {
|
||||
s.print_ident(f.ident);
|
||||
s.word_nbsp(":");
|
||||
}
|
||||
s.print_pat(&f.node.pat);
|
||||
s.print_pat(&f.pat);
|
||||
s.end()
|
||||
},
|
||||
|f| f.node.pat.span);
|
||||
|f| f.pat.span);
|
||||
if etc {
|
||||
if !fields.is_empty() {
|
||||
self.word_space(",");
|
||||
|
|
|
@ -153,8 +153,6 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::Ty {
|
|||
}
|
||||
}
|
||||
|
||||
impl_stable_hash_for_spanned!(hir::FieldPat);
|
||||
|
||||
impl_stable_hash_for_spanned!(hir::BinOpKind);
|
||||
|
||||
impl_stable_hash_for!(struct hir::Stmt {
|
||||
|
@ -187,8 +185,6 @@ impl<'a> HashStable<StableHashingContext<'a>> for hir::Expr {
|
|||
|
||||
impl_stable_hash_for_spanned!(usize);
|
||||
|
||||
impl_stable_hash_for_spanned!(ast::Ident);
|
||||
|
||||
impl_stable_hash_for!(struct ast::Ident {
|
||||
name,
|
||||
span,
|
||||
|
|
|
@ -1345,7 +1345,7 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
|
|||
// part of `walk_mac`, and (b) we should be calling
|
||||
// `visit_path`, *but* that would require a `NodeId`, and I
|
||||
// want to get #53686 fixed quickly. -nmatsakis
|
||||
ast_visit::walk_path(self, &mac.node.path);
|
||||
ast_visit::walk_path(self, &mac.path);
|
||||
|
||||
run_early_pass!(self, check_mac, mac);
|
||||
}
|
||||
|
|
|
@ -17,8 +17,7 @@ use crate::util::nodemap::FxHashSet;
|
|||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
|
||||
use syntax::{ast, source_map};
|
||||
use syntax::attr;
|
||||
use syntax::{ast, attr};
|
||||
use syntax::symbol::sym;
|
||||
use syntax_pos;
|
||||
|
||||
|
@ -119,17 +118,16 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn handle_field_pattern_match(&mut self, lhs: &hir::Pat, res: Res,
|
||||
pats: &[source_map::Spanned<hir::FieldPat>]) {
|
||||
fn handle_field_pattern_match(&mut self, lhs: &hir::Pat, res: Res, pats: &[hir::FieldPat]) {
|
||||
let variant = match self.tables.node_type(lhs.hir_id).sty {
|
||||
ty::Adt(adt, _) => adt.variant_of_res(res),
|
||||
_ => span_bug!(lhs.span, "non-ADT in struct pattern")
|
||||
};
|
||||
for pat in pats {
|
||||
if let PatKind::Wild = pat.node.pat.node {
|
||||
if let PatKind::Wild = pat.pat.node {
|
||||
continue;
|
||||
}
|
||||
let index = self.tcx.field_index(pat.node.hir_id, self.tables);
|
||||
let index = self.tcx.field_index(pat.hir_id, self.tables);
|
||||
self.insert_def_id(variant.fields[index].did);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -418,8 +418,8 @@ fn add_from_pat<'tcx>(ir: &mut IrMaps<'tcx>, pat: &P<hir::Pat>) {
|
|||
}
|
||||
Struct(_, ref fields, _) => {
|
||||
for field in fields {
|
||||
if field.node.is_shorthand {
|
||||
shorthand_field_ids.insert(field.node.pat.hir_id);
|
||||
if field.is_shorthand {
|
||||
shorthand_field_ids.insert(field.pat.hir_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1282,11 +1282,11 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
|
|||
};
|
||||
|
||||
for fp in field_pats {
|
||||
let field_ty = self.pat_ty_adjusted(&fp.node.pat)?; // see (*2)
|
||||
let f_index = self.tcx.field_index(fp.node.hir_id, self.tables);
|
||||
let field_ty = self.pat_ty_adjusted(&fp.pat)?; // see (*2)
|
||||
let f_index = self.tcx.field_index(fp.hir_id, self.tables);
|
||||
let cmt_field = Rc::new(self.cat_field(pat, cmt.clone(), f_index,
|
||||
fp.node.ident, field_ty));
|
||||
self.cat_pattern_(cmt_field, &fp.node.pat, op)?;
|
||||
fp.ident, field_ty));
|
||||
self.cat_pattern_(cmt_field, &fp.pat, op)?;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,9 @@ fn item_might_be_inlined(tcx: TyCtxt<'tcx>, item: &hir::Item, attrs: CodegenFnAt
|
|||
}
|
||||
|
||||
match item.node {
|
||||
hir::ItemKind::Fn(_, header, ..) if header.is_const() => {
|
||||
return true;
|
||||
}
|
||||
hir::ItemKind::Impl(..) |
|
||||
hir::ItemKind::Fn(..) => {
|
||||
let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
|
||||
|
@ -52,6 +55,11 @@ fn method_might_be_inlined(
|
|||
if codegen_fn_attrs.requests_inline() || generics.requires_monomorphization(tcx) {
|
||||
return true
|
||||
}
|
||||
if let hir::ImplItemKind::Method(method_sig, _) = &impl_item.node {
|
||||
if method_sig.header.is_const() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
if let Some(impl_hir_id) = tcx.hir().as_local_hir_id(impl_src) {
|
||||
match tcx.hir().find(impl_hir_id) {
|
||||
Some(Node::Item(item)) =>
|
||||
|
|
|
@ -1207,7 +1207,7 @@ fn resolve_local<'tcx>(
|
|||
PatKind::Binding(hir::BindingAnnotation::RefMut, ..) => true,
|
||||
|
||||
PatKind::Struct(_, ref field_pats, _) => {
|
||||
field_pats.iter().any(|fp| is_binding_pat(&fp.node.pat))
|
||||
field_pats.iter().any(|fp| is_binding_pat(&fp.pat))
|
||||
}
|
||||
|
||||
PatKind::Slice(ref pats1, ref pats2, ref pats3) => {
|
||||
|
|
|
@ -32,6 +32,7 @@ use std::path::{Path, PathBuf};
|
|||
use std::process::{Output, Stdio, ExitStatus};
|
||||
use std::str;
|
||||
use std::env;
|
||||
use std::ffi::OsString;
|
||||
|
||||
pub use rustc_codegen_utils::link::*;
|
||||
|
||||
|
@ -158,6 +159,36 @@ pub fn get_linker(sess: &Session, linker: &Path, flavor: LinkerFlavor) -> (PathB
|
|||
}
|
||||
};
|
||||
|
||||
// UWP apps have API restrictions enforced during Store submissions.
|
||||
// To comply with the Windows App Certification Kit,
|
||||
// MSVC needs to link with the Store versions of the runtime libraries (vcruntime, msvcrt, etc).
|
||||
let t = &sess.target.target;
|
||||
if flavor == LinkerFlavor::Msvc && t.target_vendor == "uwp" {
|
||||
if let Some(ref tool) = msvc_tool {
|
||||
let original_path = tool.path();
|
||||
if let Some(ref root_lib_path) = original_path.ancestors().skip(4).next() {
|
||||
let arch = match t.arch.as_str() {
|
||||
"x86_64" => Some("x64".to_string()),
|
||||
"x86" => Some("x86".to_string()),
|
||||
"aarch64" => Some("arm64".to_string()),
|
||||
_ => None,
|
||||
};
|
||||
if let Some(ref a) = arch {
|
||||
let mut arg = OsString::from("/LIBPATH:");
|
||||
arg.push(format!("{}\\lib\\{}\\store", root_lib_path.display(), a.to_string()));
|
||||
cmd.arg(&arg);
|
||||
}
|
||||
else {
|
||||
warn!("arch is not supported");
|
||||
}
|
||||
} else {
|
||||
warn!("MSVC root path lib location not found");
|
||||
}
|
||||
} else {
|
||||
warn!("link.exe not found");
|
||||
}
|
||||
}
|
||||
|
||||
// The compiler's sysroot often has some bundled tools, so add it to the
|
||||
// PATH for the child.
|
||||
let mut new_path = sess.host_filesearch(PathKind::All)
|
||||
|
@ -1027,6 +1058,7 @@ fn link_args<'a, B: ArchiveBuilder<'a>>(cmd: &mut dyn Linker,
|
|||
let t = &sess.target.target;
|
||||
|
||||
cmd.include_path(&fix_windows_verbatim_for_gcc(&lib_path));
|
||||
|
||||
for obj in codegen_results.modules.iter().filter_map(|m| m.object.as_ref()) {
|
||||
cmd.add_object(obj);
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ impl<'a> DiagnosticConverter<'a> {
|
|||
/// Maps `Diagnostic::Level` to `snippet::AnnotationType`
|
||||
fn annotation_type_for_level(level: Level) -> AnnotationType {
|
||||
match level {
|
||||
Level::Bug | Level::Fatal | Level::PhaseFatal | Level::Error => AnnotationType::Error,
|
||||
Level::Bug | Level::Fatal | Level::Error => AnnotationType::Error,
|
||||
Level::Warning => AnnotationType::Warning,
|
||||
Level::Note => AnnotationType::Note,
|
||||
Level::Help => AnnotationType::Help,
|
||||
|
|
|
@ -94,7 +94,6 @@ impl Diagnostic {
|
|||
match self.level {
|
||||
Level::Bug |
|
||||
Level::Fatal |
|
||||
Level::PhaseFatal |
|
||||
Level::Error |
|
||||
Level::FailureNote => {
|
||||
true
|
||||
|
|
|
@ -787,9 +787,6 @@ impl Handler {
|
|||
pub enum Level {
|
||||
Bug,
|
||||
Fatal,
|
||||
// An error which while not immediately fatal, should stop the compiler
|
||||
// progressing beyond the current phase.
|
||||
PhaseFatal,
|
||||
Error,
|
||||
Warning,
|
||||
Note,
|
||||
|
@ -808,7 +805,7 @@ impl Level {
|
|||
fn color(self) -> ColorSpec {
|
||||
let mut spec = ColorSpec::new();
|
||||
match self {
|
||||
Bug | Fatal | PhaseFatal | Error => {
|
||||
Bug | Fatal | Error => {
|
||||
spec.set_fg(Some(Color::Red))
|
||||
.set_intense(true);
|
||||
}
|
||||
|
@ -833,7 +830,7 @@ impl Level {
|
|||
pub fn to_str(self) -> &'static str {
|
||||
match self {
|
||||
Bug => "error: internal compiler error",
|
||||
Fatal | PhaseFatal | Error => "error",
|
||||
Fatal | Error => "error",
|
||||
Warning => "warning",
|
||||
Note => "note",
|
||||
Help => "help",
|
||||
|
|
|
@ -164,7 +164,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns {
|
|||
.expect("struct pattern type is not an ADT")
|
||||
.variant_of_res(cx.tables.qpath_res(qpath, pat.hir_id));
|
||||
for fieldpat in field_pats {
|
||||
if fieldpat.node.is_shorthand {
|
||||
if fieldpat.is_shorthand {
|
||||
continue;
|
||||
}
|
||||
if fieldpat.span.ctxt().outer_expn_info().is_some() {
|
||||
|
@ -173,9 +173,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonShorthandFieldPatterns {
|
|||
// (Issue #49588)
|
||||
continue;
|
||||
}
|
||||
if let PatKind::Binding(_, _, ident, None) = fieldpat.node.pat.node {
|
||||
if let PatKind::Binding(_, _, ident, None) = fieldpat.pat.node {
|
||||
if cx.tcx.find_field_index(ident, &variant) ==
|
||||
Some(cx.tcx.field_index(fieldpat.node.hir_id, cx.tables)) {
|
||||
Some(cx.tcx.field_index(fieldpat.hir_id, cx.tables)) {
|
||||
let mut err = cx.struct_span_lint(NON_SHORTHAND_FIELD_PATTERNS,
|
||||
fieldpat.span,
|
||||
&format!("the `{}:` in this pattern is redundant", ident));
|
||||
|
@ -1493,7 +1493,7 @@ impl EarlyLintPass for KeywordIdents {
|
|||
self.check_tokens(cx, mac_def.stream());
|
||||
}
|
||||
fn check_mac(&mut self, cx: &EarlyContext<'_>, mac: &ast::Mac) {
|
||||
self.check_tokens(cx, mac.node.tts.clone().into());
|
||||
self.check_tokens(cx, mac.tts.clone().into());
|
||||
}
|
||||
fn check_ident(&mut self, cx: &EarlyContext<'_>, ident: ast::Ident) {
|
||||
self.check_ident_token(cx, UnderMacro(false), ident);
|
||||
|
|
|
@ -645,9 +645,9 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
|
|||
fields.iter()
|
||||
.map(|field| {
|
||||
FieldPattern {
|
||||
field: Field::new(self.tcx.field_index(field.node.hir_id,
|
||||
field: Field::new(self.tcx.field_index(field.hir_id,
|
||||
self.tables)),
|
||||
pattern: self.lower_pattern(&field.node.pat),
|
||||
pattern: self.lower_pattern(&field.pat),
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
|
|
@ -42,9 +42,8 @@ fn is_stable(
|
|||
}
|
||||
}
|
||||
|
||||
/// Determine whether this type may have a reference in it, recursing below compound types but
|
||||
/// not below references.
|
||||
fn may_have_reference<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> bool {
|
||||
/// Determine whether this type may be a reference (or box), and thus needs retagging.
|
||||
fn may_be_reference<'tcx>(ty: Ty<'tcx>) -> bool {
|
||||
match ty.sty {
|
||||
// Primitive types that are not references
|
||||
ty::Bool | ty::Char |
|
||||
|
@ -55,15 +54,12 @@ fn may_have_reference<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> bool {
|
|||
// References
|
||||
ty::Ref(..) => true,
|
||||
ty::Adt(..) if ty.is_box() => true,
|
||||
// Compound types
|
||||
ty::Array(ty, ..) | ty::Slice(ty) =>
|
||||
may_have_reference(ty, tcx),
|
||||
ty::Tuple(tys) =>
|
||||
tys.iter().any(|ty| may_have_reference(ty.expect_ty(), tcx)),
|
||||
ty::Adt(adt, substs) =>
|
||||
adt.variants.iter().any(|v| v.fields.iter().any(|f|
|
||||
may_have_reference(f.ty(tcx, substs), tcx)
|
||||
)),
|
||||
// Compound types are not references
|
||||
ty::Array(..) |
|
||||
ty::Slice(..) |
|
||||
ty::Tuple(..) |
|
||||
ty::Adt(..) =>
|
||||
false,
|
||||
// Conservative fallback
|
||||
_ => true,
|
||||
}
|
||||
|
@ -80,7 +76,7 @@ impl MirPass for AddRetag {
|
|||
// FIXME: Instead of giving up for unstable places, we should introduce
|
||||
// a temporary and retag on that.
|
||||
is_stable(place.as_ref())
|
||||
&& may_have_reference(place.ty(&*local_decls, tcx).ty, tcx)
|
||||
&& may_be_reference(place.ty(&*local_decls, tcx).ty)
|
||||
};
|
||||
|
||||
// PART 1
|
||||
|
|
|
@ -824,7 +824,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
|this| visit::walk_enum_def(this, enum_definition, generics, item_id))
|
||||
}
|
||||
|
||||
fn visit_mac(&mut self, mac: &Spanned<Mac_>) {
|
||||
fn visit_mac(&mut self, mac: &Mac) {
|
||||
// when a new macro kind is added but the author forgets to set it up for expansion
|
||||
// because that's the only part that won't cause a compiler error
|
||||
self.session.diagnostic()
|
||||
|
|
|
@ -1075,8 +1075,8 @@ impl<'a, 'tcx> Visitor<'tcx> for NamePrivacyVisitor<'a, 'tcx> {
|
|||
let adt = self.tables.pat_ty(pat).ty_adt_def().unwrap();
|
||||
let variant = adt.variant_of_res(res);
|
||||
for field in fields {
|
||||
let use_ctxt = field.node.ident.span;
|
||||
let index = self.tcx.field_index(field.node.hir_id, self.tables);
|
||||
let use_ctxt = field.ident.span;
|
||||
let index = self.tcx.field_index(field.hir_id, self.tables);
|
||||
self.check_field(use_ctxt, field.span, adt, &variant.fields[index]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ impl<'a> base::Resolver for Resolver<'a> {
|
|||
InvocationKind::Attr { ref attr, ref derives, after_derive, .. } =>
|
||||
(&attr.path, MacroKind::Attr, derives.clone(), after_derive),
|
||||
InvocationKind::Bang { ref mac, .. } =>
|
||||
(&mac.node.path, MacroKind::Bang, Vec::new(), false),
|
||||
(&mac.path, MacroKind::Bang, Vec::new(), false),
|
||||
InvocationKind::Derive { ref path, .. } =>
|
||||
(path, MacroKind::Derive, Vec::new(), false),
|
||||
InvocationKind::DeriveContainer { ref derives, .. } => {
|
||||
|
|
|
@ -32,7 +32,7 @@ use syntax::print::pprust::{
|
|||
ty_to_string
|
||||
};
|
||||
use syntax::ptr::P;
|
||||
use syntax::source_map::{Spanned, DUMMY_SP, respan};
|
||||
use syntax::source_map::{DUMMY_SP, respan};
|
||||
use syntax::walk_list;
|
||||
use syntax_pos::*;
|
||||
|
||||
|
@ -879,7 +879,7 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> {
|
|||
};
|
||||
let variant = adt.variant_of_res(self.save_ctxt.get_path_res(p.id));
|
||||
|
||||
for &Spanned { node: ref field, .. } in fields {
|
||||
for field in fields {
|
||||
if let Some(index) = self.tcx.find_field_index(field.ident, variant) {
|
||||
if !self.span.filter_generated(field.ident.span) {
|
||||
let span = self.span_from_span(field.ident.span);
|
||||
|
|
24
src/librustc_target/spec/aarch64_uwp_windows_msvc.rs
Normal file
24
src/librustc_target/spec/aarch64_uwp_windows_msvc.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetResult, PanicStrategy};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let mut base = super::windows_uwp_msvc_base::opts();
|
||||
base.max_atomic_width = Some(64);
|
||||
base.has_elf_tls = true;
|
||||
|
||||
// FIXME: this shouldn't be panic=abort, it should be panic=unwind
|
||||
base.panic_strategy = PanicStrategy::Abort;
|
||||
|
||||
Ok(Target {
|
||||
llvm_target: "aarch64-pc-windows-msvc".to_string(),
|
||||
target_endian: "little".to_string(),
|
||||
target_pointer_width: "64".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128".to_string(),
|
||||
arch: "aarch64".to_string(),
|
||||
target_os: "windows".to_string(),
|
||||
target_env: "msvc".to_string(),
|
||||
target_vendor: "uwp".to_string(),
|
||||
linker_flavor: LinkerFlavor::Msvc,
|
||||
options: base,
|
||||
})
|
||||
}
|
|
@ -13,7 +13,8 @@ pub enum Arch {
|
|||
Armv7s,
|
||||
Arm64,
|
||||
I386,
|
||||
X86_64
|
||||
X86_64,
|
||||
X86_64_macabi,
|
||||
}
|
||||
|
||||
impl Arch {
|
||||
|
@ -23,7 +24,8 @@ impl Arch {
|
|||
Armv7s => "armv7s",
|
||||
Arm64 => "arm64",
|
||||
I386 => "i386",
|
||||
X86_64 => "x86_64"
|
||||
X86_64 => "x86_64",
|
||||
X86_64_macabi => "x86_64"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +69,8 @@ pub fn get_sdk_root(sdk_name: &str) -> Result<String, String> {
|
|||
fn build_pre_link_args(arch: Arch) -> Result<LinkArgs, String> {
|
||||
let sdk_name = match arch {
|
||||
Armv7 | Armv7s | Arm64 => "iphoneos",
|
||||
I386 | X86_64 => "iphonesimulator"
|
||||
I386 | X86_64 => "iphonesimulator",
|
||||
X86_64_macabi => "macosx10.15",
|
||||
};
|
||||
|
||||
let arch_name = arch.to_string();
|
||||
|
@ -93,6 +96,7 @@ fn target_cpu(arch: Arch) -> String {
|
|||
Arm64 => "cyclone",
|
||||
I386 => "yonah",
|
||||
X86_64 => "core2",
|
||||
X86_64_macabi => "core2",
|
||||
}.to_string()
|
||||
}
|
||||
|
||||
|
|
22
src/librustc_target/spec/i686_uwp_windows_msvc.rs
Normal file
22
src/librustc_target/spec/i686_uwp_windows_msvc.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetResult};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let mut base = super::windows_uwp_msvc_base::opts();
|
||||
base.cpu = "pentium4".to_string();
|
||||
base.max_atomic_width = Some(64);
|
||||
base.has_elf_tls = true;
|
||||
|
||||
Ok(Target {
|
||||
llvm_target: "i686-pc-windows-msvc".to_string(),
|
||||
target_endian: "little".to_string(),
|
||||
target_pointer_width: "32".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32".to_string(),
|
||||
arch: "x86".to_string(),
|
||||
target_os: "windows".to_string(),
|
||||
target_env: "msvc".to_string(),
|
||||
target_vendor: "uwp".to_string(),
|
||||
linker_flavor: LinkerFlavor::Msvc,
|
||||
options: base,
|
||||
})
|
||||
}
|
25
src/librustc_target/spec/mips64_unknown_linux_muslabi64.rs
Normal file
25
src/librustc_target/spec/mips64_unknown_linux_muslabi64.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let mut base = super::linux_musl_base::opts();
|
||||
base.cpu = "mips64r2".to_string();
|
||||
base.features = "+mips64r2".to_string();
|
||||
base.max_atomic_width = Some(64);
|
||||
Ok(Target {
|
||||
// LLVM doesn't recognize "muslabi64" yet.
|
||||
llvm_target: "mips64-unknown-linux-musl".to_string(),
|
||||
target_endian: "big".to_string(),
|
||||
target_pointer_width: "64".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
target_os: "linux".to_string(),
|
||||
target_env: "musl".to_string(),
|
||||
target_vendor: "unknown".to_string(),
|
||||
linker_flavor: LinkerFlavor::Gcc,
|
||||
options: TargetOptions {
|
||||
target_mcount: "_mcount".to_string(),
|
||||
.. base
|
||||
},
|
||||
})
|
||||
}
|
25
src/librustc_target/spec/mips64el_unknown_linux_muslabi64.rs
Normal file
25
src/librustc_target/spec/mips64el_unknown_linux_muslabi64.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let mut base = super::linux_musl_base::opts();
|
||||
base.cpu = "mips64r2".to_string();
|
||||
base.features = "+mips64r2".to_string();
|
||||
base.max_atomic_width = Some(64);
|
||||
Ok(Target {
|
||||
// LLVM doesn't recognize "muslabi64" yet.
|
||||
llvm_target: "mips64el-unknown-linux-musl".to_string(),
|
||||
target_endian: "little".to_string(),
|
||||
target_pointer_width: "64".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128".to_string(),
|
||||
arch: "mips64".to_string(),
|
||||
target_os: "linux".to_string(),
|
||||
target_env: "musl".to_string(),
|
||||
target_vendor: "unknown".to_string(),
|
||||
linker_flavor: LinkerFlavor::Gcc,
|
||||
options: TargetOptions {
|
||||
target_mcount: "_mcount".to_string(),
|
||||
.. base
|
||||
},
|
||||
})
|
||||
}
|
|
@ -61,6 +61,7 @@ mod uefi_base;
|
|||
mod windows_base;
|
||||
mod windows_msvc_base;
|
||||
mod windows_uwp_base;
|
||||
mod windows_uwp_msvc_base;
|
||||
mod thumb_base;
|
||||
mod l4re_base;
|
||||
mod fuchsia_base;
|
||||
|
@ -371,6 +372,8 @@ supported_targets! {
|
|||
("i586-unknown-linux-musl", i586_unknown_linux_musl),
|
||||
("mips-unknown-linux-musl", mips_unknown_linux_musl),
|
||||
("mipsel-unknown-linux-musl", mipsel_unknown_linux_musl),
|
||||
("mips64-unknown-linux-muslabi64", mips64_unknown_linux_muslabi64),
|
||||
("mips64el-unknown-linux-muslabi64", mips64el_unknown_linux_muslabi64),
|
||||
("hexagon-unknown-linux-musl", hexagon_unknown_linux_musl),
|
||||
|
||||
("mips-unknown-linux-uclibc", mips_unknown_linux_uclibc),
|
||||
|
@ -425,6 +428,7 @@ supported_targets! {
|
|||
("aarch64-apple-ios", aarch64_apple_ios),
|
||||
("armv7-apple-ios", armv7_apple_ios),
|
||||
("armv7s-apple-ios", armv7s_apple_ios),
|
||||
("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
|
||||
|
||||
("armebv7r-none-eabi", armebv7r_none_eabi),
|
||||
("armebv7r-none-eabihf", armebv7r_none_eabihf),
|
||||
|
@ -442,8 +446,11 @@ supported_targets! {
|
|||
("x86_64-uwp-windows-gnu", x86_64_uwp_windows_gnu),
|
||||
|
||||
("aarch64-pc-windows-msvc", aarch64_pc_windows_msvc),
|
||||
("aarch64-uwp-windows-msvc", aarch64_uwp_windows_msvc),
|
||||
("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
|
||||
("x86_64-uwp-windows-msvc", x86_64_uwp_windows_msvc),
|
||||
("i686-pc-windows-msvc", i686_pc_windows_msvc),
|
||||
("i686-uwp-windows-msvc", i686_uwp_windows_msvc),
|
||||
("i586-pc-windows-msvc", i586_pc_windows_msvc),
|
||||
("thumbv7a-pc-windows-msvc", thumbv7a_pc_windows_msvc),
|
||||
|
||||
|
|
33
src/librustc_target/spec/windows_uwp_msvc_base.rs
Normal file
33
src/librustc_target/spec/windows_uwp_msvc_base.rs
Normal file
|
@ -0,0 +1,33 @@
|
|||
use crate::spec::{LinkArgs, LinkerFlavor, TargetOptions};
|
||||
use std::default::Default;
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
let mut args = LinkArgs::new();
|
||||
args.insert(LinkerFlavor::Msvc,
|
||||
vec!["/NOLOGO".to_string(),
|
||||
"/NXCOMPAT".to_string(),
|
||||
"/APPCONTAINER".to_string(),
|
||||
"mincore.lib".to_string()]);
|
||||
|
||||
TargetOptions {
|
||||
function_sections: true,
|
||||
dynamic_linking: true,
|
||||
executables: true,
|
||||
dll_prefix: String::new(),
|
||||
dll_suffix: ".dll".to_string(),
|
||||
exe_suffix: ".exe".to_string(),
|
||||
staticlib_prefix: String::new(),
|
||||
staticlib_suffix: ".lib".to_string(),
|
||||
target_family: Some("windows".to_string()),
|
||||
is_like_windows: true,
|
||||
is_like_msvc: true,
|
||||
pre_link_args: args,
|
||||
crt_static_allows_dylibs: true,
|
||||
crt_static_respected: true,
|
||||
abi_return_struct_as_int: true,
|
||||
emit_debug_gdb_scripts: false,
|
||||
requires_uwtable: true,
|
||||
|
||||
.. Default::default()
|
||||
}
|
||||
}
|
23
src/librustc_target/spec/x86_64_apple_ios_macabi.rs
Normal file
23
src/librustc_target/spec/x86_64_apple_ios_macabi.rs
Normal file
|
@ -0,0 +1,23 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
|
||||
use super::apple_ios_base::{opts, Arch};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let base = opts(Arch::X86_64_macabi)?;
|
||||
Ok(Target {
|
||||
llvm_target: "x86_64-apple-ios13.0-macabi".to_string(),
|
||||
target_endian: "little".to_string(),
|
||||
target_pointer_width: "64".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "e-m:o-i64:64-f80:128-n8:16:32:64-S128".to_string(),
|
||||
arch: "x86_64".to_string(),
|
||||
target_os: "ios".to_string(),
|
||||
target_env: String::new(),
|
||||
target_vendor: "apple".to_string(),
|
||||
linker_flavor: LinkerFlavor::Gcc,
|
||||
options: TargetOptions {
|
||||
max_atomic_width: Some(64),
|
||||
stack_probes: true,
|
||||
.. base
|
||||
}
|
||||
})
|
||||
}
|
22
src/librustc_target/spec/x86_64_uwp_windows_msvc.rs
Normal file
22
src/librustc_target/spec/x86_64_uwp_windows_msvc.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
use crate::spec::{LinkerFlavor, Target, TargetResult};
|
||||
|
||||
pub fn target() -> TargetResult {
|
||||
let mut base = super::windows_uwp_msvc_base::opts();
|
||||
base.cpu = "x86-64".to_string();
|
||||
base.max_atomic_width = Some(64);
|
||||
base.has_elf_tls = true;
|
||||
|
||||
Ok(Target {
|
||||
llvm_target: "x86_64-pc-windows-msvc".to_string(),
|
||||
target_endian: "little".to_string(),
|
||||
target_pointer_width: "64".to_string(),
|
||||
target_c_int_width: "32".to_string(),
|
||||
data_layout: "e-m:w-i64:64-f80:128-n8:16:32:64-S128".to_string(),
|
||||
arch: "x86_64".to_string(),
|
||||
target_os: "windows".to_string(),
|
||||
target_env: "msvc".to_string(),
|
||||
target_vendor: "uwp".to_string(),
|
||||
linker_flavor: LinkerFlavor::Msvc,
|
||||
options: base,
|
||||
})
|
||||
}
|
|
@ -12,7 +12,6 @@ use rustc::traits::{ObligationCause, ObligationCauseCode};
|
|||
use rustc::ty::{self, Ty, TypeFoldable};
|
||||
use rustc::ty::subst::Kind;
|
||||
use syntax::ast;
|
||||
use syntax::source_map::Spanned;
|
||||
use syntax::util::lev_distance::find_best_match_for_name;
|
||||
use syntax_pos::Span;
|
||||
use syntax_pos::hygiene::DesugaringKind;
|
||||
|
@ -1036,7 +1035,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
&self,
|
||||
pat: &'tcx hir::Pat,
|
||||
qpath: &hir::QPath,
|
||||
fields: &'tcx [Spanned<hir::FieldPat>],
|
||||
fields: &'tcx [hir::FieldPat],
|
||||
etc: bool,
|
||||
expected: Ty<'tcx>,
|
||||
def_bm: ty::BindingMode,
|
||||
|
@ -1048,7 +1047,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
variant_ty
|
||||
} else {
|
||||
for field in fields {
|
||||
self.check_pat_walk(&field.node.pat, self.tcx.types.err, def_bm, discrim_span);
|
||||
self.check_pat_walk(&field.pat, self.tcx.types.err, def_bm, discrim_span);
|
||||
}
|
||||
return self.tcx.types.err;
|
||||
};
|
||||
|
@ -1206,7 +1205,7 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
pat_id: hir::HirId,
|
||||
span: Span,
|
||||
variant: &'tcx ty::VariantDef,
|
||||
fields: &'tcx [Spanned<hir::FieldPat>],
|
||||
fields: &'tcx [hir::FieldPat],
|
||||
etc: bool,
|
||||
def_bm: ty::BindingMode,
|
||||
) -> bool {
|
||||
|
@ -1231,7 +1230,8 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
|||
|
||||
let mut inexistent_fields = vec![];
|
||||
// Typecheck each field.
|
||||
for &Spanned { node: ref field, span } in fields {
|
||||
for field in fields {
|
||||
let span = field.span;
|
||||
let ident = tcx.adjust_ident(field.ident, variant.def_id);
|
||||
let field_ty = match used_fields.entry(ident) {
|
||||
Occupied(occupied) => {
|
||||
|
|
|
@ -283,7 +283,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
|
|||
}
|
||||
hir::PatKind::Struct(_, ref fields, _) => {
|
||||
for field in fields {
|
||||
self.visit_field_id(field.node.hir_id);
|
||||
self.visit_field_id(field.hir_id);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
|
|
|
@ -3,7 +3,6 @@ use super::*;
|
|||
use syntax_pos::DUMMY_SP;
|
||||
use syntax::ast::*;
|
||||
use syntax::attr;
|
||||
use syntax::source_map::dummy_spanned;
|
||||
use syntax::symbol::Symbol;
|
||||
use syntax::with_default_globals;
|
||||
|
||||
|
@ -181,7 +180,8 @@ fn test_parse_ok() {
|
|||
|
||||
let mi = attr::mk_name_value_item_str(
|
||||
Ident::from_str("all"),
|
||||
dummy_spanned(Symbol::intern("done"))
|
||||
Symbol::intern("done"),
|
||||
DUMMY_SP,
|
||||
);
|
||||
assert_eq!(Cfg::parse(&mi), Ok(name_value_cfg("all", "done")));
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ use rustc::util::nodemap::{FxHashMap, FxHashSet};
|
|||
use syntax::ast::{self, AttrStyle, Ident};
|
||||
use syntax::attr;
|
||||
use syntax::ext::base::MacroKind;
|
||||
use syntax::source_map::{dummy_spanned, Spanned};
|
||||
use syntax::source_map::DUMMY_SP;
|
||||
use syntax::symbol::{Symbol, kw, sym};
|
||||
use syntax::symbol::InternedString;
|
||||
use syntax_pos::{self, Pos, FileName};
|
||||
|
@ -930,8 +930,8 @@ impl Attributes {
|
|||
if attr.check_name(sym::enable) {
|
||||
if let Some(feat) = attr.value_str() {
|
||||
let meta = attr::mk_name_value_item_str(
|
||||
Ident::with_empty_ctxt(sym::target_feature),
|
||||
dummy_spanned(feat));
|
||||
Ident::with_empty_ctxt(sym::target_feature), feat, DUMMY_SP
|
||||
);
|
||||
if let Ok(feat_cfg) = Cfg::parse(&meta) {
|
||||
cfg &= feat_cfg;
|
||||
}
|
||||
|
@ -4102,8 +4102,7 @@ fn name_from_pat(p: &hir::Pat) -> String {
|
|||
PatKind::TupleStruct(ref p, ..) | PatKind::Path(ref p) => qpath_to_string(p),
|
||||
PatKind::Struct(ref name, ref fields, etc) => {
|
||||
format!("{} {{ {}{} }}", qpath_to_string(name),
|
||||
fields.iter().map(|&Spanned { node: ref fp, .. }|
|
||||
format!("{}: {}", fp.ident, name_from_pat(&*fp.pat)))
|
||||
fields.iter().map(|fp| format!("{}: {}", fp.ident, name_from_pat(&fp.pat)))
|
||||
.collect::<Vec<String>>().join(", "),
|
||||
if etc { ", .." } else { "" }
|
||||
)
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
|
||||
#![no_std]
|
||||
#![allow(non_camel_case_types)]
|
||||
#![allow(deprecated)] // FIXME: using `mem::uninitialized()`
|
||||
|
||||
include!("bitflags.rs");
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
#![allow(deprecated)] // mem::uninitialized
|
||||
|
||||
use crate::io::ErrorKind;
|
||||
use crate::mem;
|
||||
|
||||
|
|
|
@ -104,10 +104,11 @@ impl ReentrantMutex {
|
|||
},
|
||||
..mem::zeroed()
|
||||
};
|
||||
let mut event: abi::event = mem::uninitialized();
|
||||
let mut nevents: usize = mem::uninitialized();
|
||||
let ret = abi::poll(&subscription, &mut event, 1, &mut nevents);
|
||||
let mut event = MaybeUninit::<abi::event>::uninit();
|
||||
let mut nevents = MaybeUninit::<usize>::uninit();
|
||||
let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr());
|
||||
assert_eq!(ret, abi::errno::SUCCESS, "Failed to acquire mutex");
|
||||
let event = event.assume_init();
|
||||
assert_eq!(event.error, abi::errno::SUCCESS, "Failed to acquire mutex");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use crate::cell::UnsafeCell;
|
||||
use crate::mem;
|
||||
use crate::mem::MaybeUninit;
|
||||
use crate::sync::atomic::{AtomicU32, Ordering};
|
||||
use crate::sys::cloudabi::abi;
|
||||
|
||||
|
@ -73,10 +74,11 @@ impl RWLock {
|
|||
},
|
||||
..mem::zeroed()
|
||||
};
|
||||
let mut event: abi::event = mem::uninitialized();
|
||||
let mut nevents: usize = mem::uninitialized();
|
||||
let ret = abi::poll(&subscription, &mut event, 1, &mut nevents);
|
||||
let mut event = MaybeUninit::<abi::event>::uninit();
|
||||
let mut nevents = MaybeUninit::<usize>::uninit();
|
||||
let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr());
|
||||
assert_eq!(ret, abi::errno::SUCCESS, "Failed to acquire read lock");
|
||||
let event = event.assume_init();
|
||||
assert_eq!(
|
||||
event.error,
|
||||
abi::errno::SUCCESS,
|
||||
|
@ -182,10 +184,11 @@ impl RWLock {
|
|||
},
|
||||
..mem::zeroed()
|
||||
};
|
||||
let mut event: abi::event = mem::uninitialized();
|
||||
let mut nevents: usize = mem::uninitialized();
|
||||
let ret = abi::poll(&subscription, &mut event, 1, &mut nevents);
|
||||
let mut event = MaybeUninit::<abi::event>::uninit();
|
||||
let mut nevents = MaybeUninit::<usize>::uninit();
|
||||
let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr());
|
||||
assert_eq!(ret, abi::errno::SUCCESS, "Failed to acquire write lock");
|
||||
let event = event.assume_init();
|
||||
assert_eq!(
|
||||
event.error,
|
||||
abi::errno::SUCCESS,
|
||||
|
|
|
@ -72,10 +72,11 @@ impl Thread {
|
|||
},
|
||||
..mem::zeroed()
|
||||
};
|
||||
let mut event: abi::event = mem::uninitialized();
|
||||
let mut nevents: usize = mem::uninitialized();
|
||||
let ret = abi::poll(&subscription, &mut event, 1, &mut nevents);
|
||||
let mut event = mem::MaybeUninit::<abi::event>::uninit();
|
||||
let mut nevents = mem::MaybeUninit::<usize>::uninit();
|
||||
let ret = abi::poll(&subscription, event.as_mut_ptr(), 1, nevents.as_mut_ptr());
|
||||
assert_eq!(ret, abi::errno::SUCCESS);
|
||||
let event = event.assume_init();
|
||||
assert_eq!(event.error, abi::errno::SUCCESS);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -714,7 +714,7 @@ if #[cfg(target_vendor = "uwp")] {
|
|||
pub struct FILE_STANDARD_INFO {
|
||||
pub AllocationSize: LARGE_INTEGER,
|
||||
pub EndOfFile: LARGE_INTEGER,
|
||||
pub NumberOfLink: DWORD,
|
||||
pub NumberOfLinks: DWORD,
|
||||
pub DeletePending: BOOLEAN,
|
||||
pub Directory: BOOLEAN,
|
||||
}
|
||||
|
|
|
@ -357,7 +357,7 @@ impl File {
|
|||
size as c::DWORD))?;
|
||||
attr.file_size = info.AllocationSize as u64;
|
||||
attr.number_of_links = Some(info.NumberOfLinks);
|
||||
if attr.is_reparse_point() {
|
||||
if attr.file_type().is_reparse_point() {
|
||||
let mut b = [0; c::MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
|
||||
if let Ok((_, buf)) = self.reparse_point(&mut b) {
|
||||
attr.reparse_tag = buf.ReparseTag;
|
||||
|
|
|
@ -571,7 +571,7 @@ impl Pat {
|
|||
|
||||
match &self.node {
|
||||
PatKind::Ident(_, _, Some(p)) => p.walk(it),
|
||||
PatKind::Struct(_, fields, _) => fields.iter().all(|field| field.node.pat.walk(it)),
|
||||
PatKind::Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk(it)),
|
||||
PatKind::TupleStruct(_, s) | PatKind::Tuple(s) | PatKind::Slice(s) => {
|
||||
s.iter().all(|p| p.walk(it))
|
||||
}
|
||||
|
@ -609,6 +609,7 @@ pub struct FieldPat {
|
|||
pub is_shorthand: bool,
|
||||
pub attrs: ThinVec<Attribute>,
|
||||
pub id: NodeId,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)]
|
||||
|
@ -642,7 +643,7 @@ pub enum PatKind {
|
|||
|
||||
/// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`).
|
||||
/// The `bool` is `true` in the presence of a `..`.
|
||||
Struct(Path, Vec<Spanned<FieldPat>>, /* recovered */ bool),
|
||||
Struct(Path, Vec<FieldPat>, /* recovered */ bool),
|
||||
|
||||
/// A tuple struct/variant pattern (`Variant(x, y, .., z)`).
|
||||
TupleStruct(Path, Vec<P<Pat>>),
|
||||
|
@ -939,8 +940,6 @@ pub struct Field {
|
|||
pub id: NodeId,
|
||||
}
|
||||
|
||||
pub type SpannedIdent = Spanned<Ident>;
|
||||
|
||||
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)]
|
||||
pub enum BlockCheckMode {
|
||||
Default,
|
||||
|
@ -1287,8 +1286,6 @@ pub enum Movability {
|
|||
Movable,
|
||||
}
|
||||
|
||||
pub type Mac = Spanned<Mac_>;
|
||||
|
||||
/// Represents a macro invocation. The `Path` indicates which macro
|
||||
/// is being invoked, and the vector of token-trees contains the source
|
||||
/// of the macro invocation.
|
||||
|
@ -1296,10 +1293,11 @@ pub type Mac = Spanned<Mac_>;
|
|||
/// N.B., the additional ident for a `macro_rules`-style macro is actually
|
||||
/// stored in the enclosing item.
|
||||
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
|
||||
pub struct Mac_ {
|
||||
pub struct Mac {
|
||||
pub path: Path,
|
||||
pub delim: MacDelimiter,
|
||||
pub tts: TokenStream,
|
||||
pub span: Span,
|
||||
pub prior_type_ascription: Option<(Span, bool)>,
|
||||
}
|
||||
|
||||
|
@ -1310,7 +1308,7 @@ pub enum MacDelimiter {
|
|||
Brace,
|
||||
}
|
||||
|
||||
impl Mac_ {
|
||||
impl Mac {
|
||||
pub fn stream(&self) -> TokenStream {
|
||||
self.tts.clone()
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ use crate::ast::{AttrId, AttrStyle, Name, Ident, Path, PathSegment};
|
|||
use crate::ast::{MetaItem, MetaItemKind, NestedMetaItem};
|
||||
use crate::ast::{Lit, LitKind, Expr, Item, Local, Stmt, StmtKind, GenericParam};
|
||||
use crate::mut_visit::visit_clobber;
|
||||
use crate::source_map::{BytePos, Spanned, dummy_spanned};
|
||||
use crate::source_map::{BytePos, Spanned, DUMMY_SP};
|
||||
use crate::parse::lexer::comments::{doc_comment_style, strip_doc_comment_decoration};
|
||||
use crate::parse::parser::Parser;
|
||||
use crate::parse::{self, ParseSess, PResult};
|
||||
|
@ -328,7 +328,9 @@ impl Attribute {
|
|||
let comment = self.value_str().unwrap();
|
||||
let meta = mk_name_value_item_str(
|
||||
Ident::with_empty_ctxt(sym::doc),
|
||||
dummy_spanned(Symbol::intern(&strip_doc_comment_decoration(&comment.as_str()))));
|
||||
Symbol::intern(&strip_doc_comment_decoration(&comment.as_str())),
|
||||
DUMMY_SP,
|
||||
);
|
||||
f(&Attribute {
|
||||
id: self.id,
|
||||
style: self.style,
|
||||
|
@ -345,9 +347,9 @@ impl Attribute {
|
|||
|
||||
/* Constructors */
|
||||
|
||||
pub fn mk_name_value_item_str(ident: Ident, value: Spanned<Symbol>) -> MetaItem {
|
||||
let lit_kind = LitKind::Str(value.node, ast::StrStyle::Cooked);
|
||||
mk_name_value_item(ident, lit_kind, value.span)
|
||||
pub fn mk_name_value_item_str(ident: Ident, str: Symbol, str_span: Span) -> MetaItem {
|
||||
let lit_kind = LitKind::Str(str, ast::StrStyle::Cooked);
|
||||
mk_name_value_item(ident, lit_kind, str_span)
|
||||
}
|
||||
|
||||
pub fn mk_name_value_item(ident: Ident, lit_kind: LitKind, lit_span: Span) -> MetaItem {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use crate::ast::{self, Attribute, Name, PatKind};
|
||||
use crate::attr::{HasAttrs, Stability, Deprecation};
|
||||
use crate::source_map::{SourceMap, Spanned, respan};
|
||||
use crate::source_map::SourceMap;
|
||||
use crate::edition::Edition;
|
||||
use crate::ext::expand::{self, AstFragment, Invocation};
|
||||
use crate::ext::hygiene::{ExpnId, SyntaxContext, Transparency};
|
||||
|
@ -916,7 +916,7 @@ pub fn expr_to_spanned_string<'a>(
|
|||
cx: &'a mut ExtCtxt<'_>,
|
||||
mut expr: P<ast::Expr>,
|
||||
err_msg: &str,
|
||||
) -> Result<Spanned<(Symbol, ast::StrStyle)>, Option<DiagnosticBuilder<'a>>> {
|
||||
) -> Result<(Symbol, ast::StrStyle, Span), Option<DiagnosticBuilder<'a>>> {
|
||||
// Update `expr.span`'s ctxt now in case expr is an `include!` macro invocation.
|
||||
expr.span = expr.span.apply_mark(cx.current_expansion.id);
|
||||
|
||||
|
@ -926,7 +926,7 @@ pub fn expr_to_spanned_string<'a>(
|
|||
|
||||
Err(match expr.node {
|
||||
ast::ExprKind::Lit(ref l) => match l.node {
|
||||
ast::LitKind::Str(s, style) => return Ok(respan(expr.span, (s, style))),
|
||||
ast::LitKind::Str(s, style) => return Ok((s, style, expr.span)),
|
||||
ast::LitKind::Err(_) => None,
|
||||
_ => Some(cx.struct_span_err(l.span, err_msg))
|
||||
},
|
||||
|
@ -940,7 +940,7 @@ pub fn expr_to_string(cx: &mut ExtCtxt<'_>, expr: P<ast::Expr>, err_msg: &str)
|
|||
expr_to_spanned_string(cx, expr, err_msg)
|
||||
.map_err(|err| err.map(|mut err| err.emit()))
|
||||
.ok()
|
||||
.map(|s| s.node)
|
||||
.map(|(symbol, style, _)| (symbol, style))
|
||||
}
|
||||
|
||||
/// Non-fatally assert that `tts` is empty. Note that this function
|
||||
|
|
|
@ -575,7 +575,7 @@ impl<'a> ExtCtxt<'a> {
|
|||
self.pat(span, PatKind::TupleStruct(path, subpats))
|
||||
}
|
||||
pub fn pat_struct(&self, span: Span, path: ast::Path,
|
||||
field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat> {
|
||||
field_pats: Vec<ast::FieldPat>) -> P<ast::Pat> {
|
||||
self.pat(span, PatKind::Struct(path, field_pats, false))
|
||||
}
|
||||
pub fn pat_tuple(&self, span: Span, pats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use crate::ast::{self, Block, Ident, LitKind, NodeId, PatKind, Path};
|
||||
use crate::ast::{MacStmtStyle, StmtKind, ItemKind};
|
||||
use crate::attr::{self, HasAttrs};
|
||||
use crate::source_map::{dummy_spanned, respan};
|
||||
use crate::source_map::respan;
|
||||
use crate::config::StripUnconfigured;
|
||||
use crate::ext::base::*;
|
||||
use crate::ext::proc_macro::collect_derives;
|
||||
|
@ -492,22 +492,21 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
InvocationKind::Bang { mac, .. } => match ext {
|
||||
SyntaxExtensionKind::Bang(expander) => {
|
||||
self.gate_proc_macro_expansion_kind(span, fragment_kind);
|
||||
let tok_result = expander.expand(self.cx, span, mac.node.stream());
|
||||
let tok_result = expander.expand(self.cx, span, mac.stream());
|
||||
let result =
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &mac.node.path, span);
|
||||
self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span);
|
||||
self.gate_proc_macro_expansion(span, &result);
|
||||
result
|
||||
}
|
||||
SyntaxExtensionKind::LegacyBang(expander) => {
|
||||
let prev = self.cx.current_expansion.prior_type_ascription;
|
||||
self.cx.current_expansion.prior_type_ascription =
|
||||
mac.node.prior_type_ascription;
|
||||
let tok_result = expander.expand(self.cx, span, mac.node.stream());
|
||||
self.cx.current_expansion.prior_type_ascription = mac.prior_type_ascription;
|
||||
let tok_result = expander.expand(self.cx, span, mac.stream());
|
||||
let result = if let Some(result) = fragment_kind.make_from(tok_result) {
|
||||
result
|
||||
} else {
|
||||
let msg = format!("non-{kind} macro in {kind} position: {path}",
|
||||
kind = fragment_kind.name(), path = mac.node.path);
|
||||
kind = fragment_kind.name(), path = mac.path);
|
||||
self.cx.span_err(span, &msg);
|
||||
self.cx.trace_macros_diag();
|
||||
fragment_kind.dummy(span)
|
||||
|
@ -1251,13 +1250,15 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
|||
ast::NestedMetaItem::MetaItem(
|
||||
attr::mk_name_value_item_str(
|
||||
Ident::with_empty_ctxt(sym::file),
|
||||
dummy_spanned(file),
|
||||
file,
|
||||
DUMMY_SP,
|
||||
),
|
||||
),
|
||||
ast::NestedMetaItem::MetaItem(
|
||||
attr::mk_name_value_item_str(
|
||||
Ident::with_empty_ctxt(sym::contents),
|
||||
dummy_spanned(src_interned),
|
||||
src_interned,
|
||||
DUMMY_SP,
|
||||
),
|
||||
),
|
||||
];
|
||||
|
|
|
@ -14,12 +14,13 @@ use rustc_data_structures::fx::FxHashMap;
|
|||
|
||||
pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment {
|
||||
fn mac_placeholder() -> ast::Mac {
|
||||
dummy_spanned(ast::Mac_ {
|
||||
ast::Mac {
|
||||
path: ast::Path { span: DUMMY_SP, segments: Vec::new() },
|
||||
tts: TokenStream::empty().into(),
|
||||
delim: ast::MacDelimiter::Brace,
|
||||
span: DUMMY_SP,
|
||||
prior_type_ascription: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
let ident = ast::Ident::invalid();
|
||||
|
|
|
@ -533,8 +533,8 @@ pub fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
|
|||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_mac<T: MutVisitor>(Spanned { node, span }: &mut Mac, vis: &mut T) {
|
||||
let Mac_ { path, delim: _, tts, .. } = node;
|
||||
pub fn noop_visit_mac<T: MutVisitor>(mac: &mut Mac, vis: &mut T) {
|
||||
let Mac { path, delim: _, tts, span, prior_type_ascription: _ } = mac;
|
||||
vis.visit_path(path);
|
||||
vis.visit_tts(tts);
|
||||
vis.visit_span(span);
|
||||
|
@ -1042,10 +1042,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
|
|||
}
|
||||
PatKind::Struct(path, fields, _etc) => {
|
||||
vis.visit_path(path);
|
||||
for Spanned {
|
||||
node: FieldPat { ident, pat, is_shorthand: _, attrs, id },
|
||||
span
|
||||
} in fields {
|
||||
for FieldPat { ident, pat, is_shorthand: _, attrs, id, span } in fields {
|
||||
vis.visit_ident(ident);
|
||||
vis.visit_id(id);
|
||||
vis.visit_pat(pat);
|
||||
|
|
|
@ -8,13 +8,13 @@ use crate::ast::{self, Attribute, AttrStyle, Ident, CaptureBy, BlockCheckMode};
|
|||
use crate::ast::{Expr, ExprKind, RangeLimits, Label, Movability, IsAsync, Arm};
|
||||
use crate::ast::{Ty, TyKind, FunctionRetTy, Arg, FnDecl};
|
||||
use crate::ast::{BinOpKind, BinOp, UnOp};
|
||||
use crate::ast::{Mac_, AnonConst, Field};
|
||||
use crate::ast::{Mac, AnonConst, Field};
|
||||
|
||||
use crate::parse::classify;
|
||||
use crate::parse::token::{self, Token};
|
||||
use crate::parse::diagnostics::{Error};
|
||||
use crate::print::pprust;
|
||||
use crate::source_map::{self, respan, Span};
|
||||
use crate::source_map::{self, Span};
|
||||
use crate::symbol::{kw, sym};
|
||||
use crate::util::parser::{AssocOp, Fixity, prec_let_scrutinee_needs_par};
|
||||
|
||||
|
@ -1011,12 +1011,13 @@ impl<'a> Parser<'a> {
|
|||
// MACRO INVOCATION expression
|
||||
let (delim, tts) = self.expect_delimited_token_tree()?;
|
||||
hi = self.prev_span;
|
||||
ex = ExprKind::Mac(respan(lo.to(hi), Mac_ {
|
||||
ex = ExprKind::Mac(Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: lo.to(hi),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
}));
|
||||
});
|
||||
} else if self.check(&token::OpenDelim(token::Brace)) {
|
||||
if let Some(expr) = self.maybe_parse_struct_expr(lo, &path, &attrs) {
|
||||
return expr;
|
||||
|
|
|
@ -10,7 +10,7 @@ use crate::ast::{Visibility, VisibilityKind, Mutability, FnDecl, FnHeader};
|
|||
use crate::ast::{ForeignItem, ForeignItemKind};
|
||||
use crate::ast::{Ty, TyKind, GenericBounds, TraitRef};
|
||||
use crate::ast::{EnumDef, VariantData, StructField, AnonConst};
|
||||
use crate::ast::{Mac, Mac_, MacDelimiter};
|
||||
use crate::ast::{Mac, MacDelimiter};
|
||||
use crate::ext::base::DummyResult;
|
||||
use crate::parse::token;
|
||||
use crate::parse::parser::maybe_append;
|
||||
|
@ -530,12 +530,13 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
let hi = self.prev_span;
|
||||
let mac = respan(mac_lo.to(hi), Mac_ {
|
||||
let mac = Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: mac_lo.to(hi),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
});
|
||||
};
|
||||
let item =
|
||||
self.mk_item(lo.to(hi), Ident::invalid(), ItemKind::Mac(mac), visibility, attrs);
|
||||
return Ok(Some(item));
|
||||
|
@ -604,12 +605,13 @@ impl<'a> Parser<'a> {
|
|||
self.expect(&token::Semi)?;
|
||||
}
|
||||
|
||||
Ok(Some(respan(lo.to(self.prev_span), Mac_ {
|
||||
Ok(Some(Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: lo.to(self.prev_span),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
})))
|
||||
}))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ use super::{Parser, PResult, PathStyle};
|
|||
|
||||
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
|
||||
use crate::ptr::P;
|
||||
use crate::ast::{self, Attribute, Pat, PatKind, FieldPat, RangeEnd, RangeSyntax, Mac_};
|
||||
use crate::ast::{self, Attribute, Pat, PatKind, FieldPat, RangeEnd, RangeSyntax, Mac};
|
||||
use crate::ast::{BindingMode, Ident, Mutability, Path, QSelf, Expr, ExprKind};
|
||||
use crate::parse::token::{self};
|
||||
use crate::print::pprust;
|
||||
|
@ -275,12 +275,13 @@ impl<'a> Parser<'a> {
|
|||
fn parse_pat_mac_invoc(&mut self, lo: Span, path: Path) -> PResult<'a, PatKind> {
|
||||
self.bump();
|
||||
let (delim, tts) = self.expect_delimited_token_tree()?;
|
||||
let mac = respan(lo.to(self.prev_span), Mac_ {
|
||||
let mac = Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: lo.to(self.prev_span),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
});
|
||||
};
|
||||
Ok(PatKind::Mac(mac))
|
||||
}
|
||||
|
||||
|
@ -487,7 +488,7 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Parses the fields of a struct-like pattern.
|
||||
fn parse_pat_fields(&mut self) -> PResult<'a, (Vec<Spanned<FieldPat>>, bool)> {
|
||||
fn parse_pat_fields(&mut self) -> PResult<'a, (Vec<FieldPat>, bool)> {
|
||||
let mut fields = Vec::new();
|
||||
let mut etc = false;
|
||||
let mut ate_comma = true;
|
||||
|
@ -619,11 +620,7 @@ impl<'a> Parser<'a> {
|
|||
.emit();
|
||||
}
|
||||
|
||||
fn parse_pat_field(
|
||||
&mut self,
|
||||
lo: Span,
|
||||
attrs: Vec<Attribute>
|
||||
) -> PResult<'a, Spanned<FieldPat>> {
|
||||
fn parse_pat_field(&mut self, lo: Span, attrs: Vec<Attribute>) -> PResult<'a, FieldPat> {
|
||||
// Check if a colon exists one ahead. This means we're parsing a fieldname.
|
||||
let hi;
|
||||
let (subpat, fieldname, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) {
|
||||
|
@ -658,15 +655,13 @@ impl<'a> Parser<'a> {
|
|||
(subpat, fieldname, true)
|
||||
};
|
||||
|
||||
Ok(Spanned {
|
||||
Ok(FieldPat {
|
||||
ident: fieldname,
|
||||
pat: subpat,
|
||||
is_shorthand,
|
||||
attrs: attrs.into(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: lo.to(hi),
|
||||
node: FieldPat {
|
||||
ident: fieldname,
|
||||
pat: subpat,
|
||||
is_shorthand,
|
||||
attrs: attrs.into(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ use super::path::PathStyle;
|
|||
use crate::ptr::P;
|
||||
use crate::{maybe_whole, ThinVec};
|
||||
use crate::ast::{self, Stmt, StmtKind, Local, Block, BlockCheckMode, Expr, ExprKind};
|
||||
use crate::ast::{Attribute, AttrStyle, VisibilityKind, MacStmtStyle, Mac_, MacDelimiter};
|
||||
use crate::ast::{Attribute, AttrStyle, VisibilityKind, MacStmtStyle, Mac, MacDelimiter};
|
||||
use crate::ext::base::DummyResult;
|
||||
use crate::parse::{classify, DirectoryOwnership};
|
||||
use crate::parse::diagnostics::Error;
|
||||
|
@ -99,12 +99,13 @@ impl<'a> Parser<'a> {
|
|||
MacStmtStyle::NoBraces
|
||||
};
|
||||
|
||||
let mac = respan(lo.to(hi), Mac_ {
|
||||
let mac = Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: lo.to(hi),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
});
|
||||
};
|
||||
let node = if delim == MacDelimiter::Brace ||
|
||||
self.token == token::Semi || self.token == token::Eof {
|
||||
StmtKind::Mac(P((mac, style, attrs.into())))
|
||||
|
|
|
@ -4,9 +4,9 @@ use crate::{maybe_whole, maybe_recover_from_interpolated_ty_qpath};
|
|||
use crate::ptr::P;
|
||||
use crate::ast::{self, Ty, TyKind, MutTy, BareFnTy, FunctionRetTy, GenericParam, Lifetime, Ident};
|
||||
use crate::ast::{TraitBoundModifier, TraitObjectSyntax, GenericBound, GenericBounds, PolyTraitRef};
|
||||
use crate::ast::{Mutability, AnonConst, FnDecl, Mac_};
|
||||
use crate::ast::{Mutability, AnonConst, FnDecl, Mac};
|
||||
use crate::parse::token::{self, Token};
|
||||
use crate::source_map::{respan, Span};
|
||||
use crate::source_map::Span;
|
||||
use crate::symbol::{kw};
|
||||
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
@ -175,13 +175,14 @@ impl<'a> Parser<'a> {
|
|||
if self.eat(&token::Not) {
|
||||
// Macro invocation in type position
|
||||
let (delim, tts) = self.expect_delimited_token_tree()?;
|
||||
let node = Mac_ {
|
||||
let mac = Mac {
|
||||
path,
|
||||
tts,
|
||||
delim,
|
||||
span: lo.to(self.prev_span),
|
||||
prior_type_ascription: self.last_type_ascription,
|
||||
};
|
||||
TyKind::Mac(respan(lo.to(self.prev_span), node))
|
||||
TyKind::Mac(mac)
|
||||
} else {
|
||||
// Just a type path or bound list (trait object type) starting with a trait.
|
||||
// `Type`
|
||||
|
|
|
@ -172,8 +172,8 @@ fn get_spans_of_pat_idents(src: &str) -> Vec<Span> {
|
|||
impl<'a> crate::visit::Visitor<'a> for PatIdentVisitor {
|
||||
fn visit_pat(&mut self, p: &'a ast::Pat) {
|
||||
match p.node {
|
||||
PatKind::Ident(_ , ref spannedident, _) => {
|
||||
self.spans.push(spannedident.span.clone());
|
||||
PatKind::Ident(_ , ref ident, _) => {
|
||||
self.spans.push(ident.span.clone());
|
||||
}
|
||||
_ => {
|
||||
crate::visit::walk_pat(self, p);
|
||||
|
@ -273,7 +273,7 @@ fn ttdelim_span() {
|
|||
"foo!( fn main() { body } )".to_string(), &sess).unwrap();
|
||||
|
||||
let tts: Vec<_> = match expr.node {
|
||||
ast::ExprKind::Mac(ref mac) => mac.node.stream().trees().collect(),
|
||||
ast::ExprKind::Mac(ref mac) => mac.stream().trees().collect(),
|
||||
_ => panic!("not a macro"),
|
||||
};
|
||||
|
||||
|
|
|
@ -1067,7 +1067,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
ast::ForeignItemKind::Macro(ref m) => {
|
||||
self.print_mac(m);
|
||||
match m.node.delim {
|
||||
match m.delim {
|
||||
MacDelimiter::Brace => {},
|
||||
_ => self.s.word(";")
|
||||
}
|
||||
|
@ -1341,7 +1341,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
ast::ItemKind::Mac(ref mac) => {
|
||||
self.print_mac(mac);
|
||||
match mac.node.delim {
|
||||
match mac.delim {
|
||||
MacDelimiter::Brace => {}
|
||||
_ => self.s.word(";"),
|
||||
}
|
||||
|
@ -1554,7 +1554,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
ast::TraitItemKind::Macro(ref mac) => {
|
||||
self.print_mac(mac);
|
||||
match mac.node.delim {
|
||||
match mac.delim {
|
||||
MacDelimiter::Brace => {}
|
||||
_ => self.s.word(";"),
|
||||
}
|
||||
|
@ -1591,7 +1591,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
ast::ImplItemKind::Macro(ref mac) => {
|
||||
self.print_mac(mac);
|
||||
match mac.node.delim {
|
||||
match mac.delim {
|
||||
MacDelimiter::Brace => {}
|
||||
_ => self.s.word(";"),
|
||||
}
|
||||
|
@ -1749,11 +1749,11 @@ impl<'a> State<'a> {
|
|||
|
||||
crate fn print_mac(&mut self, m: &ast::Mac) {
|
||||
self.print_mac_common(
|
||||
Some(MacHeader::Path(&m.node.path)),
|
||||
Some(MacHeader::Path(&m.path)),
|
||||
true,
|
||||
None,
|
||||
m.node.delim.to_token(),
|
||||
m.node.stream(),
|
||||
m.delim.to_token(),
|
||||
m.stream(),
|
||||
true,
|
||||
m.span,
|
||||
);
|
||||
|
@ -2367,14 +2367,14 @@ impl<'a> State<'a> {
|
|||
Consistent, &fields[..],
|
||||
|s, f| {
|
||||
s.cbox(INDENT_UNIT);
|
||||
if !f.node.is_shorthand {
|
||||
s.print_ident(f.node.ident);
|
||||
if !f.is_shorthand {
|
||||
s.print_ident(f.ident);
|
||||
s.word_nbsp(":");
|
||||
}
|
||||
s.print_pat(&f.node.pat);
|
||||
s.print_pat(&f.pat);
|
||||
s.end();
|
||||
},
|
||||
|f| f.node.pat.span);
|
||||
|f| f.pat.span);
|
||||
if etc {
|
||||
if !fields.is_empty() { self.word_space(","); }
|
||||
self.s.word("..");
|
||||
|
|
|
@ -442,9 +442,9 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
|
|||
PatKind::Struct(ref path, ref fields, _) => {
|
||||
visitor.visit_path(path, pattern.id);
|
||||
for field in fields {
|
||||
walk_list!(visitor, visit_attribute, field.node.attrs.iter());
|
||||
visitor.visit_ident(field.node.ident);
|
||||
visitor.visit_pat(&field.node.pat)
|
||||
walk_list!(visitor, visit_attribute, field.attrs.iter());
|
||||
visitor.visit_ident(field.ident);
|
||||
visitor.visit_pat(&field.pat)
|
||||
}
|
||||
}
|
||||
PatKind::Tuple(ref elems) => {
|
||||
|
@ -663,7 +663,7 @@ pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) {
|
|||
}
|
||||
|
||||
pub fn walk_mac<'a, V: Visitor<'a>>(visitor: &mut V, mac: &'a Mac) {
|
||||
visitor.visit_path(&mac.node.path, DUMMY_NODE_ID);
|
||||
visitor.visit_path(&mac.path, DUMMY_NODE_ID);
|
||||
}
|
||||
|
||||
pub fn walk_anon_const<'a, V: Visitor<'a>>(visitor: &mut V, constant: &'a AnonConst) {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
use errors::{Applicability, DiagnosticBuilder};
|
||||
|
||||
use syntax::ast::{self, *};
|
||||
use syntax::source_map::Spanned;
|
||||
use syntax::ext::base::*;
|
||||
use syntax::parse::token::{self, TokenKind};
|
||||
use syntax::parse::parser::Parser;
|
||||
|
@ -25,7 +24,7 @@ pub fn expand_assert<'cx>(
|
|||
};
|
||||
|
||||
let sp = sp.apply_mark(cx.current_expansion.id);
|
||||
let panic_call = Mac_ {
|
||||
let panic_call = Mac {
|
||||
path: Path::from_ident(Ident::new(sym::panic, sp)),
|
||||
tts: custom_message.unwrap_or_else(|| {
|
||||
TokenStream::from(TokenTree::token(
|
||||
|
@ -37,6 +36,7 @@ pub fn expand_assert<'cx>(
|
|||
))
|
||||
}).into(),
|
||||
delim: MacDelimiter::Parenthesis,
|
||||
span: sp,
|
||||
prior_type_ascription: None,
|
||||
};
|
||||
let if_expr = cx.expr_if(
|
||||
|
@ -44,10 +44,7 @@ pub fn expand_assert<'cx>(
|
|||
cx.expr(sp, ExprKind::Unary(UnOp::Not, cond_expr)),
|
||||
cx.expr(
|
||||
sp,
|
||||
ExprKind::Mac(Spanned {
|
||||
span: sp,
|
||||
node: panic_call,
|
||||
}),
|
||||
ExprKind::Mac(panic_call),
|
||||
),
|
||||
None,
|
||||
);
|
||||
|
|
|
@ -187,7 +187,7 @@ use syntax::ast::{self, BinOpKind, EnumDef, Expr, Generics, Ident, PatKind};
|
|||
use syntax::ast::{VariantData, GenericParamKind, GenericArg};
|
||||
use syntax::attr;
|
||||
use syntax::ext::base::{Annotatable, ExtCtxt, SpecialDerives};
|
||||
use syntax::source_map::{self, respan};
|
||||
use syntax::source_map::respan;
|
||||
use syntax::util::map_in_place::MapInPlace;
|
||||
use syntax::ptr::P;
|
||||
use syntax::symbol::{Symbol, kw, sym};
|
||||
|
@ -1610,15 +1610,13 @@ impl<'a> TraitDef<'a> {
|
|||
if ident.is_none() {
|
||||
cx.span_bug(sp, "a braced struct with unnamed fields in `derive`");
|
||||
}
|
||||
source_map::Spanned {
|
||||
ast::FieldPat {
|
||||
ident: ident.unwrap(),
|
||||
is_shorthand: false,
|
||||
attrs: ThinVec::new(),
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
span: pat.span.with_ctxt(self.span.ctxt()),
|
||||
node: ast::FieldPat {
|
||||
id: ast::DUMMY_NODE_ID,
|
||||
ident: ident.unwrap(),
|
||||
pat,
|
||||
is_shorthand: false,
|
||||
attrs: ThinVec::new(),
|
||||
},
|
||||
pat,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
|
|
@ -846,9 +846,9 @@ pub fn expand_preparsed_format_args(
|
|||
|
||||
let msg = "format argument must be a string literal";
|
||||
let fmt_sp = efmt.span;
|
||||
let fmt = match expr_to_spanned_string(ecx, efmt, msg) {
|
||||
let (fmt_str, fmt_style, fmt_span) = match expr_to_spanned_string(ecx, efmt, msg) {
|
||||
Ok(mut fmt) if append_newline => {
|
||||
fmt.node.0 = Symbol::intern(&format!("{}\n", fmt.node.0));
|
||||
fmt.0 = Symbol::intern(&format!("{}\n", fmt.0));
|
||||
fmt
|
||||
}
|
||||
Ok(fmt) => fmt,
|
||||
|
@ -875,7 +875,7 @@ pub fn expand_preparsed_format_args(
|
|||
_ => (false, None),
|
||||
};
|
||||
|
||||
let str_style = match fmt.node.1 {
|
||||
let str_style = match fmt_style {
|
||||
ast::StrStyle::Cooked => None,
|
||||
ast::StrStyle::Raw(raw) => {
|
||||
Some(raw as usize)
|
||||
|
@ -981,7 +981,7 @@ pub fn expand_preparsed_format_args(
|
|||
vec![]
|
||||
};
|
||||
|
||||
let fmt_str = &*fmt.node.0.as_str(); // for the suggestions below
|
||||
let fmt_str = &*fmt_str.as_str(); // for the suggestions below
|
||||
let mut parser = parse::Parser::new(fmt_str, str_style, skips, append_newline);
|
||||
|
||||
let mut unverified_pieces = Vec::new();
|
||||
|
@ -995,7 +995,7 @@ pub fn expand_preparsed_format_args(
|
|||
|
||||
if !parser.errors.is_empty() {
|
||||
let err = parser.errors.remove(0);
|
||||
let sp = fmt.span.from_inner(err.span);
|
||||
let sp = fmt_span.from_inner(err.span);
|
||||
let mut e = ecx.struct_span_err(sp, &format!("invalid format string: {}",
|
||||
err.description));
|
||||
e.span_label(sp, err.label + " in format string");
|
||||
|
@ -1003,7 +1003,7 @@ pub fn expand_preparsed_format_args(
|
|||
e.note(¬e);
|
||||
}
|
||||
if let Some((label, span)) = err.secondary_label {
|
||||
let sp = fmt.span.from_inner(span);
|
||||
let sp = fmt_span.from_inner(span);
|
||||
e.span_label(sp, label);
|
||||
}
|
||||
e.emit();
|
||||
|
@ -1011,7 +1011,7 @@ pub fn expand_preparsed_format_args(
|
|||
}
|
||||
|
||||
let arg_spans = parser.arg_places.iter()
|
||||
.map(|span| fmt.span.from_inner(*span))
|
||||
.map(|span| fmt_span.from_inner(*span))
|
||||
.collect();
|
||||
|
||||
let named_pos: FxHashSet<usize> = names.values().cloned().collect();
|
||||
|
@ -1034,7 +1034,7 @@ pub fn expand_preparsed_format_args(
|
|||
str_pieces: Vec::with_capacity(unverified_pieces.len()),
|
||||
all_pieces_simple: true,
|
||||
macsp,
|
||||
fmtsp: fmt.span,
|
||||
fmtsp: fmt_span,
|
||||
invalid_refs: Vec::new(),
|
||||
arg_spans,
|
||||
arg_with_formatting: Vec::new(),
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// ignore-wasm32-bare compiled with panic=abort by default
|
||||
// ignore-tidy-linelength
|
||||
// compile-flags: -Z mir-emit-retag -Z mir-opt-level=0 -Z span_free_formats
|
||||
|
||||
|
@ -11,6 +12,10 @@ impl Test {
|
|||
fn foo_shr<'x>(&self, x: &'x i32) -> &'x i32 { x }
|
||||
}
|
||||
|
||||
impl Drop for Test {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut x = 0;
|
||||
{
|
||||
|
@ -60,10 +65,12 @@ fn main() {
|
|||
// ...
|
||||
// bb0: {
|
||||
// ...
|
||||
// _3 = const Test::foo(move _4, move _6) -> bb1;
|
||||
// _3 = const Test::foo(move _4, move _6) -> [return: bb2, unwind: bb3];
|
||||
// }
|
||||
//
|
||||
// bb1: {
|
||||
// ...
|
||||
//
|
||||
// bb2: {
|
||||
// Retag(_3);
|
||||
// ...
|
||||
// _9 = move _3;
|
||||
|
@ -80,25 +87,20 @@ fn main() {
|
|||
// _12 = move _13 as *mut i32 (Misc);
|
||||
// Retag([raw] _12);
|
||||
// ...
|
||||
// _16 = move _17(move _18) -> bb2;
|
||||
// _16 = move _17(move _18) -> bb5;
|
||||
// }
|
||||
//
|
||||
// bb2: {
|
||||
// bb5: {
|
||||
// Retag(_16);
|
||||
// ...
|
||||
// _20 = const Test::foo_shr(move _21, move _23) -> bb3;
|
||||
// }
|
||||
//
|
||||
// bb3: {
|
||||
// ...
|
||||
// return;
|
||||
// _20 = const Test::foo_shr(move _21, move _23) -> [return: bb6, unwind: bb7];
|
||||
// }
|
||||
//
|
||||
// ...
|
||||
// }
|
||||
// END rustc.main.EraseRegions.after.mir
|
||||
// START rustc.main-{{closure}}.EraseRegions.after.mir
|
||||
// fn main::{{closure}}#0(_1: &[closure@HirId { owner: DefIndex(20), local_id: 72 }], _2: &i32) -> &i32 {
|
||||
// fn main::{{closure}}#0(_1: &[closure@HirId { owner: DefIndex(22), local_id: 72 }], _2: &i32) -> &i32 {
|
||||
// ...
|
||||
// bb0: {
|
||||
// Retag([fn entry] _1);
|
||||
|
@ -113,3 +115,17 @@ fn main() {
|
|||
// }
|
||||
// }
|
||||
// END rustc.main-{{closure}}.EraseRegions.after.mir
|
||||
// START rustc.ptr-real_drop_in_place.Test.SimplifyCfg-make_shim.after.mir
|
||||
// fn std::ptr::real_drop_in_place(_1: &mut Test) -> () {
|
||||
// ...
|
||||
// bb0: {
|
||||
// Retag([raw] _1);
|
||||
// _2 = &mut (*_1);
|
||||
// _3 = const <Test as std::ops::Drop>::drop(move _2) -> bb1;
|
||||
// }
|
||||
//
|
||||
// bb1: {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// END rustc.ptr-real_drop_in_place.Test.SimplifyCfg-make_shim.after.mir
|
||||
|
|
14
src/test/ui/consts/auxiliary/issue-63226.rs
Normal file
14
src/test/ui/consts/auxiliary/issue-63226.rs
Normal file
|
@ -0,0 +1,14 @@
|
|||
pub struct VTable{
|
||||
state:extern fn(),
|
||||
}
|
||||
|
||||
impl VTable{
|
||||
pub const fn vtable()->&'static VTable{
|
||||
Self::VTABLE
|
||||
}
|
||||
|
||||
const VTABLE: &'static VTable =
|
||||
&VTable{state};
|
||||
}
|
||||
|
||||
extern fn state() {}
|
12
src/test/ui/consts/issue-63226.rs
Normal file
12
src/test/ui/consts/issue-63226.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
// aux-build:issue-63226.rs
|
||||
// compile-flags:--extern issue_63226
|
||||
// edition:2018
|
||||
// build-pass
|
||||
// A regression test for issue #63226.
|
||||
// Checks if `const fn` is marked as reachable.
|
||||
|
||||
use issue_63226::VTable;
|
||||
|
||||
static ICE_ICE:&'static VTable=VTable::vtable();
|
||||
|
||||
fn main() {}
|
31
src/test/ui/issues/issue-50301.rs
Normal file
31
src/test/ui/issues/issue-50301.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
// Tests that HRTBs are correctly accepted -- https://github.com/rust-lang/rust/issues/50301
|
||||
// check-pass
|
||||
trait Trait
|
||||
where
|
||||
for<'a> &'a Self::IntoIter: IntoIterator<Item = u32>,
|
||||
{
|
||||
type IntoIter;
|
||||
fn get(&self) -> Self::IntoIter;
|
||||
}
|
||||
|
||||
struct Impl(Vec<u32>);
|
||||
|
||||
impl Trait for Impl {
|
||||
type IntoIter = ImplIntoIter;
|
||||
fn get(&self) -> Self::IntoIter {
|
||||
ImplIntoIter(self.0.clone())
|
||||
}
|
||||
}
|
||||
|
||||
struct ImplIntoIter(Vec<u32>);
|
||||
|
||||
impl<'a> IntoIterator for &'a ImplIntoIter {
|
||||
type Item = <Self::IntoIter as Iterator>::Item;
|
||||
type IntoIter = std::iter::Cloned<std::slice::Iter<'a, u32>>;
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
(&self.0).into_iter().cloned()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
}
|
Loading…
Add table
Reference in a new issue