Author: Florian Mayer
Date: 2025-02-11T13:35:14-08:00
New Revision: b88b6a2b633a942d454205f336703cdc62074686

URL: 
https://github.com/llvm/llvm-project/commit/b88b6a2b633a942d454205f336703cdc62074686
DIFF: 
https://github.com/llvm/llvm-project/commit/b88b6a2b633a942d454205f336703cdc62074686.diff

LOG: [clang] Assert the enum FPOpts and LangOpts fit into the storage (#126166)

Fix existing failure

Added: 
    

Modified: 
    clang/include/clang/Basic/FPOptions.def
    clang/include/clang/Basic/LangOptions.def
    clang/include/clang/Basic/LangOptions.h

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/FPOptions.def 
b/clang/include/clang/Basic/FPOptions.def
index 79f04c89c9fed..90428c3c73c8b 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 cb55f09acc076..bfab0baa089cf 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 f58a719a45a84..651b3b67b1058 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -648,9 +648,12 @@ class LangOptions : public LangOptionsBase {
 
   // 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 @@ class FPOptions {
   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"


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to