forked from OSchip/llvm-project
[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:
parent
ae5733346f
commit
7404b855e5
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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">,
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue