Skip to content

Commit 588d37f

Browse files
committed
Check generic params after sigature for main-fn-ty
1 parent 5e70254 commit 588d37f

File tree

3 files changed

+40
-22
lines changed

3 files changed

+40
-22
lines changed

compiler/rustc_hir_analysis/src/check/entry.rs

+17-22
Original file line numberDiff line numberDiff line change
@@ -92,24 +92,6 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
9292

9393
let mut error = false;
9494
let main_diagnostics_def_id = main_fn_diagnostics_def_id(tcx, main_def_id, main_span);
95-
let main_fn_generics = tcx.generics_of(main_def_id);
96-
let main_fn_predicates = tcx.predicates_of(main_def_id);
97-
if main_fn_generics.count() != 0 || !main_fnsig.bound_vars().is_empty() {
98-
let generics_param_span = main_fn_generics_params_span(tcx, main_def_id);
99-
tcx.sess.emit_err(errors::MainFunctionGenericParameters {
100-
span: generics_param_span.unwrap_or(main_span),
101-
label_span: generics_param_span,
102-
});
103-
error = true;
104-
} else if !main_fn_predicates.predicates.is_empty() {
105-
// generics may bring in implicit predicates, so we skip this check if generics is present.
106-
let generics_where_clauses_span = main_fn_where_clauses_span(tcx, main_def_id);
107-
tcx.sess.emit_err(errors::WhereClauseOnMain {
108-
span: generics_where_clauses_span.unwrap_or(main_span),
109-
generics_span: generics_where_clauses_span,
110-
});
111-
error = true;
112-
}
11395

11496
let main_asyncness = tcx.asyncness(main_def_id);
11597
if main_asyncness.is_async() {
@@ -142,10 +124,6 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
142124
if let Some(term_did) = tcx.lang_items().termination() {
143125
let return_ty = main_fnsig.output();
144126
let return_ty_span = main_fn_return_type_span(tcx, main_def_id).unwrap_or(main_span);
145-
if !return_ty.bound_vars().is_empty() {
146-
tcx.sess.emit_err(errors::MainFunctionReturnTypeGeneric { span: return_ty_span });
147-
error = true;
148-
}
149127
let return_ty = return_ty.skip_binder();
150128
let infcx = tcx.infer_ctxt().build();
151129
let cause = traits::ObligationCause::new(
@@ -190,6 +168,23 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
190168
main_def_id,
191169
expected_sig,
192170
);
171+
172+
let main_fn_generics = tcx.generics_of(main_def_id);
173+
let main_fn_predicates = tcx.predicates_of(main_def_id);
174+
if main_fn_generics.count() != 0 || !main_fnsig.bound_vars().is_empty() {
175+
let generics_param_span = main_fn_generics_params_span(tcx, main_def_id);
176+
tcx.sess.emit_err(errors::MainFunctionGenericParameters {
177+
span: generics_param_span.unwrap_or(main_span),
178+
label_span: generics_param_span,
179+
});
180+
} else if !main_fn_predicates.predicates.is_empty() {
181+
// generics may bring in implicit predicates, so we skip this check if generics is present.
182+
let generics_where_clauses_span = main_fn_where_clauses_span(tcx, main_def_id);
183+
tcx.sess.emit_err(errors::WhereClauseOnMain {
184+
span: generics_where_clauses_span.unwrap_or(main_span),
185+
generics_span: generics_where_clauses_span,
186+
});
187+
}
193188
}
194189

195190
fn check_start_fn_ty(tcx: TyCtxt<'_>, start_def_id: DefId) {

tests/ui/entry-point/issue-118772.rs

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fn main(_: &i32) { //~ ERROR `main` function has wrong type
2+
//~^ ERROR `main` function is not allowed to have generic parameters
3+
println!("Hello, world!");
4+
}
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
error[E0580]: `main` function has wrong type
2+
--> $DIR/issue-118772.rs:1:1
3+
|
4+
LL | fn main(_: &i32) {
5+
| ^^^^^^^^^^^^^^^^ incorrect number of function parameters
6+
|
7+
= note: expected signature `fn()`
8+
found signature `for<'a> fn(&'a i32)`
9+
10+
error[E0131]: `main` function is not allowed to have generic parameters
11+
--> $DIR/issue-118772.rs:1:8
12+
|
13+
LL | fn main(_: &i32) {
14+
| ^ `main` cannot have generic parameters
15+
16+
error: aborting due to 2 previous errors
17+
18+
Some errors have detailed explanations: E0131, E0580.
19+
For more information about an error, try `rustc --explain E0131`.

0 commit comments

Comments
 (0)