mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 11:48:30 +00:00
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
@ -14,31 +14,31 @@ pub fn expand(
|
|||||||
ecx: &mut ExtCtxt<'_>,
|
ecx: &mut ExtCtxt<'_>,
|
||||||
_span: Span,
|
_span: Span,
|
||||||
meta_item: &ast::MetaItem,
|
meta_item: &ast::MetaItem,
|
||||||
mut item: Annotatable,
|
item: Annotatable,
|
||||||
) -> Vec<Annotatable> {
|
) -> Vec<Annotatable> {
|
||||||
check_builtin_macro_attribute(ecx, meta_item, sym::global_allocator);
|
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 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
|
// Allow using `#[global_allocator]` on an item statement
|
||||||
if let Annotatable::Stmt(stmt) = &item {
|
// FIXME - if we get deref patterns, use them to reduce duplication here
|
||||||
if let StmtKind::Item(item_) = &stmt.kind {
|
let (item, is_stmt) = match &item {
|
||||||
item = Annotatable::Item(item_.clone());
|
|
||||||
is_stmt = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let item = match item {
|
|
||||||
Annotatable::Item(item) => match item.kind {
|
Annotatable::Item(item) => match item.kind {
|
||||||
ItemKind::Static(..) => item,
|
ItemKind::Static(..) => (item, false),
|
||||||
_ => return not_static(Annotatable::Item(item)),
|
_ => 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
|
// 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