Skip to content

Commit bdb1166

Browse files
committed
[BoundsSafety] Pick up some more recent updates
1 parent 5f998b8 commit bdb1166

31 files changed

+8736
-234
lines changed

clang/include/clang/AST/ASTContext.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1508,9 +1508,18 @@ class ASTContext : public RefCountedBase<ASTContext> {
15081508
/// \p DstTy. The type merging is performed recursively in nested pointers.
15091509
/// The caller should provide \p MergeFunctor to create a merged pointer type
15101510
/// using the recursively merged pointee type.
1511+
/// mergeBoundsSafetyPointerTypes removes any AttributedType(s) from \p
1512+
/// DstTy, calls \p MergeFunctor to merge the attributes at each level, and
1513+
/// then reapplies the AttributedType(s) to the merged type. \p OrigDstTy is
1514+
/// the same as \p DstTy but without dropping the AttributedType(s). This
1515+
/// allows us to check any AttributedType(s) in \p MergeFunctor in order to
1516+
/// make decision about the merged type.
15111517
QualType mergeBoundsSafetyPointerTypes(
15121518
QualType DstTy, QualType SrcTy,
1513-
std::function<QualType(QualType, QualType, QualType)> &MergeFunctor);
1519+
std::function<QualType(QualType /* DstTy */, QualType /* SrcTy */,
1520+
QualType /* MergePointeeTy */,
1521+
QualType /* OrigDstTy */)> &MergeFunctor,
1522+
QualType OrigDstTy = QualType());
15141523

15151524
QualType getBoundsSafetyAutoPointerType(QualType T,
15161525
BoundsSafetyPointerAttributes AbiFAttr,

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12691,24 +12691,24 @@ def err_bounds_safety_counted_by_on_incomplete_type_on_use : Error <
1269112691

1269212692
def err_bounds_safety_counted_by_on_incomplete_type_on_assign : Error <
1269312693
"cannot %select{"
12694-
"assign to %select{object|'%1'}2 that has|" // AA_Assigning,
12695-
"pass argument to %select{parameter|parameter '%1'}2 that has|" // AA_Passing,
12696-
"return|" // AA_Returning,
12697-
"convert to|" // AA_Converting (UNUSED)
12698-
"%select{|implicitly }3initialize %select{object|'%1'}2 that has|" // AA_Initializing,
12699-
"pass argument to parameter that has|" // AA_Sending (UNUSED)
12700-
"cast to|" // AA_Casting (UNUSED)
12701-
"pass argument to parameter that has" // AA_Passing_CFAudited (UNUSED)
12694+
"assign to %select{object|'%1'}2 that has|" // AssignmentAction::Assigning,
12695+
"pass argument to %select{parameter|parameter '%1'}2 that has|" // AssignmentAction::Passing,
12696+
"return|" // AssignmentAction::Returning,
12697+
"convert to|" // AssignmentAction::Converting (UNUSED)
12698+
"%select{|implicitly }3initialize %select{object|'%1'}2 that has|" // AssignmentAction::Initializing,
12699+
"pass argument to parameter that has|" // AssignmentAction::Sending (UNUSED)
12700+
"cast to|" // AssignmentAction::Casting (UNUSED)
12701+
"pass argument to parameter that has" // AssignmentAction::Passing_CFAudited (UNUSED)
1270212702
"}0 type %4 because the pointee type %6 is incomplete and the '%5' attribute "
1270312703
"requires the pointee type be complete when %select{"
12704-
"assigning|" // AA_Assigning,
12705-
"passing|" // AA_Passing,
12706-
"returning|" // AA_Returning,
12707-
"converting|" // AA_Converting (UNUSED)
12708-
"initializing|" // AA_Initializing,
12709-
"passing|" // AA_Sending (UNUSED)
12710-
"casting|" // AA_Casting (UNUSED)
12711-
"passing" // AA_Passing_CFAudited (UNUSED)
12704+
"assigning|" // AssignmentAction::Assigning,
12705+
"passing|" // AssignmentAction::Passing,
12706+
"returning|" // AssignmentAction::Returning,
12707+
"converting|" // AssignmentAction::Converting (UNUSED)
12708+
"initializing|" // AssignmentAction::Initializing,
12709+
"passing|" // AssignmentAction::Sending (UNUSED)
12710+
"casting|" // AssignmentAction::Casting (UNUSED)
12711+
"passing" // AssignmentAction::Passing_CFAudited (UNUSED)
1271212712
"}0; "
1271312713
"consider providing a complete definition for %6 or using the "
1271412714
"'__sized_by%select{|_or_null}7' attribute"

clang/include/clang/Sema/DeclSpec.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1272,11 +1272,13 @@ struct DeclaratorChunk {
12721272
struct LateParsedAttrInfo {
12731273
CachedTokens Toks;
12741274
IdentifierInfo &AttrName;
1275+
IdentifierInfo *MacroII = nullptr;
12751276
SourceLocation AttrNameLoc;
12761277

12771278
explicit LateParsedAttrInfo(CachedTokens Toks, IdentifierInfo &AttrName,
1279+
IdentifierInfo *MacroII,
12781280
SourceLocation AttrNameLoc)
1279-
: Toks(Toks), AttrName(AttrName), AttrNameLoc(AttrNameLoc) {}
1281+
: Toks(Toks), AttrName(AttrName), MacroII(MacroII), AttrNameLoc(AttrNameLoc) {}
12801282
};
12811283
/* TO_UPSTREAM(BoundsSafety) OFF */
12821284

clang/include/clang/Sema/ParsedAttr.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ class ParsedAttr final
193193

194194
/// Determines if the attribute will be printed as macro in the diagnostics.
195195
LLVM_PREFERRED_TYPE(bool)
196-
mutable unsigned PrintAsMacro : 1;
196+
mutable unsigned PrintMacroName : 1;
197197

198198
/// The location of the 'unavailable' keyword in an
199199
/// availability attribute.
@@ -229,7 +229,7 @@ class ParsedAttr final
229229
UsedAsTypeAttr(false), IsAvailability(false),
230230
IsTypeTagForDatatype(false), IsProperty(false), HasParsedType(false),
231231
HasProcessingCache(false), IsPragmaClangAttribute(false),
232-
PrintAsMacro(false), Info(ParsedAttrInfo::get(*this)) {
232+
PrintMacroName(false), Info(ParsedAttrInfo::get(*this)) {
233233
if (numArgs)
234234
memcpy(getArgsBuffer(), args, numArgs * sizeof(ArgsUnion));
235235
}
@@ -246,7 +246,7 @@ class ParsedAttr final
246246
NumArgs(1), Invalid(false), UsedAsTypeAttr(false), IsAvailability(true),
247247
IsTypeTagForDatatype(false), IsProperty(false), HasParsedType(false),
248248
HasProcessingCache(false), IsPragmaClangAttribute(false),
249-
PrintAsMacro(false), UnavailableLoc(unavailable),
249+
PrintMacroName(false), UnavailableLoc(unavailable),
250250
MessageExpr(messageExpr), Info(ParsedAttrInfo::get(*this)) {
251251
ArgsUnion PVal(Parm);
252252
memcpy(getArgsBuffer(), &PVal, sizeof(ArgsUnion));
@@ -264,7 +264,7 @@ class ParsedAttr final
264264
NumArgs(3), Invalid(false), UsedAsTypeAttr(false),
265265
IsAvailability(false), IsTypeTagForDatatype(false), IsProperty(false),
266266
HasParsedType(false), HasProcessingCache(false),
267-
IsPragmaClangAttribute(false), PrintAsMacro(false),
267+
IsPragmaClangAttribute(false), PrintMacroName(false),
268268
Info(ParsedAttrInfo::get(*this)) {
269269
ArgsUnion *Args = getArgsBuffer();
270270
Args[0] = Parm1;
@@ -281,7 +281,7 @@ class ParsedAttr final
281281
NumArgs(1), Invalid(false), UsedAsTypeAttr(false),
282282
IsAvailability(false), IsTypeTagForDatatype(true), IsProperty(false),
283283
HasParsedType(false), HasProcessingCache(false),
284-
IsPragmaClangAttribute(false), PrintAsMacro(false),
284+
IsPragmaClangAttribute(false), PrintMacroName(false),
285285
Info(ParsedAttrInfo::get(*this)) {
286286
ArgsUnion PVal(ArgKind);
287287
memcpy(getArgsBuffer(), &PVal, sizeof(ArgsUnion));
@@ -300,7 +300,7 @@ class ParsedAttr final
300300
UsedAsTypeAttr(false), IsAvailability(false),
301301
IsTypeTagForDatatype(false), IsProperty(false), HasParsedType(true),
302302
HasProcessingCache(false), IsPragmaClangAttribute(false),
303-
PrintAsMacro(false), Info(ParsedAttrInfo::get(*this)) {
303+
PrintMacroName(false), Info(ParsedAttrInfo::get(*this)) {
304304
new (&getTypeBuffer()) ParsedType(typeArg);
305305
}
306306

@@ -312,7 +312,7 @@ class ParsedAttr final
312312
NumArgs(0), Invalid(false), UsedAsTypeAttr(false),
313313
IsAvailability(false), IsTypeTagForDatatype(false), IsProperty(true),
314314
HasParsedType(false), HasProcessingCache(false),
315-
IsPragmaClangAttribute(false), PrintAsMacro(false),
315+
IsPragmaClangAttribute(false), PrintMacroName(false),
316316
Info(ParsedAttrInfo::get(*this)) {
317317
new (&getPropertyDataBuffer()) detail::PropertyData(getterId, setterId);
318318
}
@@ -501,10 +501,10 @@ class ParsedAttr final
501501
/// declared in if it was declared in a macro. Also set the expansion location
502502
/// of the macro.
503503
void setMacroIdentifier(IdentifierInfo *MacroName, SourceLocation Loc,
504-
bool PrintAsMac) {
504+
bool PrintMcrName) {
505505
MacroII = MacroName;
506506
MacroExpansionLoc = Loc;
507-
PrintAsMacro = PrintAsMac;
507+
PrintMacroName = PrintMcrName;
508508
}
509509

510510
/// Returns true if this attribute was declared in a macro.
@@ -520,10 +520,10 @@ class ParsedAttr final
520520
return MacroExpansionLoc;
521521
}
522522

523-
bool printAsMacro() const {
523+
bool printMacroName() const {
524524
if (!hasMacroIdentifier())
525525
return false;
526-
return PrintAsMacro;
526+
return PrintMacroName;
527527
}
528528

529529
/// Check if the attribute has exactly as many args as Num. May output an
@@ -1121,7 +1121,7 @@ enum AttributeDeclKind {
11211121
inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB,
11221122
const ParsedAttr &At) {
11231123
const IdentifierInfo *AttrName =
1124-
At.printAsMacro() ? At.getMacroIdentifier() : At.getAttrName();
1124+
At.printMacroName() ? At.getMacroIdentifier() : At.getAttrName();
11251125
DB.AddTaggedVal(reinterpret_cast<uint64_t>(AttrName),
11261126
DiagnosticsEngine::ak_identifierinfo);
11271127
return DB;

clang/include/clang/Sema/Sema.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2212,7 +2212,7 @@ class Sema final : public SemaBase {
22122212
bool CheckCountedByAttrOnField(FieldDecl *FD, Expr *E, bool CountInBytes,
22132213
bool OrNull);
22142214

2215-
/* TO_UPSTREAM(BoundsSafety) ON*/
2215+
/* TO_UPSTREAM(BoundsSafety) ON*/
22162216
/// Perform Bounds Safety Semantic checks for assigning to a `__counted_by` or
22172217
/// `__counted_by_or_null` pointer type \param LHSTy.
22182218
///
@@ -2228,7 +2228,7 @@ class Sema final : public SemaBase {
22282228
///
22292229
/// \returns True iff no diagnostic where emitted, false otherwise.
22302230
bool BoundsSafetyCheckAssignmentToCountAttrPtr(
2231-
QualType LHSTy, Expr *RHSExpr, Sema::AssignmentAction Action,
2231+
QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
22322232
SourceLocation Loc,
22332233
std::function<std::string()> ComputeAssignee = nullptr);
22342234

@@ -2248,7 +2248,7 @@ class Sema final : public SemaBase {
22482248
///
22492249
/// \returns True iff no diagnostic where emitted, false otherwise.
22502250
bool BoundsSafetyCheckAssignmentToCountAttrPtrWithIncompletePointeeTy(
2251-
QualType LHSTy, Expr *RHSExpr, Sema::AssignmentAction Action,
2251+
QualType LHSTy, Expr *RHSExpr, AssignmentAction Action,
22522252
SourceLocation Loc, std::function<std::string()> ComputeAssignee);
22532253

22542254
/// Perform Bounds Safety Semantic checks for initializing a Bounds Safety
@@ -2264,7 +2264,7 @@ class Sema final : public SemaBase {
22642264
/// \returns True iff no diagnostic where emitted, false otherwise.
22652265
bool BoundsSafetyCheckInitialization(const InitializedEntity &Entity,
22662266
const InitializationKind &Kind,
2267-
Sema::AssignmentAction Action,
2267+
AssignmentAction Action,
22682268
QualType LHSType, Expr *RHSExpr);
22692269

22702270
/// Perform Bounds Safety semantic checks on function parameters on a function

clang/lib/AST/ASTContext.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3662,10 +3662,16 @@ static QualType assureMandatorySugarTypesRemain(ASTContext &Ctx,
36623662

36633663
QualType ASTContext::mergeBoundsSafetyPointerTypes(
36643664
QualType DstTy, QualType SrcTy,
3665-
std::function<QualType(QualType, QualType, QualType)> &MergeFunctor) {
3665+
std::function<QualType(QualType /* DstTy */, QualType /* SrcTy */,
3666+
QualType /* MergePointeeTy */,
3667+
QualType /* OrigDstTy */)> &MergeFunctor,
3668+
QualType OrigDstTy) {
36663669
if (!DstTy->isPointerType())
36673670
return DstTy;
36683671

3672+
if (OrigDstTy.isNull())
3673+
OrigDstTy = DstTy;
3674+
36693675
// FIXME: a brittle hack to avoid skipping ValueTerminatedType outside
36703676
// this PtrAutoAttr AttributedType.
36713677
bool RecoverPtrAuto = false;
@@ -3678,12 +3684,12 @@ QualType ASTContext::mergeBoundsSafetyPointerTypes(
36783684

36793685
const auto *AT = DstTy->getAs<AttributedType>();
36803686
if (AT && !RecoverPtrAuto) {
3681-
auto ModifiedTy =
3682-
mergeBoundsSafetyPointerTypes(AT->getModifiedType(), SrcTy, MergeFunctor);
3687+
auto ModifiedTy = mergeBoundsSafetyPointerTypes(
3688+
AT->getModifiedType(), SrcTy, MergeFunctor, OrigDstTy);
36833689
if (ModifiedTy.isNull())
36843690
return QualType();
3685-
auto EquivalentTy = mergeBoundsSafetyPointerTypes(AT->getEquivalentType(),
3686-
SrcTy, MergeFunctor);
3691+
auto EquivalentTy = mergeBoundsSafetyPointerTypes(
3692+
AT->getEquivalentType(), SrcTy, MergeFunctor, OrigDstTy);
36873693

36883694
auto QualsOnT = DstTy.getQualifiers();
36893695
auto QualsOnModifTy = AT->getModifiedType().getQualifiers();
@@ -3705,7 +3711,7 @@ QualType ASTContext::mergeBoundsSafetyPointerTypes(
37053711
!SrcTy.isNull() ? SrcTy->getPointeeType() : QualType();
37063712
QualType MergePointeeTy =
37073713
mergeBoundsSafetyPointerTypes(DstPointeeTy, SrcPointeeTy, MergeFunctor);
3708-
QualType MergeTy = MergeFunctor(DstTy, SrcTy, MergePointeeTy);
3714+
QualType MergeTy = MergeFunctor(DstTy, SrcTy, MergePointeeTy, OrigDstTy);
37093715
if (DstTy != MergeTy && !MergeTy.isNull()) {
37103716
if (RecoverPtrAuto) {
37113717
MergeTy = getAttributedType(attr::PtrAutoAttr, MergeTy, MergeTy);

clang/lib/AST/TypePrinter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,10 @@ void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) {
437437
printBefore(T->getPointeeType(), OS);
438438
// Handle things like 'int (*A)[4];' correctly.
439439
// FIXME: this should include vectors, but vectors use attributes I guess.
440-
// TO_UPSTREAM(BoundsSafety)
440+
/* TO_UPSTREAM(BoundsSafety) ON */
441+
// It checks `isa<ArrayType>(T->getPointeeType())` in upstream.
441442
if (shouldPrintParenForPointer(T))
443+
/* TO_UPSTREAM(BoundsSafety) OFF */
442444
OS << '(';
443445
OS << '*';
444446

clang/lib/Parse/ParseCXXInlineMethods.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -837,16 +837,13 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
837837
<< &LA.AttrName;
838838

839839
/* TO_UPSTREAM(BoundsSafety) ON */
840-
const auto &SM = PP.getSourceManager();
841-
CharSourceRange ExpansionRange = SM.getExpansionRange(LA.AttrNameLoc);
842-
StringRef FoundName =
843-
Lexer::getSourceText(ExpansionRange, SM, PP.getLangOpts())
844-
.split('(')
845-
.first;
846-
IdentifierInfo *MacroII = PP.getIdentifierInfo(FoundName);
847-
for (unsigned i = 0; i < Attrs.size(); ++i)
848-
Attrs[i].setMacroIdentifier(MacroII, ExpansionRange.getBegin(),
849-
SM.isInSystemMacro(LA.AttrNameLoc));
840+
if (LA.MacroII) {
841+
const auto &SM = PP.getSourceManager();
842+
CharSourceRange ExpansionRange = SM.getExpansionRange(LA.AttrNameLoc);
843+
for (unsigned i = 0; i < Attrs.size(); ++i)
844+
Attrs[i].setMacroIdentifier(LA.MacroII, ExpansionRange.getBegin(),
845+
SM.isInSystemMacro(LA.AttrNameLoc));
846+
}
850847
/* TO_UPSTREAM(BoundsSafety) OFF */
851848

852849
for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i)

clang/lib/Parse/ParseDecl.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3548,6 +3548,7 @@ void Parser::DistributeCLateParsedAttrs(Declarator &D, Decl *Dcl,
35483548
for (const auto *LI : LPAI) {
35493549
LateParsedAttribute *LA = new LateParsedAttribute(
35503550
this, LI->AttrName, LI->AttrNameLoc, NestedLevel);
3551+
LA->MacroII = std::move(LI->MacroII);
35513552
LA->Toks = std::move(LI->Toks);
35523553
if (Dcl)
35533554
LA->addDecl(Dcl);
@@ -5287,17 +5288,13 @@ void Parser::ParseLexedCAttribute(LateParsedAttribute &LA, bool EnterScope,
52875288
/* TO_UPSTREAM(BoundsSafety) OFF */
52885289
}
52895290

5290-
const auto &SM = PP.getSourceManager();
5291-
CharSourceRange ExpansionRange = SM.getExpansionRange(LA.AttrNameLoc);
5292-
StringRef FoundName =
5293-
Lexer::getSourceText(ExpansionRange, SM, PP.getLangOpts())
5294-
.split('(')
5295-
.first;
5296-
IdentifierInfo *MacroII = PP.getIdentifierInfo(FoundName);
5297-
for (unsigned i = 0; i < Attrs.size(); ++i)
5298-
Attrs[i].setMacroIdentifier(MacroII, ExpansionRange.getBegin(),
5299-
SM.isInSystemMacro(LA.AttrNameLoc));
5300-
5291+
if (LA.MacroII) {
5292+
const auto &SM = PP.getSourceManager();
5293+
CharSourceRange ExpansionRange = SM.getExpansionRange(LA.AttrNameLoc);
5294+
for (unsigned i = 0; i < Attrs.size(); ++i)
5295+
Attrs[i].setMacroIdentifier(LA.MacroII, ExpansionRange.getBegin(),
5296+
SM.isInSystemMacro(LA.AttrNameLoc));
5297+
}
53015298
for (auto *D : LA.Decls)
53025299
Actions.ActOnFinishDelayedAttribute(getCurScope(), D, Attrs);
53035300

@@ -7105,7 +7102,7 @@ void Parser::ParseDeclaratorInternal(Declarator &D,
71057102
} else {
71067103
for (auto LA : LateAttrs) {
71077104
auto LI = new DeclaratorChunk::LateParsedAttrInfo(
7108-
LA->Toks, LA->AttrName, LA->AttrNameLoc);
7105+
LA->Toks, LA->AttrName, LA->MacroII, LA->AttrNameLoc);
71097106
LateAttrInfos.push_back(LI);
71107107
delete LA;
71117108
}
@@ -8629,7 +8626,7 @@ void Parser::ParseBracketDeclarator(Declarator &D) {
86298626
SmallVector<clang::DeclaratorChunk::LateParsedAttrInfo *, 0> LateAttrInfos;
86308627
for (auto LA : LateAttrs) {
86318628
auto LI = new DeclaratorChunk::LateParsedAttrInfo(
8632-
LA->Toks, LA->AttrName, LA->AttrNameLoc);
8629+
LA->Toks, LA->AttrName, LA->MacroII, LA->AttrNameLoc);
86338630
LateAttrInfos.push_back(LI);
86348631
delete LA;
86358632
}

0 commit comments

Comments
 (0)