aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Parse/ParseDecl.cpp
diff options
context:
space:
mode:
authorOleksandr T. <oleksandr.tarasiuk@outlook.com>2025-06-15 00:01:25 +0300
committerGitHub <noreply@github.com>2025-06-15 00:01:25 +0300
commit0ff95c9eb1e3b0785724d3e33df1e1f77f2c7473 (patch)
tree469d972d3d911e275c64f09b0eb85d20004fea4c /clang/lib/Parse/ParseDecl.cpp
parentdb682a721aabf3c33dfda471bf6a7908fbf656b4 (diff)
downloadllvm-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.cpp96
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;