1
Fork 0

add diagnostic for dangling dyn

This commit is contained in:
bit-aloo 2025-03-02 19:41:39 +05:30
parent da06b7c1bb
commit 2f9e5586a0
No known key found for this signature in database
GPG key ID: 02911B24FDAE81DA
3 changed files with 42 additions and 8 deletions

View file

@ -340,17 +340,25 @@ fn validate_trait_object_fn_ptr_ret_ty(ty: ast::FnPtrType, errors: &mut Vec<Synt
fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option<SyntaxError> {
let tbl = ty.type_bound_list()?;
let bounds_count = tbl.bounds().count();
if tbl.bounds().count() > 1 {
let dyn_token = ty.dyn_token()?;
let potential_parenthesis =
algo::skip_trivia_token(dyn_token.prev_token()?, Direction::Prev)?;
let kind = potential_parenthesis.kind();
if !matches!(kind, T!['('] | T![<] | T![=]) {
return Some(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range()));
match bounds_count {
0 => Some(SyntaxError::new(
"At least one trait is required for an object type",
ty.syntax().text_range(),
)),
_ if bounds_count > 1 => {
let dyn_token = ty.dyn_token()?;
let preceding_token =
algo::skip_trivia_token(dyn_token.prev_token()?, Direction::Prev)?;
if !matches!(preceding_token.kind(), T!['('] | T![<] | T![=]) {
return Some(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range()));
}
None
}
_ => None,
}
None
}
fn validate_macro_rules(mac: ast::MacroRules, errors: &mut Vec<SyntaxError>) {

View file

@ -0,0 +1,25 @@
SOURCE_FILE@0..16
FN@0..16
FN_KW@0..2 "fn"
WHITESPACE@2..3 " "
NAME@3..4
IDENT@3..4 "f"
PARAM_LIST@4..13
L_PAREN@4..5 "("
PARAM@5..12
WILDCARD_PAT@5..6
UNDERSCORE@5..6 "_"
COLON@6..7 ":"
WHITESPACE@7..8 " "
REF_TYPE@8..12
AMP@8..9 "&"
DYN_TRAIT_TYPE@9..12
DYN_KW@9..12 "dyn"
TYPE_BOUND_LIST@12..12
R_PAREN@12..13 ")"
WHITESPACE@13..14 " "
BLOCK_EXPR@14..16
STMT_LIST@14..16
L_CURLY@14..15 "{"
R_CURLY@15..16 "}"
error 9..12: At least one trait is required for an object type