mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-04 05:35:55 +00:00 
			
		
		
		
	Merge pull request #19347 from Shourya742/2025-03-13-add-diagnostic-for-dnagling-impl-with-lifetime
Add diagnostic for missing ambiguity error for impl trait
This commit is contained in:
		
						commit
						ed7e25a0c0
					
				
					 5 changed files with 99 additions and 1 deletions
				
			
		| 
						 | 
					@ -363,11 +363,40 @@ fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option<SyntaxError> {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn validate_impl_object_ty(ty: ast::ImplTraitType, errors: &mut Vec<SyntaxError>) {
 | 
					fn validate_impl_object_ty(ty: ast::ImplTraitType, errors: &mut Vec<SyntaxError>) {
 | 
				
			||||||
    if ty.type_bound_list().map_or(0, |tbl| tbl.bounds().count()) == 0 {
 | 
					    let Some(bound_list) = ty.type_bound_list() else {
 | 
				
			||||||
        errors.push(SyntaxError::new(
 | 
					        errors.push(SyntaxError::new(
 | 
				
			||||||
            "At least one trait must be specified",
 | 
					            "At least one trait must be specified",
 | 
				
			||||||
            ty.syntax().text_range(),
 | 
					            ty.syntax().text_range(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let bounds: Vec<_> = bound_list.bounds().collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !bounds.iter().any(|b| !matches!(b.kind(), ast::TypeBoundKind::Lifetime(_))) {
 | 
				
			||||||
 | 
					        errors.push(SyntaxError::new(
 | 
				
			||||||
 | 
					            "At least one trait must be specified",
 | 
				
			||||||
 | 
					            ty.syntax().text_range(),
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if bounds.len() == 1 {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let Some(preceding_token) = ty
 | 
				
			||||||
 | 
					        .impl_token()
 | 
				
			||||||
 | 
					        .and_then(|token| token.prev_token())
 | 
				
			||||||
 | 
					        .and_then(|prev| algo::skip_trivia_token(prev, Direction::Prev))
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if !matches!(preceding_token.kind(), T!['('] | T![<] | T![=])
 | 
				
			||||||
 | 
					        && matches!(preceding_token.kind(), T![&])
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        errors.push(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					SOURCE_FILE@0..28
 | 
				
			||||||
 | 
					  FN@0..28
 | 
				
			||||||
 | 
					    FN_KW@0..2 "fn"
 | 
				
			||||||
 | 
					    WHITESPACE@2..3 " "
 | 
				
			||||||
 | 
					    NAME@3..4
 | 
				
			||||||
 | 
					      IDENT@3..4 "f"
 | 
				
			||||||
 | 
					    PARAM_LIST@4..25
 | 
				
			||||||
 | 
					      L_PAREN@4..5 "("
 | 
				
			||||||
 | 
					      PARAM@5..24
 | 
				
			||||||
 | 
					        WILDCARD_PAT@5..6
 | 
				
			||||||
 | 
					          UNDERSCORE@5..6 "_"
 | 
				
			||||||
 | 
					        COLON@6..7 ":"
 | 
				
			||||||
 | 
					        WHITESPACE@7..8 " "
 | 
				
			||||||
 | 
					        REF_TYPE@8..24
 | 
				
			||||||
 | 
					          AMP@8..9 "&"
 | 
				
			||||||
 | 
					          IMPL_TRAIT_TYPE@9..24
 | 
				
			||||||
 | 
					            IMPL_KW@9..13 "impl"
 | 
				
			||||||
 | 
					            WHITESPACE@13..14 " "
 | 
				
			||||||
 | 
					            TYPE_BOUND_LIST@14..24
 | 
				
			||||||
 | 
					              TYPE_BOUND@14..16
 | 
				
			||||||
 | 
					                LIFETIME@14..16
 | 
				
			||||||
 | 
					                  LIFETIME_IDENT@14..16 "'a"
 | 
				
			||||||
 | 
					              WHITESPACE@16..17 " "
 | 
				
			||||||
 | 
					              PLUS@17..18 "+"
 | 
				
			||||||
 | 
					              WHITESPACE@18..19 " "
 | 
				
			||||||
 | 
					              TYPE_BOUND@19..24
 | 
				
			||||||
 | 
					                PATH_TYPE@19..24
 | 
				
			||||||
 | 
					                  PATH@19..24
 | 
				
			||||||
 | 
					                    PATH_SEGMENT@19..24
 | 
				
			||||||
 | 
					                      NAME_REF@19..24
 | 
				
			||||||
 | 
					                        IDENT@19..24 "Sized"
 | 
				
			||||||
 | 
					      R_PAREN@24..25 ")"
 | 
				
			||||||
 | 
					    WHITESPACE@25..26 " "
 | 
				
			||||||
 | 
					    BLOCK_EXPR@26..28
 | 
				
			||||||
 | 
					      STMT_LIST@26..28
 | 
				
			||||||
 | 
					        L_CURLY@26..27 "{"
 | 
				
			||||||
 | 
					        R_CURLY@27..28 "}"
 | 
				
			||||||
 | 
					error 9..24: ambiguous `+` in a type
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					fn f(_: &impl 'a + Sized) {}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					SOURCE_FILE@0..20
 | 
				
			||||||
 | 
					  FN@0..20
 | 
				
			||||||
 | 
					    FN_KW@0..2 "fn"
 | 
				
			||||||
 | 
					    WHITESPACE@2..3 " "
 | 
				
			||||||
 | 
					    NAME@3..4
 | 
				
			||||||
 | 
					      IDENT@3..4 "f"
 | 
				
			||||||
 | 
					    PARAM_LIST@4..17
 | 
				
			||||||
 | 
					      L_PAREN@4..5 "("
 | 
				
			||||||
 | 
					      PARAM@5..16
 | 
				
			||||||
 | 
					        WILDCARD_PAT@5..6
 | 
				
			||||||
 | 
					          UNDERSCORE@5..6 "_"
 | 
				
			||||||
 | 
					        COLON@6..7 ":"
 | 
				
			||||||
 | 
					        WHITESPACE@7..8 " "
 | 
				
			||||||
 | 
					        REF_TYPE@8..16
 | 
				
			||||||
 | 
					          AMP@8..9 "&"
 | 
				
			||||||
 | 
					          IMPL_TRAIT_TYPE@9..16
 | 
				
			||||||
 | 
					            IMPL_KW@9..13 "impl"
 | 
				
			||||||
 | 
					            WHITESPACE@13..14 " "
 | 
				
			||||||
 | 
					            TYPE_BOUND_LIST@14..16
 | 
				
			||||||
 | 
					              TYPE_BOUND@14..16
 | 
				
			||||||
 | 
					                LIFETIME@14..16
 | 
				
			||||||
 | 
					                  LIFETIME_IDENT@14..16 "'a"
 | 
				
			||||||
 | 
					      R_PAREN@16..17 ")"
 | 
				
			||||||
 | 
					    WHITESPACE@17..18 " "
 | 
				
			||||||
 | 
					    BLOCK_EXPR@18..20
 | 
				
			||||||
 | 
					      STMT_LIST@18..20
 | 
				
			||||||
 | 
					        L_CURLY@18..19 "{"
 | 
				
			||||||
 | 
					        R_CURLY@19..20 "}"
 | 
				
			||||||
 | 
					error 9..16: At least one trait must be specified
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					fn f(_: &impl 'a) {}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue