[clang][NFC] Use enum for -fstrict-flex-arrays

Use enums for the strict flex arrays flag so that it's more readable.

Differential Revision: https://reviews.llvm.org/D135107
This commit is contained in:
Bill Wendling 2022-10-03 12:53:15 -07:00
parent ae5733346f
commit 7404b855e5
9 changed files with 41 additions and 13 deletions

View File

@ -528,7 +528,8 @@ public:
/// When IgnoreTemplateOrMacroSubstitution is set, it doesn't consider sizes
/// resulting from the substitution of a macro or a template as special sizes.
bool isFlexibleArrayMemberLike(
ASTContext &Context, unsigned StrictFlexArraysLevel,
ASTContext &Context,
LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
bool IgnoreTemplateOrMacroSubstitution = false) const;
/// isIntegerConstantExpr - Return the value if this expression is a valid

View File

@ -427,7 +427,10 @@ LANGOPT(PaddingOnUnsignedFixedPoint, 1, 0,
LANGOPT(RegisterStaticDestructors, 1, 1, "Register C++ static destructors")
LANGOPT(MatrixTypes, 1, 0, "Enable or disable the builtin matrix type")
LANGOPT(StrictFlexArrays, 2, 0, "Rely on strict definition of flexible arrays")
ENUM_LANGOPT(StrictFlexArraysLevel, StrictFlexArraysLevelKind, 2,
StrictFlexArraysLevelKind::Default,
"Rely on strict definition of flexible arrays")
COMPATIBLE_VALUE_LANGOPT(MaxTokens, 32, 0, "Max number of tokens per TU or 0")

View File

@ -365,6 +365,17 @@ public:
All,
};
enum class StrictFlexArraysLevelKind {
/// Any trailing array member is a FAM.
Default = 0,
/// Any trailing array member of undefined, 0, or 1 size is a FAM.
OneZeroOrIncomplete = 1,
/// Any trailing array member of undefined or 0 size is a FAM.
ZeroOrIncomplete = 2,
/// Any trailing array member of undefined size is a FAM.
Incomplete = 3,
};
public:
/// The used language standard.
LangStandard::Kind LangStd;

View File

@ -1149,10 +1149,12 @@ def fapple_kext : Flag<["-"], "fapple-kext">, Group<f_Group>, Flags<[CC1Option]>
MarshallingInfoFlag<LangOpts<"AppleKext">>;
def fstrict_flex_arrays_EQ : Joined<["-"], "fstrict-flex-arrays=">, Group<f_Group>,
MetaVarName<"<n>">, Values<"0,1,2">,
LangOpts<"StrictFlexArrays">,
LangOpts<"StrictFlexArraysLevel">,
Flags<[CC1Option]>,
NormalizedValuesScope<"LangOptions::StrictFlexArraysLevelKind">,
NormalizedValues<["Default", "OneZeroOrIncomplete", "ZeroOrIncomplete", "Incomplete"]>,
HelpText<"Enable optimizations based on the strict definition of flexible arrays">,
MarshallingInfoInt<LangOpts<"StrictFlexArrays">>;
MarshallingInfoEnum<LangOpts<"StrictFlexArraysLevel">, "Default">;
defm apple_pragma_pack : BoolFOption<"apple-pragma-pack",
LangOpts<"ApplePragmaPack">, DefaultFalse,
PosFlag<SetTrue, [CC1Option], "Enable Apple gcc-compatible #pragma pack handling">,

View File

@ -204,7 +204,8 @@ bool Expr::isKnownToHaveBooleanValue(bool Semantic) const {
}
bool Expr::isFlexibleArrayMemberLike(
ASTContext &Context, unsigned StrictFlexArraysLevel,
ASTContext &Context,
LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel,
bool IgnoreTemplateOrMacroSubstitution) const {
// For compatibility with existing code, we treat arrays of length 0 or
@ -219,7 +220,8 @@ bool Expr::isFlexibleArrayMemberLike(
// FIXME: While the default -fstrict-flex-arrays=0 permits Size>1 trailing
// arrays to be treated as flexible-array-members, we still emit diagnostics
// as if they are not. Pending further discussion...
if (StrictFlexArraysLevel >= 2 || Size.uge(2))
using FAMKind = LangOptions::StrictFlexArraysLevelKind;
if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete || Size.uge(2))
return false;
} else if (!Context.getAsIncompleteArrayType(getType()))

View File

@ -11613,15 +11613,17 @@ static bool isUserWritingOffTheEnd(const ASTContext &Ctx, const LValue &LVal) {
// conservative with the last element in structs (if it's an array), so our
// current behavior is more compatible than an explicit list approach would
// be.
int StrictFlexArraysLevel = Ctx.getLangOpts().StrictFlexArrays;
using FAMKind = LangOptions::StrictFlexArraysLevelKind;
FAMKind StrictFlexArraysLevel = Ctx.getLangOpts().getStrictFlexArraysLevel();
return LVal.InvalidBase &&
Designator.Entries.size() == Designator.MostDerivedPathLength &&
Designator.MostDerivedIsArrayElement &&
(Designator.isMostDerivedAnUnsizedArray() ||
Designator.getMostDerivedArraySize() == 0 ||
(Designator.getMostDerivedArraySize() == 1 &&
StrictFlexArraysLevel < 2) ||
StrictFlexArraysLevel == 0) &&
StrictFlexArraysLevel != FAMKind::Incomplete &&
StrictFlexArraysLevel != FAMKind::ZeroOrIncomplete) ||
StrictFlexArraysLevel == FAMKind::Default) &&
isDesignatorAtObjectEnd(Ctx, LVal);
}

View File

@ -919,7 +919,8 @@ llvm::Value *CodeGenFunction::LoadPassedObjectSize(const Expr *E,
static llvm::Value *getArrayIndexingBound(CodeGenFunction &CGF,
const Expr *Base,
QualType &IndexedType,
unsigned StrictFlexArraysLevel) {
LangOptions::StrictFlexArraysLevelKind
StrictFlexArraysLevel) {
// For the vector indexing extension, the bound is the number of elements.
if (const VectorType *VT = Base->getType()->getAs<VectorType>()) {
IndexedType = Base->getType();
@ -958,7 +959,8 @@ void CodeGenFunction::EmitBoundsCheck(const Expr *E, const Expr *Base,
"should not be called unless adding bounds checks");
SanitizerScope SanScope(this);
const unsigned StrictFlexArraysLevel = getLangOpts().StrictFlexArrays;
const LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel =
getLangOpts().getStrictFlexArraysLevel();
QualType IndexedType;
llvm::Value *Bound =

View File

@ -15915,7 +15915,8 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
const ConstantArrayType *ArrayTy =
Context.getAsConstantArrayType(BaseExpr->getType());
unsigned StrictFlexArraysLevel = getLangOpts().StrictFlexArrays;
LangOptions::StrictFlexArraysLevelKind
StrictFlexArraysLevel = getLangOpts().getStrictFlexArraysLevel();
const Type *BaseType =
ArrayTy == nullptr ? nullptr : ArrayTy->getElementType().getTypePtr();

View File

@ -794,7 +794,11 @@ DefinedOrUnknownSVal MemRegionManager::getStaticSize(const MemRegion *MR,
if (Size.isZero())
return true;
if (getContext().getLangOpts().StrictFlexArrays >= 2)
using FAMKind = LangOptions::StrictFlexArraysLevelKind;
const FAMKind StrictFlexArraysLevel =
Ctx.getLangOpts().getStrictFlexArraysLevel();
if (StrictFlexArraysLevel == FAMKind::ZeroOrIncomplete ||
StrictFlexArraysLevel == FAMKind::Incomplete)
return false;
const AnalyzerOptions &Opts = SVB.getAnalyzerOptions();