@@ -3196,51 +3196,60 @@ impl<'a> Parser<'a> {
3196
3196
// expr.f
3197
3197
if self . eat ( & token:: Dot ) {
3198
3198
match self . token {
3199
- token:: Ident ( ..) => {
3200
- e = self . parse_dot_suffix ( e, lo) ?;
3201
- }
3202
- token:: Literal ( token:: Integer ( name) , _) => {
3203
- let span = self . span ;
3204
- self . bump ( ) ;
3205
- let field = ExprKind :: Field ( e, Ident :: new ( name, span) ) ;
3206
- e = self . mk_expr ( lo. to ( span) , field, ThinVec :: new ( ) ) ;
3207
- }
3208
- token:: Literal ( token:: Float ( n) , _suf) => {
3209
- self . bump ( ) ;
3210
- let fstr = n. as_str ( ) ;
3211
- let mut err = self . diagnostic ( )
3212
- . struct_span_err ( self . prev_span , & format ! ( "unexpected token: `{}`" , n) ) ;
3213
- err. span_label ( self . prev_span , "unexpected token" ) ;
3214
- if fstr. chars ( ) . all ( |x| "0123456789." . contains ( x) ) {
3215
- let float = match fstr. parse :: < f64 > ( ) . ok ( ) {
3216
- Some ( f) => f,
3217
- None => continue ,
3218
- } ;
3219
- let sugg = pprust:: to_string ( |s| {
3220
- use crate :: print:: pprust:: PrintState ;
3221
- s. popen ( ) ?;
3222
- s. print_expr ( & e) ?;
3223
- s. s . word ( "." ) ?;
3224
- s. print_usize ( float. trunc ( ) as usize ) ?;
3225
- s. pclose ( ) ?;
3226
- s. s . word ( "." ) ?;
3227
- s. s . word ( fstr. splitn ( 2 , "." ) . last ( ) . unwrap ( ) . to_string ( ) )
3228
- } ) ;
3229
- err. span_suggestion (
3230
- lo. to ( self . prev_span ) ,
3231
- "try parenthesizing the first index" ,
3232
- sugg,
3233
- Applicability :: MachineApplicable
3234
- ) ;
3199
+ token:: Ident ( ..) => {
3200
+ e = self . parse_dot_suffix ( e, lo) ?;
3235
3201
}
3236
- return Err ( err) ;
3202
+ token:: Literal ( token:: Integer ( name) , suffix) => {
3203
+ let span = self . span ;
3204
+ self . bump ( ) ;
3205
+ let field = ExprKind :: Field ( e, Ident :: new ( name, span) ) ;
3206
+ e = self . mk_expr ( lo. to ( span) , field, ThinVec :: new ( ) ) ;
3237
3207
3238
- }
3239
- _ => {
3240
- // FIXME Could factor this out into non_fatal_unexpected or something.
3241
- let actual = self . this_token_to_string ( ) ;
3242
- self . span_err ( self . span , & format ! ( "unexpected token: `{}`" , actual) ) ;
3243
- }
3208
+ if let Some ( suffix) = suffix {
3209
+ let mut err = self . diagnostic ( ) . struct_span_err (
3210
+ span,
3211
+ "tuple index with a suffix is invalid" ,
3212
+ ) ;
3213
+ err. span_label ( span, format ! ( "invalid suffix `{}`" , suffix) ) ;
3214
+ err. emit ( ) ;
3215
+ }
3216
+ }
3217
+ token:: Literal ( token:: Float ( n) , _suf) => {
3218
+ self . bump ( ) ;
3219
+ let fstr = n. as_str ( ) ;
3220
+ let mut err = self . diagnostic ( )
3221
+ . struct_span_err ( self . prev_span , & format ! ( "unexpected token: `{}`" , n) ) ;
3222
+ err. span_label ( self . prev_span , "unexpected token" ) ;
3223
+ if fstr. chars ( ) . all ( |x| "0123456789." . contains ( x) ) {
3224
+ let float = match fstr. parse :: < f64 > ( ) . ok ( ) {
3225
+ Some ( f) => f,
3226
+ None => continue ,
3227
+ } ;
3228
+ let sugg = pprust:: to_string ( |s| {
3229
+ use crate :: print:: pprust:: PrintState ;
3230
+ s. popen ( ) ?;
3231
+ s. print_expr ( & e) ?;
3232
+ s. s . word ( "." ) ?;
3233
+ s. print_usize ( float. trunc ( ) as usize ) ?;
3234
+ s. pclose ( ) ?;
3235
+ s. s . word ( "." ) ?;
3236
+ s. s . word ( fstr. splitn ( 2 , "." ) . last ( ) . unwrap ( ) . to_string ( ) )
3237
+ } ) ;
3238
+ err. span_suggestion (
3239
+ lo. to ( self . prev_span ) ,
3240
+ "try parenthesizing the first index" ,
3241
+ sugg,
3242
+ Applicability :: MachineApplicable
3243
+ ) ;
3244
+ }
3245
+ return Err ( err) ;
3246
+
3247
+ }
3248
+ _ => {
3249
+ // FIXME Could factor this out into non_fatal_unexpected or something.
3250
+ let actual = self . this_token_to_string ( ) ;
3251
+ self . span_err ( self . span , & format ! ( "unexpected token: `{}`" , actual) ) ;
3252
+ }
3244
3253
}
3245
3254
continue ;
3246
3255
}
0 commit comments