Author: Bill Wendling Date: 2022-10-06T10:45:41-07:00 New Revision: 7404b855e528f88bf2a395a0a14937ca6812e8d1
URL: https://github.com/llvm/llvm-project/commit/7404b855e528f88bf2a395a0a14937ca6812e8d1 DIFF: https://github.com/llvm/llvm-project/commit/7404b855e528f88bf2a395a0a14937ca6812e8d1.diff LOG: [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 Added: Modified: clang/include/clang/AST/Expr.h clang/include/clang/Basic/LangOptions.def clang/include/clang/Basic/LangOptions.h clang/include/clang/Driver/Options.td clang/lib/AST/Expr.cpp clang/lib/AST/ExprConstant.cpp clang/lib/CodeGen/CGExpr.cpp clang/lib/Sema/SemaChecking.cpp clang/lib/StaticAnalyzer/Core/MemRegion.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 7c90df25ccddd..a65e06205fa6b 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -528,7 +528,8 @@ class Expr : public ValueStmt { /// 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 diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 848433ec5b432..67abc7701fc47 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -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") diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index aa0b6d4dc2748..a9ed2e2270ac1 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -365,6 +365,17 @@ class LangOptions : public LangOptionsBase { 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; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 0b795184b7bd0..d576614956eec 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -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">, diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 410c8e4d649ec..08b5e8d45c95a 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -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())) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 64a64d5dfc3dd..779bc1b73d39a 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -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); } diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 164ee81bb1879..b58d5c29a1f9e 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -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 = diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index e73da2db179bb..a1e3db1b57af2 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -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(); diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp index d25e40dcefee8..e4235c4e65117 100644 --- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -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(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits