Skip to content

Commit

Permalink
Skip no_mangle if the item has no name.
Browse files Browse the repository at this point in the history
  • Loading branch information
cjgillot committed Mar 28, 2023
1 parent 84487b2 commit 3102722
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
17 changes: 16 additions & 1 deletion compiler/rustc_codegen_ssa/src/codegen_attrs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,22 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR_ZEROED
}
sym::naked => codegen_fn_attrs.flags |= CodegenFnAttrFlags::NAKED,
sym::no_mangle => codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_MANGLE,
sym::no_mangle => {
if tcx.opt_item_name(did.to_def_id()).is_some() {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_MANGLE
} else {
tcx.sess
.struct_span_err(
attr.span,
format!(
"`#[no_mangle]` cannot be used on {} {} as it has no name",
tcx.def_descr_article(did.to_def_id()),
tcx.def_descr(did.to_def_id()),
),
)
.emit();
}
}
sym::no_coverage => codegen_fn_attrs.flags |= CodegenFnAttrFlags::NO_COVERAGE,
sym::rustc_std_internal_symbol => {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/attributes/no-mangle-closure.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Check that we do not ICE when `no_mangle` is applied to something that has no name.

#![crate_type = "lib"]
#![feature(stmt_expr_attributes)]

pub struct S([usize; 8]);

pub fn outer_function(x: S, y: S) -> usize {
(#[no_mangle] || y.0[0])()
//~^ ERROR `#[no_mangle]` cannot be used on a closure as it has no name
}
8 changes: 8 additions & 0 deletions tests/ui/attributes/no-mangle-closure.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: `#[no_mangle]` cannot be used on a closure as it has no name
--> $DIR/no-mangle-closure.rs:9:6
|
LL | (#[no_mangle] || y.0[0])()
| ^^^^^^^^^^^^

error: aborting due to previous error

0 comments on commit 3102722

Please sign in to comment.