Don't ICE when using #[global_alloc]
on a non-item statement
Fixes #83469 We need to return an `Annotatable::Stmt` if we were passed an `Annotatable::Stmt`
This commit is contained in:
parent
6e17a5c5fd
commit
8ecd931a8e
3 changed files with 35 additions and 17 deletions
|
@ -14,31 +14,31 @@ pub fn expand(
|
|||
ecx: &mut ExtCtxt<'_>,
|
||||
_span: Span,
|
||||
meta_item: &ast::MetaItem,
|
||||
mut item: Annotatable,
|
||||
item: Annotatable,
|
||||
) -> Vec<Annotatable> {
|
||||
check_builtin_macro_attribute(ecx, meta_item, sym::global_allocator);
|
||||
|
||||
let not_static = |item: Annotatable| {
|
||||
ecx.sess.parse_sess.span_diagnostic.span_err(item.span(), "allocators must be statics");
|
||||
vec![item]
|
||||
};
|
||||
let orig_item = item.clone();
|
||||
let mut is_stmt = false;
|
||||
let not_static = || {
|
||||
ecx.sess.parse_sess.span_diagnostic.span_err(item.span(), "allocators must be statics");
|
||||
vec![orig_item.clone()]
|
||||
};
|
||||
|
||||
// Allow using `#[global_allocator]` on an item statement
|
||||
if let Annotatable::Stmt(stmt) = &item {
|
||||
if let StmtKind::Item(item_) = &stmt.kind {
|
||||
item = Annotatable::Item(item_.clone());
|
||||
is_stmt = true;
|
||||
}
|
||||
}
|
||||
|
||||
let item = match item {
|
||||
// FIXME - if we get deref patterns, use them to reduce duplication here
|
||||
let (item, is_stmt) = match &item {
|
||||
Annotatable::Item(item) => match item.kind {
|
||||
ItemKind::Static(..) => item,
|
||||
_ => return not_static(Annotatable::Item(item)),
|
||||
ItemKind::Static(..) => (item, false),
|
||||
_ => return not_static(),
|
||||
},
|
||||
_ => return not_static(item),
|
||||
Annotatable::Stmt(stmt) => match &stmt.kind {
|
||||
StmtKind::Item(item_) => match item_.kind {
|
||||
ItemKind::Static(..) => (item_, true),
|
||||
_ => return not_static(),
|
||||
},
|
||||
_ => return not_static(),
|
||||
},
|
||||
_ => return not_static(),
|
||||
};
|
||||
|
||||
// Generate a bunch of new items using the AllocFnFactory
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue