@@ -4150,34 +4150,36 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
41504150 PathResult :: Indeterminate => bug ! ( "indeterminate path result in resolve_qpath" ) ,
41514151 } ;
41524152
4153- if path. len ( ) > 1
4154- && let Some ( res) = result. full_res ( )
4155- && let Some ( ( & last_segment, prev_segs) ) = path. split_last ( )
4156- && prev_segs. iter ( ) . all ( |seg| !seg. has_generic_args )
4157- && res != Res :: Err
4158- && path[ 0 ] . ident . name != kw:: PathRoot
4159- && path[ 0 ] . ident . name != kw:: DollarCrate
4160- {
4161- let unqualified_result = {
4162- match self . resolve_path ( & [ last_segment] , Some ( ns) , None ) {
4163- PathResult :: NonModule ( path_res) => path_res. expect_full_res ( ) ,
4164- PathResult :: Module ( ModuleOrUniformRoot :: Module ( module) ) => {
4165- module. res ( ) . unwrap ( )
4166- }
4167- _ => return Ok ( Some ( result) ) ,
4168- }
4169- } ;
4170- if res == unqualified_result {
4171- let lint = lint:: builtin:: UNUSED_QUALIFICATIONS ;
4153+ if path. iter ( ) . all ( |seg| !seg. ident . span . from_expansion ( ) ) {
4154+ let end_pos =
4155+ path. iter ( ) . position ( |seg| seg. has_generic_args ) . map_or ( path. len ( ) , |pos| pos + 1 ) ;
4156+ let unqualified =
4157+ path[ ..end_pos] . iter ( ) . enumerate ( ) . skip ( 1 ) . rev ( ) . find_map ( |( i, seg) | {
4158+ // Preserve the current namespace for the final path segment, but use the type
4159+ // namespace for all preceding segments
4160+ //
4161+ // e.g. for `std::env::args` check the `ValueNS` for `args` but the `TypeNS` for
4162+ // `std` and `env`
4163+ //
4164+ // If the final path segment is beyond `end_pos` all the segments to check will
4165+ // use the type namespace
4166+ let ns = if i + 1 == path. len ( ) { ns } else { TypeNS } ;
4167+ let res = self . r . partial_res_map . get ( & seg. id ?) ?. full_res ( ) ?;
4168+ let binding = self . resolve_ident_in_lexical_scope ( seg. ident , ns, None , None ) ?;
4169+
4170+ ( res == binding. res ( ) ) . then_some ( seg)
4171+ } ) ;
4172+
4173+ if let Some ( unqualified) = unqualified {
41724174 self . r . lint_buffer . buffer_lint_with_diagnostic (
4173- lint,
4175+ lint:: builtin :: UNUSED_QUALIFICATIONS ,
41744176 finalize. node_id ,
41754177 finalize. path_span ,
41764178 "unnecessary qualification" ,
41774179 lint:: BuiltinLintDiagnostics :: UnusedQualifications {
4178- removal_span : finalize. path_span . until ( last_segment . ident . span ) ,
4180+ removal_span : finalize. path_span . until ( unqualified . ident . span ) ,
41794181 } ,
4180- )
4182+ ) ;
41814183 }
41824184 }
41834185
0 commit comments