diff options
| author | Florian Mayer <fmayer@google.com> | 2025-02-11 13:35:14 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-11 13:35:14 -0800 |
| commit | b88b6a2b633a942d454205f336703cdc62074686 (patch) | |
| tree | 6bd1ff81631949c3d1c1a3ca702fa102d348950f | |
| parent | 188915535a2c42f347076e49ad95271c11e9a05d (diff) | |
| download | llvm-b88b6a2b633a942d454205f336703cdc62074686.zip llvm-b88b6a2b633a942d454205f336703cdc62074686.tar.gz llvm-b88b6a2b633a942d454205f336703cdc62074686.tar.bz2 | |
[clang] Assert the enum FPOpts and LangOpts fit into the storage (#126166)
Fix existing failure
| -rw-r--r-- | clang/include/clang/Basic/FPOptions.def | 2 | ||||
| -rw-r--r-- | clang/include/clang/Basic/LangOptions.def | 2 | ||||
| -rw-r--r-- | clang/include/clang/Basic/LangOptions.h | 12 |
3 files changed, 11 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/FPOptions.def b/clang/include/clang/Basic/FPOptions.def index 79f04c8..90428c3 100644 --- a/clang/include/clang/Basic/FPOptions.def +++ b/clang/include/clang/Basic/FPOptions.def @@ -28,5 +28,5 @@ OPTION(FPEvalMethod, LangOptions::FPEvalMethodKind, 2, AllowApproxFunc) OPTION(Float16ExcessPrecision, LangOptions::ExcessPrecisionKind, 2, FPEvalMethod) OPTION(BFloat16ExcessPrecision, LangOptions::ExcessPrecisionKind, 2, Float16ExcessPrecision) OPTION(MathErrno, bool, 1, BFloat16ExcessPrecision) -OPTION(ComplexRange, LangOptions::ComplexRangeKind, 2, MathErrno) +OPTION(ComplexRange, LangOptions::ComplexRangeKind, 3, MathErrno) #undef OPTION diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index cb55f09..bfab0ba 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -238,7 +238,7 @@ BENIGN_LANGOPT(NoSignedZero , 1, 0, "Permit Floating Point optimization wit BENIGN_LANGOPT(AllowRecip , 1, 0, "Permit Floating Point reciprocal") BENIGN_LANGOPT(ApproxFunc , 1, 0, "Permit Floating Point approximation") -ENUM_LANGOPT(ComplexRange, ComplexRangeKind, 2, CX_None, "Enable use of range reduction for complex arithmetics.") +ENUM_LANGOPT(ComplexRange, ComplexRangeKind, 3, CX_None, "Enable use of range reduction for complex arithmetics.") BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars") diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index f58a719..651b3b6 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -648,9 +648,12 @@ public: // Define accessors/mutators for language options of enumeration type. #define LANGOPT(Name, Bits, Default, Description) -#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ - Type get##Name() const { return static_cast<Type>(Name); } \ - void set##Name(Type Value) { Name = static_cast<unsigned>(Value); } +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + Type get##Name() const { return static_cast<Type>(Name); } \ + void set##Name(Type Value) { \ + assert(static_cast<unsigned>(Value) < (1u << Bits)); \ + Name = static_cast<unsigned>(Value); \ + } #include "clang/Basic/LangOptions.def" /// Are we compiling a module? @@ -959,11 +962,14 @@ public: void applyChanges(FPOptionsOverride FPO); // We can define most of the accessors automatically: + // TODO: consider enforcing the assertion that value fits within bits + // statically. #define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \ TYPE get##NAME() const { \ return static_cast<TYPE>((Value & NAME##Mask) >> NAME##Shift); \ } \ void set##NAME(TYPE value) { \ + assert(storage_type(value) < (1u << WIDTH)); \ Value = (Value & ~NAME##Mask) | (storage_type(value) << NAME##Shift); \ } #include "clang/Basic/FPOptions.def" |
