@@ -21,7 +21,7 @@ use syntax::visit::{self, Visitor};
21
21
use syntax:: { span_err, struct_span_err, walk_list} ;
22
22
use syntax_ext:: proc_macro_decls:: is_proc_macro_attr;
23
23
use syntax_pos:: { Span , MultiSpan } ;
24
- use errors:: Applicability ;
24
+ use errors:: { Applicability , FatalError } ;
25
25
use log:: debug;
26
26
27
27
#[ derive( Copy , Clone , Debug ) ]
@@ -368,6 +368,8 @@ fn validate_generics_order<'a>(
368
368
let mut max_param: Option < ParamKindOrd > = None ;
369
369
let mut out_of_order = FxHashMap :: default ( ) ;
370
370
let mut param_idents = vec ! [ ] ;
371
+ let mut found_type = false ;
372
+ let mut found_const = false ;
371
373
372
374
for ( kind, bounds, span, ident) in generics {
373
375
if let Some ( ident) = ident {
@@ -381,6 +383,11 @@ fn validate_generics_order<'a>(
381
383
}
382
384
Some ( _) | None => * max_param = Some ( kind) ,
383
385
} ;
386
+ match kind {
387
+ ParamKindOrd :: Type => found_type = true ,
388
+ ParamKindOrd :: Const => found_const = true ,
389
+ _ => { }
390
+ }
384
391
}
385
392
386
393
let mut ordered_params = "<" . to_string ( ) ;
@@ -408,8 +415,8 @@ fn validate_generics_order<'a>(
408
415
GenericPosition :: Arg => "argument" ,
409
416
} ;
410
417
411
- for ( param_ord, ( max_param, spans) ) in out_of_order {
412
- let mut err = handler. struct_span_err ( spans,
418
+ for ( param_ord, ( max_param, spans) ) in & out_of_order {
419
+ let mut err = handler. struct_span_err ( spans. clone ( ) ,
413
420
& format ! (
414
421
"{} {pos}s must be declared prior to {} {pos}s" ,
415
422
param_ord,
@@ -430,6 +437,13 @@ fn validate_generics_order<'a>(
430
437
}
431
438
err. emit ( ) ;
432
439
}
440
+
441
+ // FIXME(const_generics): we shouldn't have to abort here at all, but we currently get ICEs
442
+ // if we don't. Const parameters and type parameters can currently conflict if they
443
+ // are out-of-order.
444
+ if !out_of_order. is_empty ( ) && found_type && found_const {
445
+ FatalError . raise ( ) ;
446
+ }
433
447
}
434
448
435
449
impl < ' a > Visitor < ' a > for AstValidator < ' a > {
0 commit comments