Skip to content

Commit cccba22

Browse files
committed
[AutoBump] Merge with 3057d0f (Jan 22)
2 parents b92605a + 3057d0f commit cccba22

File tree

161 files changed

+4265
-3402
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+4265
-3402
lines changed

clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,13 @@ UseIntegerSignComparisonCheck::UseIntegerSignComparisonCheck(
8080
: ClangTidyCheck(Name, Context),
8181
IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
8282
utils::IncludeSorter::IS_LLVM),
83-
areDiagsSelfContained()) {}
83+
areDiagsSelfContained()),
84+
EnableQtSupport(Options.get("EnableQtSupport", false)) {}
8485

8586
void UseIntegerSignComparisonCheck::storeOptions(
8687
ClangTidyOptions::OptionMap &Opts) {
8788
Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
89+
Options.store(Opts, "EnableQtSupport", EnableQtSupport);
8890
}
8991

9092
void UseIntegerSignComparisonCheck::registerMatchers(MatchFinder *Finder) {
@@ -154,8 +156,17 @@ void UseIntegerSignComparisonCheck::check(
154156
DiagnosticBuilder Diag =
155157
diag(BinaryOp->getBeginLoc(),
156158
"comparison between 'signed' and 'unsigned' integers");
157-
const std::string CmpNamespace = ("std::" + parseOpCode(OpCode)).str();
158-
const std::string CmpHeader = "<utility>";
159+
std::string CmpNamespace;
160+
llvm::StringRef CmpHeader;
161+
162+
if (getLangOpts().CPlusPlus20) {
163+
CmpHeader = "<utility>";
164+
CmpNamespace = llvm::Twine("std::" + parseOpCode(OpCode)).str();
165+
} else if (getLangOpts().CPlusPlus17 && EnableQtSupport) {
166+
CmpHeader = "<QtCore/q20utility.h>";
167+
CmpNamespace = llvm::Twine("q20::" + parseOpCode(OpCode)).str();
168+
}
169+
159170
// Prefer modernize-use-integer-sign-comparison when C++20 is available!
160171
Diag << FixItHint::CreateReplacement(
161172
CharSourceRange(R1, SubExprLHS != nullptr),

clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ class UseIntegerSignComparisonCheck : public ClangTidyCheck {
3030
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
3131
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
3232
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
33-
return LangOpts.CPlusPlus20;
33+
return LangOpts.CPlusPlus20 || (LangOpts.CPlusPlus17 && EnableQtSupport);
3434
}
3535

3636
private:
3737
utils::IncludeInserter IncludeInserter;
38+
const bool EnableQtSupport;
3839
};
3940

4041
} // namespace clang::tidy::modernize

clang-tools-extra/clangd/GlobalCompilationDatabase.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ OverlayCDB::getProjectModules(PathRef File) const {
837837
PathRef CommandPath) {
838838
Mangler(Command, CommandPath);
839839
});
840-
return std::move(MDB);
840+
return MDB;
841841
}
842842

843843
DelegatingCDB::DelegatingCDB(const GlobalCompilationDatabase *Base)

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ Changes in existing checks
329329
<clang-tidy/checks/modernize/use-designated-initializers>` check to fix a
330330
crash when a class is declared but not defined.
331331

332+
- Improved :doc:`modernize-use-integer-sign-comparison
333+
<clang-tidy/checks/modernize/use-integer-sign-comparison>` check to
334+
add an option ``EnableQtSupport``, that makes C++17 ``q20::cmp_*`` alternative
335+
available for Qt-based applications.
336+
332337
- Improved :doc:`modernize-use-nullptr
333338
<clang-tidy/checks/modernize/use-nullptr>` check to also recognize
334339
``NULL``/``__null`` (but not ``0``) when used with a templated type.

clang-tools-extra/docs/clang-tidy/checks/modernize/use-integer-sign-comparison.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,8 @@ Options
3434

3535
A string specifying which include-style is used, `llvm` or `google`.
3636
Default is `llvm`.
37+
38+
.. option:: EnableQtSupport
39+
40+
Makes C++17 ``q20::cmp_*`` alternative available for Qt-based
41+
applications. Default is `false`.
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// CHECK-FIXES: #include <QtCore/q20utility.h>
2+
// RUN: %check_clang_tidy -std=c++17 %s modernize-use-integer-sign-comparison %t -- \
3+
// RUN: -config="{CheckOptions: {modernize-use-integer-sign-comparison.EnableQtSupport: true}}"
4+
5+
// The code that triggers the check
6+
#define MAX_MACRO(a, b) (a < b) ? b : a
7+
8+
unsigned int FuncParameters(int bla) {
9+
unsigned int result = 0;
10+
if (result == bla)
11+
return 0;
12+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
13+
// CHECK-FIXES: if (q20::cmp_equal(result , bla))
14+
15+
return 1;
16+
}
17+
18+
template <typename T>
19+
void TemplateFuncParameter(T val) {
20+
unsigned long uL = 0;
21+
if (val >= uL)
22+
return;
23+
// CHECK-MESSAGES-NOT: warning:
24+
}
25+
26+
template <typename T1, typename T2>
27+
int TemplateFuncParameters(T1 val1, T2 val2) {
28+
if (val1 >= val2)
29+
return 0;
30+
// CHECK-MESSAGES-NOT: warning:
31+
return 1;
32+
}
33+
34+
int AllComparisons() {
35+
unsigned int uVar = 42;
36+
unsigned short uArray[7] = {0, 1, 2, 3, 9, 7, 9};
37+
38+
int sVar = -42;
39+
short sArray[7] = {-1, -2, -8, -94, -5, -4, -6};
40+
41+
enum INT_TEST {
42+
VAL1 = 0,
43+
VAL2 = -1
44+
};
45+
46+
char ch = 'a';
47+
unsigned char uCh = 'a';
48+
signed char sCh = 'a';
49+
bool bln = false;
50+
51+
if (bln == sVar)
52+
return 0;
53+
// CHECK-MESSAGES-NOT: warning:
54+
55+
if (ch > uCh)
56+
return 0;
57+
// CHECK-MESSAGES-NOT: warning:
58+
59+
if (sVar <= INT_TEST::VAL2)
60+
return 0;
61+
// CHECK-MESSAGES-NOT: warning:
62+
63+
if (uCh < sCh)
64+
return -1;
65+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
66+
// CHECK-FIXES: if (q20::cmp_less(uCh , sCh))
67+
68+
if ((int)uVar < sVar)
69+
return 0;
70+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
71+
// CHECK-FIXES: if (q20::cmp_less(uVar, sVar))
72+
73+
(uVar != sVar) ? uVar = sVar
74+
: sVar = uVar;
75+
// CHECK-MESSAGES: :[[@LINE-2]]:6: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
76+
// CHECK-FIXES: (q20::cmp_not_equal(uVar , sVar)) ? uVar = sVar
77+
78+
while (uArray[0] <= sArray[0])
79+
return 0;
80+
// CHECK-MESSAGES: :[[@LINE-2]]:12: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
81+
// CHECK-FIXES: while (q20::cmp_less_equal(uArray[0] , sArray[0]))
82+
83+
if (uArray[1] > sArray[1])
84+
return 0;
85+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
86+
// CHECK-FIXES: if (q20::cmp_greater(uArray[1] , sArray[1]))
87+
88+
MAX_MACRO(uVar, sArray[0]);
89+
// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
90+
91+
if (static_cast<unsigned int>(uArray[2]) < static_cast<int>(sArray[2]))
92+
return 0;
93+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
94+
// CHECK-FIXES: if (q20::cmp_less(uArray[2],sArray[2]))
95+
96+
if ((unsigned int)uArray[3] < (int)sArray[3])
97+
return 0;
98+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
99+
// CHECK-FIXES: if (q20::cmp_less(uArray[3],sArray[3]))
100+
101+
if ((unsigned int)(uArray[4]) < (int)(sArray[4]))
102+
return 0;
103+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
104+
// CHECK-FIXES: if (q20::cmp_less((uArray[4]),(sArray[4])))
105+
106+
if (uArray[5] > sArray[5])
107+
return 0;
108+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
109+
// CHECK-FIXES: if (q20::cmp_greater(uArray[5] , sArray[5]))
110+
111+
#define VALUE sArray[6]
112+
if (uArray[6] > VALUE)
113+
return 0;
114+
// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: comparison between 'signed' and 'unsigned' integers [modernize-use-integer-sign-comparison]
115+
// CHECK-FIXES: if (q20::cmp_greater(uArray[6] , VALUE))
116+
117+
118+
FuncParameters(uVar);
119+
TemplateFuncParameter(sVar);
120+
TemplateFuncParameters(uVar, sVar);
121+
122+
return 0;
123+
}

clang/include/clang/AST/Attr.h

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ class Attr : public AttributeCommonInfo {
6060
unsigned IsLateParsed : 1;
6161
LLVM_PREFERRED_TYPE(bool)
6262
unsigned InheritEvenIfAlreadyPresent : 1;
63-
LLVM_PREFERRED_TYPE(bool)
64-
unsigned DeferDeserialization : 1;
6563

6664
void *operator new(size_t bytes) noexcept {
6765
llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
@@ -82,11 +80,10 @@ class Attr : public AttributeCommonInfo {
8280

8381
protected:
8482
Attr(ASTContext &Context, const AttributeCommonInfo &CommonInfo,
85-
attr::Kind AK, bool IsLateParsed, bool DeferDeserialization = false)
83+
attr::Kind AK, bool IsLateParsed)
8684
: AttributeCommonInfo(CommonInfo), AttrKind(AK), Inherited(false),
8785
IsPackExpansion(false), Implicit(false), IsLateParsed(IsLateParsed),
88-
InheritEvenIfAlreadyPresent(false),
89-
DeferDeserialization(DeferDeserialization) {}
86+
InheritEvenIfAlreadyPresent(false) {}
9087

9188
public:
9289
attr::Kind getKind() const { return static_cast<attr::Kind>(AttrKind); }
@@ -108,8 +105,6 @@ class Attr : public AttributeCommonInfo {
108105
void setPackExpansion(bool PE) { IsPackExpansion = PE; }
109106
bool isPackExpansion() const { return IsPackExpansion; }
110107

111-
bool shouldDeferDeserialization() const { return DeferDeserialization; }
112-
113108
// Clone this attribute.
114109
Attr *clone(ASTContext &C) const;
115110

@@ -151,9 +146,8 @@ class InheritableAttr : public Attr {
151146
protected:
152147
InheritableAttr(ASTContext &Context, const AttributeCommonInfo &CommonInfo,
153148
attr::Kind AK, bool IsLateParsed,
154-
bool InheritEvenIfAlreadyPresent,
155-
bool DeferDeserialization = false)
156-
: Attr(Context, CommonInfo, AK, IsLateParsed, DeferDeserialization) {
149+
bool InheritEvenIfAlreadyPresent)
150+
: Attr(Context, CommonInfo, AK, IsLateParsed) {
157151
this->InheritEvenIfAlreadyPresent = InheritEvenIfAlreadyPresent;
158152
}
159153

clang/include/clang/Basic/Attr.td

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -713,12 +713,6 @@ class Attr {
713713
// attribute may be documented under multiple categories, more than one
714714
// Documentation entry may be listed.
715715
list<Documentation> Documentation;
716-
// Set to true if deserialization of this attribute must be deferred until
717-
// the parent Decl is fully deserialized (during header module file
718-
// deserialization). E.g., this is the case for the preferred_name attribute,
719-
// since its type deserialization depends on its target Decl type.
720-
// (See https://github.com/llvm/llvm-project/issues/56490 for details).
721-
bit DeferDeserialization = 0;
722716
}
723717

724718
/// Used to define a set of mutually exclusive attributes.
@@ -3260,11 +3254,6 @@ def PreferredName : InheritableAttr {
32603254
let InheritEvenIfAlreadyPresent = 1;
32613255
let MeaningfulToClassTemplateDefinition = 1;
32623256
let TemplateDependent = 1;
3263-
// Type of this attribute depends on the target Decl type.
3264-
// Therefore, its deserialization must be deferred until
3265-
// deserialization of the target Decl is complete
3266-
// (for header modules).
3267-
let DeferDeserialization = 1;
32683257
}
32693258

32703259
def PreserveMost : DeclOrTypeAttr {

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4987,27 +4987,27 @@ let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] i
49874987
def vminmaxsd_round_mask : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>, _Constant int, _Vector<2, double>, unsigned char, _Constant int)">;
49884988
def vminmaxsh_round_mask : X86Builtin<"_Vector<8, _Float16>(_Vector<8, _Float16>, _Vector<8, _Float16>, _Constant int, _Vector<8, _Float16>, unsigned char, _Constant int)">;
49894989
def vminmaxss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>, _Constant int, _Vector<4, float>, unsigned char, _Constant int)">;
4990-
def vcvtnebf162ibs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
4990+
def vcvtbf162ibs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
49914991
}
49924992

49934993
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<256>] in {
4994-
def vcvtnebf162ibs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
4994+
def vcvtbf162ibs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
49954995
}
49964996

49974997
let Features = "avx10.2-512", Attributes = [NoThrow, RequiredVectorWidth<512>] in {
4998-
def vcvtnebf162ibs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
4998+
def vcvtbf162ibs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
49994999
}
50005000

50015001
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] in {
5002-
def vcvtnebf162iubs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
5002+
def vcvtbf162iubs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
50035003
}
50045004

50055005
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<256>] in {
5006-
def vcvtnebf162iubs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
5006+
def vcvtbf162iubs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
50075007
}
50085008

50095009
let Features = "avx10.2-512", Attributes = [NoThrow, RequiredVectorWidth<512>] in {
5010-
def vcvtnebf162iubs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
5010+
def vcvtbf162iubs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
50115011
}
50125012

50135013
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] in {
@@ -5059,27 +5059,27 @@ let Features = "avx10.2-512", Attributes = [NoThrow, RequiredVectorWidth<512>] i
50595059
}
50605060

50615061
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] in {
5062-
def vcvttnebf162ibs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
5062+
def vcvttbf162ibs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
50635063
}
50645064

50655065
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<256>] in {
5066-
def vcvttnebf162ibs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
5066+
def vcvttbf162ibs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
50675067
}
50685068

50695069
let Features = "avx10.2-512", Attributes = [NoThrow, RequiredVectorWidth<512>] in {
5070-
def vcvttnebf162ibs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
5070+
def vcvttbf162ibs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
50715071
}
50725072

50735073
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] in {
5074-
def vcvttnebf162iubs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
5074+
def vcvttbf162iubs128 : X86Builtin<"_Vector<8, unsigned short>(_Vector<8, __bf16>)">;
50755075
}
50765076

50775077
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<256>] in {
5078-
def vcvttnebf162iubs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
5078+
def vcvttbf162iubs256 : X86Builtin<"_Vector<16, unsigned short>(_Vector<16, __bf16>)">;
50795079
}
50805080

50815081
let Features = "avx10.2-512", Attributes = [NoThrow, RequiredVectorWidth<512>] in {
5082-
def vcvttnebf162iubs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
5082+
def vcvttbf162iubs512 : X86Builtin<"_Vector<32, unsigned short>(_Vector<32, __bf16>)">;
50835083
}
50845084

50855085
let Features = "avx10.2-256", Attributes = [NoThrow, RequiredVectorWidth<128>] in {

clang/include/clang/Serialization/ASTReader.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,24 +1236,6 @@ class ASTReader
12361236
/// been completed.
12371237
std::deque<PendingDeclContextInfo> PendingDeclContextInfos;
12381238

1239-
/// Deserialization of some attributes must be deferred since they refer
1240-
/// to themselves in their type (e.g., preferred_name attribute refers to the
1241-
/// typedef that refers back to the template specialization of the template
1242-
/// that the attribute is attached to).
1243-
/// More attributes that store TypeSourceInfo might be potentially affected,
1244-
/// see https://github.com/llvm/llvm-project/issues/56490 for details.
1245-
struct DeferredAttribute {
1246-
// Index of the deferred attribute in the Record of the TargetedDecl.
1247-
uint64_t RecordIdx;
1248-
// Decl to attach a deferred attribute to.
1249-
Decl *TargetedDecl;
1250-
};
1251-
1252-
/// The collection of Decls that have been loaded but some of their attributes
1253-
/// have been deferred, paired with the index inside the record pointing
1254-
/// at the skipped attribute.
1255-
SmallVector<DeferredAttribute> PendingDeferredAttributes;
1256-
12571239
template <typename DeclTy>
12581240
using DuplicateObjCDecls = std::pair<DeclTy *, DeclTy *>;
12591241

@@ -1606,7 +1588,6 @@ class ASTReader
16061588
void loadPendingDeclChain(Decl *D, uint64_t LocalOffset);
16071589
void loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
16081590
unsigned PreviousGeneration = 0);
1609-
void loadDeferredAttribute(const DeferredAttribute &DA);
16101591

16111592
RecordLocation getLocalBitOffset(uint64_t GlobalOffset);
16121593
uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset);

clang/include/clang/Serialization/ASTRecordReader.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,6 @@ class ASTRecordReader
8383
/// Returns the current value in this record, without advancing.
8484
uint64_t peekInt() { return Record[Idx]; }
8585

86-
/// Returns the next N values in this record, without advancing.
87-
uint64_t peekInts(unsigned N) { return Record[Idx + N]; }
88-
89-
/// Skips the current value.
90-
void skipInt() { Idx += 1; }
91-
9286
/// Skips the specified number of values.
9387
void skipInts(unsigned N) { Idx += N; }
9488

@@ -341,12 +335,7 @@ class ASTRecordReader
341335
Attr *readAttr();
342336

343337
/// Reads attributes from the current stream position, advancing Idx.
344-
/// For some attributes (where type depends on itself recursively), defer
345-
/// reading the attribute until the type has been read.
346-
void readAttributes(AttrVec &Attrs, Decl *D = nullptr);
347-
348-
/// Reads one attribute from the current stream position, advancing Idx.
349-
Attr *readOrDeferAttrFor(Decl *D);
338+
void readAttributes(AttrVec &Attrs);
350339

351340
/// Read an BTFTypeTagAttr object.
352341
BTFTypeTagAttr *readBTFTypeTagAttr() {

0 commit comments

Comments
 (0)