Tweak main
type arguments and where clause spans
Tweak the spans for error when finding type arguments or where clauses in main and start functions.
This commit is contained in:
parent
71e87be381
commit
b2562fbcba
@ -598,6 +598,18 @@ pub struct WhereClause {
|
||||
pub predicates: HirVec<WherePredicate>,
|
||||
}
|
||||
|
||||
impl WhereClause {
|
||||
pub fn span(&self) -> Option<Span> {
|
||||
self.predicates.iter().map(|predicate| predicate.span())
|
||||
.fold(None, |acc, i| match (acc, i) {
|
||||
(None, i) => Some(i),
|
||||
(Some(acc), i) => {
|
||||
Some(acc.to(i))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// A single predicate in a `where` clause
|
||||
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
|
||||
pub enum WherePredicate {
|
||||
|
@ -186,18 +186,23 @@ fn check_main_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
Some(hir_map::NodeItem(it)) => {
|
||||
match it.node {
|
||||
hir::ItemFn(.., ref generics, _) => {
|
||||
let mut error = false;
|
||||
if !generics.params.is_empty() {
|
||||
struct_span_err!(tcx.sess, generics.span, E0131,
|
||||
"main function is not allowed to have type parameters")
|
||||
"`main` function is not allowed to have type parameters")
|
||||
.span_label(generics.span,
|
||||
"main cannot have type parameters")
|
||||
"`main` cannot have type parameters")
|
||||
.emit();
|
||||
return;
|
||||
error = true;
|
||||
}
|
||||
if !generics.where_clause.predicates.is_empty() {
|
||||
struct_span_err!(tcx.sess, main_span, E0646,
|
||||
"main function is not allowed to have a where clause")
|
||||
.emit();
|
||||
if let Some(sp) = generics.where_clause.span() {
|
||||
struct_span_err!(tcx.sess, sp, E0646,
|
||||
"`main` function is not allowed to have a `where` clause")
|
||||
.span_label(sp, "`main` cannot have a `where` clause")
|
||||
.emit();
|
||||
error = true;
|
||||
}
|
||||
if error {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -251,19 +256,24 @@ fn check_start_fn_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
match tcx.hir.find(start_id) {
|
||||
Some(hir_map::NodeItem(it)) => {
|
||||
match it.node {
|
||||
hir::ItemFn(..,ref ps,_) => {
|
||||
if !ps.params.is_empty() {
|
||||
struct_span_err!(tcx.sess, ps.span, E0132,
|
||||
hir::ItemFn(.., ref generics, _) => {
|
||||
let mut error = false;
|
||||
if !generics.params.is_empty() {
|
||||
struct_span_err!(tcx.sess, generics.span, E0132,
|
||||
"start function is not allowed to have type parameters")
|
||||
.span_label(ps.span,
|
||||
.span_label(generics.span,
|
||||
"start function cannot have type parameters")
|
||||
.emit();
|
||||
return;
|
||||
error = true;
|
||||
}
|
||||
if !ps.where_clause.predicates.is_empty() {
|
||||
struct_span_err!(tcx.sess, start_span, E0647,
|
||||
"start function is not allowed to have a where clause")
|
||||
.emit();
|
||||
if let Some(sp) = generics.where_clause.span() {
|
||||
struct_span_err!(tcx.sess, sp, E0647,
|
||||
"start function is not allowed to have a `where` clause")
|
||||
.span_label(sp, "start function cannot have a `where` clause")
|
||||
.emit();
|
||||
error = true;
|
||||
}
|
||||
if error {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -8,5 +8,5 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// error-pattern: main function is not allowed to have type parameters
|
||||
// error-pattern: `main` function is not allowed to have type parameters
|
||||
fn main<T>() { }
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0131]: main function is not allowed to have type parameters
|
||||
error[E0131]: `main` function is not allowed to have type parameters
|
||||
--> $DIR/E0131.rs:11:8
|
||||
|
|
||||
LL | fn main<T>() {
|
||||
| ^^^ main cannot have type parameters
|
||||
| ^^^ `main` cannot have type parameters
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0646]: main function is not allowed to have a where clause
|
||||
--> $DIR/E0646.rs:11:1
|
||||
error[E0646]: `main` function is not allowed to have a `where` clause
|
||||
--> $DIR/E0646.rs:11:17
|
||||
|
|
||||
LL | fn main() where (): Copy {} //~ ERROR [E0646]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^ `main` cannot have a `where` clause
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
error[E0647]: start function is not allowed to have a where clause
|
||||
--> $DIR/E0647.rs:17:1
|
||||
error[E0647]: start function is not allowed to have a `where` clause
|
||||
--> $DIR/E0647.rs:17:56
|
||||
|
|
||||
LL | / fn start(_: isize, _: *const *const u8) -> isize where (): Copy { //~ ERROR [E0647]
|
||||
LL | | 0
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn start(_: isize, _: *const *const u8) -> isize where (): Copy { //~ ERROR [E0647]
|
||||
| ^^^^^^^^ start function cannot have a `where` clause
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
error[E0647]: start function is not allowed to have a where clause
|
||||
--> $DIR/issue-50714-1.rs:19:1
|
||||
error[E0647]: start function is not allowed to have a `where` clause
|
||||
--> $DIR/issue-50714-1.rs:19:56
|
||||
|
|
||||
LL | / fn start(_: isize, _: *const *const u8) -> isize where fn(&()): Eq { //~ ERROR [E0647]
|
||||
LL | | 0
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn start(_: isize, _: *const *const u8) -> isize where fn(&()): Eq { //~ ERROR [E0647]
|
||||
| ^^^^^^^^^^^ start function cannot have a `where` clause
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0646]: main function is not allowed to have a where clause
|
||||
--> $DIR/issue-50714.rs:13:1
|
||||
error[E0646]: `main` function is not allowed to have a `where` clause
|
||||
--> $DIR/issue-50714.rs:13:17
|
||||
|
|
||||
LL | fn main() where fn(&()): Eq {} //~ ERROR [E0646]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^ `main` cannot have a `where` clause
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user