Rollup merge of #83486 - Aaron1011:fix/global-alloc-error, r=petrochenkov
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:
commit
b0bec95534
@ -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
|
||||
|
@ -0,0 +1,10 @@
|
||||
// Regression test for issue #83469
|
||||
// Ensures that we recover from `#[global_alloc]` on an invalid
|
||||
// stmt without an ICE
|
||||
|
||||
fn outer() {
|
||||
#[global_allocator]
|
||||
fn inner() {} //~ ERROR allocators must be statics
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,8 @@
|
||||
error: allocators must be statics
|
||||
--> $DIR/issue-83469-global-alloc-invalid-stmt.rs:7:5
|
||||
|
|
||||
LL | fn inner() {}
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user