Skip to content

Commit 938910b

Browse files
author
Jonathan Turner
authored
Rollup merge of rust-lang#35264 - GuillaumeGomez:E0132_update, r=jonathandturner
E0132 update Fixes rust-lang#35258. r? @jonathandturner
2 parents b45e852 + 1607d5b commit 938910b

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

src/librustc/hir/mod.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use hir::def::Def;
3636
use hir::def_id::DefId;
3737
use util::nodemap::{NodeMap, FnvHashSet};
3838

39-
use syntax_pos::{mk_sp, Span, ExpnId};
39+
use syntax_pos::{BytePos, mk_sp, Span, ExpnId};
4040
use syntax::codemap::{self, respan, Spanned};
4141
use syntax::abi::Abi;
4242
use syntax::ast::{Name, NodeId, DUMMY_NODE_ID, AsmDialect};
@@ -326,6 +326,38 @@ impl Generics {
326326
pub fn is_parameterized(&self) -> bool {
327327
self.is_lt_parameterized() || self.is_type_parameterized()
328328
}
329+
330+
// Does return a span which includes lifetimes and type parameters,
331+
// not where clause.
332+
pub fn span(&self) -> Option<Span> {
333+
if !self.is_parameterized() {
334+
None
335+
} else {
336+
let mut span: Option<Span> = None;
337+
for lifetime in self.lifetimes.iter() {
338+
if let Some(ref mut span) = span {
339+
let life_span = lifetime.lifetime.span;
340+
span.hi = if span.hi > life_span.hi { span.hi } else { life_span.hi };
341+
span.lo = if span.lo < life_span.lo { span.lo } else { life_span.lo };
342+
} else {
343+
span = Some(lifetime.lifetime.span.clone());
344+
}
345+
}
346+
for ty_param in self.ty_params.iter() {
347+
if let Some(ref mut span) = span {
348+
span.lo = if span.lo < ty_param.span.lo { span.lo } else { ty_param.span.lo };
349+
span.hi = if span.hi > ty_param.span.hi { span.hi } else { ty_param.span.hi };
350+
} else {
351+
span = Some(ty_param.span.clone());
352+
}
353+
}
354+
if let Some(ref mut span) = span {
355+
span.lo = span.lo - BytePos(1);
356+
span.hi = span.hi + BytePos(1);
357+
}
358+
span
359+
}
360+
}
329361
}
330362

331363
/// A `where` clause in a definition

src/librustc_typeck/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,11 @@ fn check_start_fn_ty(ccx: &CrateCtxt,
261261
match it.node {
262262
hir::ItemFn(_,_,_,_,ref ps,_)
263263
if ps.is_parameterized() => {
264-
span_err!(tcx.sess, start_span, E0132,
265-
"start function is not allowed to have type parameters");
264+
struct_span_err!(tcx.sess, start_span, E0132,
265+
"start function is not allowed to have type parameters")
266+
.span_label(ps.span().unwrap(),
267+
&format!("start function cannot have type parameters"))
268+
.emit();
266269
return;
267270
}
268271
_ => ()

src/test/compile-fail/E0132.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#[start]
1414
fn f<T>() {} //~ ERROR E0132
15+
//~| NOTE start function cannot have type parameters
1516

1617
fn main() {
1718
}

0 commit comments

Comments
 (0)