diff options
author | Oleksandr T. <oleksandr.tarasiuk@outlook.com> | 2025-06-15 00:01:25 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-15 00:01:25 +0300 |
commit | 0ff95c9eb1e3b0785724d3e33df1e1f77f2c7473 (patch) | |
tree | 469d972d3d911e275c64f09b0eb85d20004fea4c /clang/lib/Parse/ParseDecl.cpp | |
parent | db682a721aabf3c33dfda471bf6a7908fbf656b4 (diff) | |
download | llvm-0ff95c9eb1e3b0785724d3e33df1e1f77f2c7473.zip llvm-0ff95c9eb1e3b0785724d3e33df1e1f77f2c7473.tar.gz llvm-0ff95c9eb1e3b0785724d3e33df1e1f77f2c7473.tar.bz2 |
[Clang] add fix-it hints for unknown attributes (#141305)
This patch adds fix-it hints for unknown attribute names when Clang
suggests a correction
Diffstat (limited to 'clang/lib/Parse/ParseDecl.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 96 |
1 files changed, 51 insertions, 45 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 647ee34..02f3351 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -151,7 +151,7 @@ bool Parser::ParseSingleGNUAttribute(ParsedAttributes &Attrs, SourceLocation AttrNameLoc = ConsumeToken(); if (Tok.isNot(tok::l_paren)) { - Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + Attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, ParsedAttr::Form::GNU()); return false; } @@ -396,12 +396,12 @@ void Parser::ParseAttributeWithTypeArg(IdentifierInfo &AttrName, return; if (T.isUsable()) - Attrs.addNewTypeAttr(&AttrName, - SourceRange(AttrNameLoc, Parens.getCloseLocation()), - ScopeName, ScopeLoc, T.get(), Form); + Attrs.addNewTypeAttr( + &AttrName, SourceRange(AttrNameLoc, Parens.getCloseLocation()), + AttributeScopeInfo(ScopeName, ScopeLoc), T.get(), Form); else Attrs.addNew(&AttrName, SourceRange(AttrNameLoc, Parens.getCloseLocation()), - ScopeName, ScopeLoc, nullptr, 0, Form); + AttributeScopeInfo(ScopeName, ScopeLoc), nullptr, 0, Form); } ExprResult @@ -609,10 +609,12 @@ unsigned Parser::ParseAttributeArgsCommon( if (AttributeIsTypeArgAttr && !TheParsedType.get().isNull()) { Attrs.addNewTypeAttr(AttrName, SourceRange(AttrNameLoc, RParen), - ScopeName, ScopeLoc, TheParsedType, Form); + AttributeScopeInfo(ScopeName, ScopeLoc), + TheParsedType, Form); } else { - Attrs.addNew(AttrName, SourceRange(AttrLoc, RParen), ScopeName, ScopeLoc, - ArgExprs.data(), ArgExprs.size(), Form); + Attrs.addNew(AttrName, SourceRange(AttrLoc, RParen), + AttributeScopeInfo(ScopeName, ScopeLoc), ArgExprs.data(), + ArgExprs.size(), Form); } } @@ -854,7 +856,7 @@ bool Parser::ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName, // Only add the property attribute if it was well-formed. if (!HasInvalidAccessor) - Attrs.addNewPropertyAttr(AttrName, AttrNameLoc, nullptr, SourceLocation(), + Attrs.addNewPropertyAttr(AttrName, AttrNameLoc, AttributeScopeInfo(), AccessorNames[AK_Get], AccessorNames[AK_Put], ParsedAttr::Form::Declspec()); T.skipToEnd(); @@ -940,7 +942,7 @@ void Parser::ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) { << AttrName->getName(); if (!AttrHandled) - Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + Attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, ParsedAttr::Form::Declspec()); } T.consumeClose(); @@ -968,7 +970,7 @@ void Parser::ParseMicrosoftTypeAttributes(ParsedAttributes &attrs) { case tok::kw___uptr: { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, Kind); break; } @@ -989,9 +991,8 @@ void Parser::ParseWebAssemblyFuncrefTypeAttribute(ParsedAttributes &attrs) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, /*ScopeName=*/nullptr, - /*ScopeLoc=*/SourceLocation{}, /*Args=*/nullptr, /*numArgs=*/0, - tok::kw___funcref); + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), /*Args=*/nullptr, + /*numArgs=*/0, tok::kw___funcref); } void Parser::DiagnoseAndSkipExtendedMicrosoftTypeAttributes() { @@ -1035,7 +1036,7 @@ void Parser::ParseBorlandTypeAttributes(ParsedAttributes &attrs) { while (Tok.is(tok::kw___pascal)) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, tok::kw___pascal); } } @@ -1045,7 +1046,7 @@ void Parser::ParseOpenCLKernelAttributes(ParsedAttributes &attrs) { while (Tok.is(tok::kw___kernel)) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, tok::kw___kernel); } } @@ -1054,7 +1055,7 @@ void Parser::ParseCUDAFunctionAttributes(ParsedAttributes &attrs) { while (Tok.is(tok::kw___noinline__)) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = ConsumeToken(); - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, tok::kw___noinline__); } } @@ -1062,7 +1063,7 @@ void Parser::ParseCUDAFunctionAttributes(ParsedAttributes &attrs) { void Parser::ParseOpenCLQualifiers(ParsedAttributes &Attrs) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = Tok.getLocation(); - Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + Attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, Tok.getKind()); } @@ -1074,7 +1075,7 @@ void Parser::ParseHLSLQualifiers(ParsedAttributes &Attrs) { IdentifierInfo *AttrName = Tok.getIdentifierInfo(); auto Kind = Tok.getKind(); SourceLocation AttrNameLoc = ConsumeToken(); - Attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, Kind); + Attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, Kind); } void Parser::ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs) { @@ -1091,7 +1092,7 @@ void Parser::ParseNullabilityTypeSpecifiers(ParsedAttributes &attrs) { if (!getLangOpts().ObjC) Diag(AttrNameLoc, diag::ext_nullability) << AttrName; - attrs.addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, nullptr, 0, + attrs.addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, Kind); break; } @@ -1435,10 +1436,11 @@ void Parser::ParseAvailabilityAttribute( // Record this attribute attrs.addNew(&Availability, - SourceRange(AvailabilityLoc, T.getCloseLocation()), ScopeName, - ScopeLoc, Platform, Changes[Introduced], Changes[Deprecated], - Changes[Obsoleted], UnavailableLoc, MessageExpr.get(), Form, - StrictLoc, ReplacementExpr.get(), EnvironmentLoc); + SourceRange(AvailabilityLoc, T.getCloseLocation()), + AttributeScopeInfo(ScopeName, ScopeLoc), Platform, + Changes[Introduced], Changes[Deprecated], Changes[Obsoleted], + UnavailableLoc, MessageExpr.get(), Form, StrictLoc, + ReplacementExpr.get(), EnvironmentLoc); } void Parser::ParseExternalSourceSymbolAttribute( @@ -1556,7 +1558,8 @@ void Parser::ParseExternalSourceSymbolAttribute( ArgsUnion Args[] = {Language.get(), DefinedInExpr.get(), GeneratedDeclaration, USR.get()}; Attrs.addNew(&ExternalSourceSymbol, SourceRange(Loc, T.getCloseLocation()), - ScopeName, ScopeLoc, Args, std::size(Args), Form); + AttributeScopeInfo(ScopeName, ScopeLoc), Args, std::size(Args), + Form); } void Parser::ParseObjCBridgeRelatedAttribute( @@ -1624,8 +1627,8 @@ void Parser::ParseObjCBridgeRelatedAttribute( // Record this attribute Attrs.addNew(&ObjCBridgeRelated, SourceRange(ObjCBridgeRelatedLoc, T.getCloseLocation()), - ScopeName, ScopeLoc, RelatedClass, ClassMethod, InstanceMethod, - Form); + AttributeScopeInfo(ScopeName, ScopeLoc), RelatedClass, + ClassMethod, InstanceMethod, Form); } void Parser::ParseSwiftNewTypeAttribute( @@ -1666,7 +1669,8 @@ void Parser::ParseSwiftNewTypeAttribute( ArgsUnion Args[] = {SwiftType}; Attrs.addNew(&AttrName, SourceRange(AttrNameLoc, T.getCloseLocation()), - ScopeName, ScopeLoc, Args, std::size(Args), Form); + AttributeScopeInfo(ScopeName, ScopeLoc), Args, std::size(Args), + Form); } void Parser::ParseTypeTagForDatatypeAttribute( @@ -1719,9 +1723,9 @@ void Parser::ParseTypeTagForDatatypeAttribute( } if (!T.consumeClose()) { - Attrs.addNewTypeTagForDatatype(&AttrName, AttrNameLoc, ScopeName, ScopeLoc, - ArgumentKind, MatchingCType.get(), - LayoutCompatible, MustBeNull, Form); + Attrs.addNewTypeTagForDatatype( + &AttrName, AttrNameLoc, AttributeScopeInfo(ScopeName, ScopeLoc), + ArgumentKind, MatchingCType.get(), LayoutCompatible, MustBeNull, Form); } if (EndLoc) @@ -1828,9 +1832,10 @@ void Parser::ProhibitCXX11Attributes(ParsedAttributes &Attrs, if (!AL.isStandardAttributeSyntax()) continue; if (AL.getKind() == ParsedAttr::UnknownAttribute) { - if (WarnOnUnknownAttrs) - Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored) - << AL << AL.getRange(); + if (WarnOnUnknownAttrs) { + Actions.DiagnoseUnknownAttribute(AL); + AL.setInvalid(); + } } else { Diag(AL.getLoc(), AttrDiagID) << AL; AL.setInvalid(); @@ -3117,12 +3122,12 @@ void Parser::ParseAlignmentSpecifier(ParsedAttributes &Attrs, *EndLoc = T.getCloseLocation(); if (IsType) { - Attrs.addNewTypeAttr(KWName, KWLoc, nullptr, KWLoc, TypeResult, Kind, + Attrs.addNewTypeAttr(KWName, KWLoc, AttributeScopeInfo(), TypeResult, Kind, EllipsisLoc); } else { ArgsVector ArgExprs; ArgExprs.push_back(ArgExpr.get()); - Attrs.addNew(KWName, KWLoc, nullptr, KWLoc, ArgExprs.data(), 1, Kind, + Attrs.addNew(KWName, KWLoc, AttributeScopeInfo(), ArgExprs.data(), 1, Kind, EllipsisLoc); } } @@ -3168,9 +3173,8 @@ void Parser::ParsePtrauthQualifier(ParsedAttributes &Attrs) { return; } - Attrs.addNew(KwName, SourceRange(KwLoc, EndLoc), - /*scope*/ nullptr, SourceLocation(), ArgExprs.data(), - ArgExprs.size(), + Attrs.addNew(KwName, SourceRange(KwLoc, EndLoc), AttributeScopeInfo(), + ArgExprs.data(), ArgExprs.size(), ParsedAttr::Form::Keyword(/*IsAlignAs=*/false, /*IsRegularKeywordAttribute=*/false)); } @@ -3216,7 +3220,7 @@ void Parser::ParseBoundsAttribute(IdentifierInfo &AttrName, Ctx.getSizeType(), SourceLocation())); Attrs.addNew(&AttrName, SourceRange(AttrNameLoc, Parens.getCloseLocation()), - ScopeName, ScopeLoc, ArgExprs.data(), ArgExprs.size(), Form); + AttributeScopeInfo(), ArgExprs.data(), ArgExprs.size(), Form); } ExprResult Parser::ParseExtIntegerArgument() { @@ -3995,7 +3999,7 @@ void Parser::ParseDeclarationSpecifiers( isInvalid = DS.setFunctionSpecForceInline(Loc, PrevSpec, DiagID); IdentifierInfo *AttrName = Tok.getIdentifierInfo(); SourceLocation AttrNameLoc = Tok.getLocation(); - DS.getAttributes().addNew(AttrName, AttrNameLoc, nullptr, AttrNameLoc, + DS.getAttributes().addNew(AttrName, AttrNameLoc, AttributeScopeInfo(), nullptr, 0, tok::kw___forceinline); break; } @@ -4053,8 +4057,9 @@ void Parser::ParseDeclarationSpecifiers( // Objective-C 'kindof' types. case tok::kw___kindof: - DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc, - nullptr, 0, tok::kw___kindof); + DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, + AttributeScopeInfo(), nullptr, 0, + tok::kw___kindof); (void)ConsumeToken(); continue; @@ -6238,8 +6243,9 @@ void Parser::ParseTypeQualifierListOpt( // Objective-C 'kindof' types. case tok::kw___kindof: - DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, nullptr, Loc, - nullptr, 0, tok::kw___kindof); + DS.getAttributes().addNew(Tok.getIdentifierInfo(), Loc, + AttributeScopeInfo(), nullptr, 0, + tok::kw___kindof); (void)ConsumeToken(); continue; |