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:
Esteban Küber 2018-05-22 19:27:41 -07:00
parent 71e87be381
commit b2562fbcba
8 changed files with 55 additions and 37 deletions

View File

@ -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 {

View File

@ -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;
}
}

View File

@ -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>() { }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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