@@ -24,10 +24,10 @@ enum AttrError {
24
24
MissingSince ,
25
25
MissingFeature ,
26
26
MultipleStabilityLevels ,
27
- UnsupportedLiteral
27
+ UnsupportedLiteral ( & ' static str , /* is_bytestr */ bool ) ,
28
28
}
29
29
30
- fn handle_errors ( sess : & ParseSess , span : Span , error : AttrError , is_bytestr : bool ) {
30
+ fn handle_errors ( sess : & ParseSess , span : Span , error : AttrError ) {
31
31
let diag = & sess. span_diagnostic ;
32
32
match error {
33
33
AttrError :: MultipleItem ( item) => span_err ! ( diag, span, E0538 ,
@@ -45,13 +45,11 @@ fn handle_errors(sess: &ParseSess, span: Span, error: AttrError, is_bytestr: boo
45
45
AttrError :: MissingFeature => span_err ! ( diag, span, E0546 , "missing 'feature'" ) ,
46
46
AttrError :: MultipleStabilityLevels => span_err ! ( diag, span, E0544 ,
47
47
"multiple stability levels" ) ,
48
- AttrError :: UnsupportedLiteral => {
49
- let mut err = struct_span_err ! (
50
- diag,
51
- span,
52
- E0565 ,
53
- "unsupported literal" ,
54
- ) ;
48
+ AttrError :: UnsupportedLiteral (
49
+ msg,
50
+ is_bytestr,
51
+ ) => {
52
+ let mut err = struct_span_err ! ( diag, span, E0565 , "{}" , msg) ;
55
53
if is_bytestr {
56
54
if let Ok ( lint_str) = sess. source_map ( ) . span_to_snippet ( span) {
57
55
err. span_suggestion_with_applicability (
@@ -222,7 +220,7 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
222
220
let meta = meta. as_ref ( ) . unwrap ( ) ;
223
221
let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
224
222
if item. is_some ( ) {
225
- handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) , false ) ;
223
+ handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
226
224
return false
227
225
}
228
226
if let Some ( v) = meta. value_str ( ) {
@@ -252,13 +250,19 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
252
250
sess,
253
251
mi. span,
254
252
AttrError :: UnknownMetaItem ( mi. name( ) , expected) ,
255
- false ,
256
253
) ;
257
254
continue ' outer
258
255
}
259
256
}
260
257
} else {
261
- handle_errors( sess, meta. span, AttrError :: UnsupportedLiteral , false ) ;
258
+ handle_errors(
259
+ sess,
260
+ meta. span,
261
+ AttrError :: UnsupportedLiteral (
262
+ "unsupported literal" ,
263
+ false ,
264
+ ) ,
265
+ ) ;
262
266
continue ' outer
263
267
}
264
268
}
@@ -283,7 +287,7 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
283
287
} )
284
288
}
285
289
( None , _) => {
286
- handle_errors ( sess, attr. span ( ) , AttrError :: MissingSince , false ) ;
290
+ handle_errors ( sess, attr. span ( ) , AttrError :: MissingSince ) ;
287
291
continue
288
292
}
289
293
_ => {
@@ -309,7 +313,7 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
309
313
}
310
314
"unstable" => {
311
315
if stab. is_some ( ) {
312
- handle_errors ( sess, attr. span ( ) , AttrError :: MultipleStabilityLevels , false ) ;
316
+ handle_errors ( sess, attr. span ( ) , AttrError :: MultipleStabilityLevels ) ;
313
317
break
314
318
}
315
319
@@ -330,13 +334,19 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
330
334
mi. name ( ) ,
331
335
& [ "feature" , "reason" , "issue" ]
332
336
) ,
333
- false ,
334
337
) ;
335
338
continue ' outer
336
339
}
337
340
}
338
341
} else {
339
- handle_errors ( sess, meta. span , AttrError :: UnsupportedLiteral , false ) ;
342
+ handle_errors (
343
+ sess,
344
+ meta. span ,
345
+ AttrError :: UnsupportedLiteral (
346
+ "unsupported literal" ,
347
+ false ,
348
+ ) ,
349
+ ) ;
340
350
continue ' outer
341
351
}
342
352
}
@@ -363,7 +373,7 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
363
373
} )
364
374
}
365
375
( None , _, _) => {
366
- handle_errors ( sess, attr. span ( ) , AttrError :: MissingFeature , false ) ;
376
+ handle_errors ( sess, attr. span ( ) , AttrError :: MissingFeature ) ;
367
377
continue
368
378
}
369
379
_ => {
@@ -374,7 +384,7 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
374
384
}
375
385
"stable" => {
376
386
if stab. is_some ( ) {
377
- handle_errors ( sess, attr. span ( ) , AttrError :: MultipleStabilityLevels , false ) ;
387
+ handle_errors ( sess, attr. span ( ) , AttrError :: MultipleStabilityLevels ) ;
378
388
break
379
389
}
380
390
@@ -393,7 +403,6 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
393
403
AttrError :: UnknownMetaItem (
394
404
mi. name ( ) , & [ "since" , "note" ] ,
395
405
) ,
396
- false ,
397
406
) ;
398
407
continue ' outer
399
408
}
@@ -402,9 +411,11 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
402
411
NestedMetaItemKind :: Literal ( lit) => {
403
412
handle_errors (
404
413
sess,
405
- meta. span ,
406
- AttrError :: UnsupportedLiteral ,
407
- lit. node . is_bytestr ( )
414
+ lit. span ,
415
+ AttrError :: UnsupportedLiteral (
416
+ "unsupported literal" ,
417
+ false ,
418
+ ) ,
408
419
) ;
409
420
continue ' outer
410
421
}
@@ -424,11 +435,11 @@ fn find_stability_generic<'a, I>(sess: &ParseSess,
424
435
} )
425
436
}
426
437
( None , _) => {
427
- handle_errors ( sess, attr. span ( ) , AttrError :: MissingFeature , false ) ;
438
+ handle_errors ( sess, attr. span ( ) , AttrError :: MissingFeature ) ;
428
439
continue
429
440
}
430
441
_ => {
431
- handle_errors ( sess, attr. span ( ) , AttrError :: MissingSince , false ) ;
442
+ handle_errors ( sess, attr. span ( ) , AttrError :: MissingSince ) ;
432
443
continue
433
444
}
434
445
}
@@ -498,8 +509,11 @@ pub fn cfg_matches(cfg: &ast::MetaItem, sess: &ParseSess, features: Option<&Feat
498
509
MetaItemKind :: NameValue ( lit) if !lit. node . is_str ( ) => {
499
510
handle_errors (
500
511
sess,
501
- lit. span , AttrError :: UnsupportedLiteral ,
502
- lit. node . is_bytestr ( ) ,
512
+ lit. span ,
513
+ AttrError :: UnsupportedLiteral (
514
+ "literal in `cfg` predicate value must be a string" ,
515
+ lit. node . is_bytestr ( )
516
+ ) ,
503
517
) ;
504
518
true
505
519
}
@@ -520,7 +534,14 @@ pub fn eval_condition<F>(cfg: &ast::MetaItem, sess: &ParseSess, eval: &mut F)
520
534
ast:: MetaItemKind :: List ( ref mis) => {
521
535
for mi in mis. iter ( ) {
522
536
if !mi. is_meta_item ( ) {
523
- handle_errors ( sess, mi. span , AttrError :: UnsupportedLiteral , false ) ;
537
+ handle_errors (
538
+ sess,
539
+ mi. span ,
540
+ AttrError :: UnsupportedLiteral (
541
+ "unsupported literal" ,
542
+ false
543
+ ) ,
544
+ ) ;
524
545
return false ;
525
546
}
526
547
}
@@ -591,7 +612,7 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess,
591
612
depr = if let Some ( metas) = attr. meta_item_list ( ) {
592
613
let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
593
614
if item. is_some ( ) {
594
- handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) , false ) ;
615
+ handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
595
616
return false
596
617
}
597
618
if let Some ( v) = meta. value_str ( ) {
@@ -602,8 +623,11 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess,
602
623
handle_errors (
603
624
sess,
604
625
lit. span ,
605
- AttrError :: UnsupportedLiteral ,
606
- lit. node . is_bytestr ( ) ,
626
+ AttrError :: UnsupportedLiteral (
627
+ "literal in `deprecated` \
628
+ value must be a string",
629
+ lit. node . is_bytestr ( )
630
+ ) ,
607
631
) ;
608
632
} else {
609
633
span_err ! ( diagnostic, meta. span, E0551 , "incorrect meta item" ) ;
@@ -626,15 +650,20 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess,
626
650
sess,
627
651
meta. span ,
628
652
AttrError :: UnknownMetaItem ( mi. name ( ) , & [ "since" , "note" ] ) ,
629
- false ,
630
653
) ;
631
654
continue ' outer
632
655
}
633
656
}
634
657
}
635
658
NestedMetaItemKind :: Literal ( lit) => {
636
- let is_bytestr = lit. node . is_bytestr ( ) ;
637
- handle_errors ( sess, lit. span , AttrError :: UnsupportedLiteral , is_bytestr) ;
659
+ handle_errors (
660
+ sess,
661
+ lit. span ,
662
+ AttrError :: UnsupportedLiteral (
663
+ "item in `deprecated` must be a key/value pair" ,
664
+ false ,
665
+ ) ,
666
+ ) ;
638
667
continue ' outer
639
668
}
640
669
}
@@ -694,12 +723,14 @@ pub fn find_repr_attrs(sess: &ParseSess, attr: &Attribute) -> Vec<ReprAttr> {
694
723
mark_used ( attr) ;
695
724
for item in items {
696
725
if !item. is_meta_item ( ) {
697
- let ( span, is_bytestr) = if let Some ( lit) = item. literal ( ) {
698
- ( lit. span , lit. node . is_bytestr ( ) )
699
- } else {
700
- ( item. span , false )
701
- } ;
702
- handle_errors ( sess, span, AttrError :: UnsupportedLiteral , is_bytestr) ;
726
+ handle_errors (
727
+ sess,
728
+ item. span ,
729
+ AttrError :: UnsupportedLiteral (
730
+ "meta item in `repr` must be an identifier" ,
731
+ false ,
732
+ ) ,
733
+ ) ;
703
734
continue
704
735
}
705
736
0 commit comments