Skip to content

Commit

Permalink
Rollup merge of #74336 - davidtwco:issue-73112-cross-crate-packed-typ…
Browse files Browse the repository at this point in the history
…e-diagnostic, r=estebank

typeck: use `item_name` in cross-crate packed diag

Fixes #73112.

This PR replaces the use of `expect_local` and `hir().get` to fetch the identifier for a ADT with `item_name` - which works across crates.
  • Loading branch information
Manishearth authored Jul 14, 2020
2 parents aedb7c3 + d9485be commit c4fcf5a
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 25 deletions.
47 changes: 22 additions & 25 deletions src/librustc_typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ use rustc_hir::itemlikevisit::ItemLikeVisitor;
use rustc_hir::lang_items::{
FutureTraitLangItem, PinTypeLangItem, SizedTraitLangItem, VaListTypeLangItem,
};
use rustc_hir::{ExprKind, GenericArg, HirIdMap, Item, ItemKind, Node, PatKind, QPath};
use rustc_hir::{ExprKind, GenericArg, HirIdMap, ItemKind, Node, PatKind, QPath};
use rustc_index::bit_set::BitSet;
use rustc_index::vec::Idx;
use rustc_infer::infer;
Expand Down Expand Up @@ -2625,34 +2625,31 @@ fn check_packed(tcx: TyCtxt<'_>, sp: Span, def: &ty::AdtDef) {
"packed type cannot transitively contain a `#[repr(align)]` type"
);

let hir = tcx.hir();
let hir_id = hir.as_local_hir_id(def_spans[0].0.expect_local());
if let Node::Item(Item { ident, .. }) = hir.get(hir_id) {
err.span_note(
tcx.def_span(def_spans[0].0),
&format!("`{}` has a `#[repr(align)]` attribute", ident),
);
}
err.span_note(
tcx.def_span(def_spans[0].0),
&format!(
"`{}` has a `#[repr(align)]` attribute",
tcx.item_name(def_spans[0].0)
),
);

if def_spans.len() > 2 {
let mut first = true;
for (adt_def, span) in def_spans.iter().skip(1).rev() {
let hir_id = hir.as_local_hir_id(adt_def.expect_local());
if let Node::Item(Item { ident, .. }) = hir.get(hir_id) {
err.span_note(
*span,
&if first {
format!(
"`{}` contains a field of type `{}`",
tcx.type_of(def.did),
ident
)
} else {
format!("...which contains a field of type `{}`", ident)
},
);
first = false;
}
let ident = tcx.item_name(*adt_def);
err.span_note(
*span,
&if first {
format!(
"`{}` contains a field of type `{}`",
tcx.type_of(def.did),
ident
)
} else {
format!("...which contains a field of type `{}`", ident)
},
);
first = false;
}
}

Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/issues/auxiliary/issue-73112.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#[repr(transparent)]
pub struct PageTableEntry {
entry: u64,
}

#[repr(align(4096))]
#[repr(C)]
pub struct PageTable {
entries: [PageTableEntry; 512],
}
13 changes: 13 additions & 0 deletions src/test/ui/issues/issue-73112.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// aux-build:issue-73112.rs

extern crate issue_73112;

fn main() {
use issue_73112::PageTable;

#[repr(C, packed)]
struct SomeStruct {
//~^ ERROR packed type cannot transitively contain a `#[repr(align)]` type [E0588]
page_table: PageTable,
}
}
20 changes: 20 additions & 0 deletions src/test/ui/issues/issue-73112.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error[E0588]: packed type cannot transitively contain a `#[repr(align)]` type
--> $DIR/issue-73112.rs:9:5
|
LL | / struct SomeStruct {
LL | |
LL | | page_table: PageTable,
LL | | }
| |_____^
|
note: `PageTable` has a `#[repr(align)]` attribute
--> $DIR/auxiliary/issue-73112.rs:8:1
|
LL | / pub struct PageTable {
LL | | entries: [PageTableEntry; 512],
LL | | }
| |_^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0588`.

0 comments on commit c4fcf5a

Please sign in to comment.