mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 06:10:12 +00:00
[clang][NFC] Wrap TYPE_SWITCH in "do while (0)" in the interpreter
Wraps the expansions of TYPE_SWITCH and COMPOSITE_TYPE_SWITCH in the constexpr interpreter with "do { ... } while (0)" so that these macros can be used like this: if (llvm::Optional<PrimType> T = Ctx.classify(FieldTy)) TYPE_SWITCH(*T, Ok &= ReturnValue<T>(FP.deref<T>(), Value)); else Ok &= Composite(FieldTy, FP, Value); This bug was found while testing D116316. See also review comment: https://reviews.llvm.org/D64146?id=208520#inline-584131 Also cleaned up the macro definitions by removing the superfluous do-while statements and removed the unused INT_TPYE_SWITCH macro. Differential Revision: https://reviews.llvm.org/D117301
This commit is contained in:
parent
6be77561f8
commit
7cd441ff53
@ -81,35 +81,27 @@ inline bool isPrimitiveIntegral(PrimType Type) {
|
||||
/// Helper macro to simplify type switches.
|
||||
/// The macro implicitly exposes a type T in the scope of the inner block.
|
||||
#define TYPE_SWITCH_CASE(Name, B) \
|
||||
case Name: { using T = PrimConv<Name>::T; do {B;} while(0); break; }
|
||||
case Name: { using T = PrimConv<Name>::T; B; break; }
|
||||
#define TYPE_SWITCH(Expr, B) \
|
||||
switch (Expr) { \
|
||||
TYPE_SWITCH_CASE(PT_Sint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint64, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint64, B) \
|
||||
TYPE_SWITCH_CASE(PT_Bool, B) \
|
||||
TYPE_SWITCH_CASE(PT_Ptr, B) \
|
||||
}
|
||||
do { \
|
||||
switch (Expr) { \
|
||||
TYPE_SWITCH_CASE(PT_Sint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint64, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint64, B) \
|
||||
TYPE_SWITCH_CASE(PT_Bool, B) \
|
||||
TYPE_SWITCH_CASE(PT_Ptr, B) \
|
||||
} \
|
||||
} while (0)
|
||||
#define COMPOSITE_TYPE_SWITCH(Expr, B, D) \
|
||||
switch (Expr) { \
|
||||
TYPE_SWITCH_CASE(PT_Ptr, B) \
|
||||
default: do { D; } while(0); break; \
|
||||
}
|
||||
#define INT_TYPE_SWITCH(Expr, B) \
|
||||
switch (Expr) { \
|
||||
TYPE_SWITCH_CASE(PT_Sint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint8, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint16, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint32, B) \
|
||||
TYPE_SWITCH_CASE(PT_Sint64, B) \
|
||||
TYPE_SWITCH_CASE(PT_Uint64, B) \
|
||||
default: llvm_unreachable("not an integer"); \
|
||||
}
|
||||
do { \
|
||||
switch (Expr) { \
|
||||
TYPE_SWITCH_CASE(PT_Ptr, B) \
|
||||
default: { D; break; } \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user