Fix ICE when main
is declared in an extern
block
This commit is contained in:
parent
1639a16ebf
commit
9b2ba6d1a1
@ -1,3 +1,4 @@
|
||||
#[derive(Debug)]
|
||||
pub enum EntryPointType {
|
||||
None,
|
||||
MainNamed,
|
||||
|
@ -126,7 +126,7 @@ pub struct ResolverOutputs {
|
||||
pub main_def: Option<MainDefinition>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct MainDefinition {
|
||||
pub res: Res<ast::NodeId>,
|
||||
pub is_import: bool,
|
||||
|
@ -2,7 +2,7 @@
|
||||
use rustc_errors::struct_span_err;
|
||||
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
||||
use rustc_hir::{ForeignItem, HirId, ImplItem, Item, ItemKind, TraitItem, CRATE_HIR_ID};
|
||||
use rustc_hir::{ForeignItem, HirId, ImplItem, Item, ItemKind, Node, TraitItem, CRATE_HIR_ID};
|
||||
use rustc_middle::hir::map::Map;
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
@ -148,6 +148,20 @@ fn configure_main(tcx: TyCtxt<'_>, visitor: &EntryContext<'_, '_>) -> Option<(De
|
||||
} else if let Some((hir_id, _)) = visitor.attr_main_fn {
|
||||
Some((tcx.hir().local_def_id(hir_id).to_def_id(), EntryFnType::Main))
|
||||
} else if let Some(def_id) = tcx.main_def.and_then(|main_def| main_def.opt_fn_def_id()) {
|
||||
// non-local main imports are handled below
|
||||
if def_id.is_local() {
|
||||
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local());
|
||||
if matches!(tcx.hir().find(hir_id), Some(Node::ForeignItem(_))) {
|
||||
tcx.sess
|
||||
.struct_span_err(
|
||||
tcx.hir().span(hir_id),
|
||||
"the `main` function cannot be declared in an `extern` block",
|
||||
)
|
||||
.emit();
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
if tcx.main_def.unwrap().is_import && !tcx.features().imported_main {
|
||||
let span = tcx.main_def.unwrap().span;
|
||||
feature_err(
|
||||
|
7
src/test/ui/extern/extern-main-issue-86110.rs
vendored
Normal file
7
src/test/ui/extern/extern-main-issue-86110.rs
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
// missing and missing2 exist to make sure that the error only happens on a `main` declaration
|
||||
extern "C" {
|
||||
fn missing();
|
||||
fn main();
|
||||
//~^ the `main` function cannot be declared in an `extern` block
|
||||
fn missing2();
|
||||
}
|
8
src/test/ui/extern/extern-main-issue-86110.stderr
vendored
Normal file
8
src/test/ui/extern/extern-main-issue-86110.stderr
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
error: the `main` function cannot be declared in an `extern` block
|
||||
--> $DIR/extern-main-issue-86110.rs:4:5
|
||||
|
|
||||
LL | fn main();
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user