[clang] [clang][Interp] Implement __builtin_classify_type (PR #71972)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 15 11:52:03 PST 2023
================
@@ -439,6 +439,194 @@ static bool interp__builtin_popcount(InterpState &S, CodePtr OpPC,
return true;
}
+// Values returned by __builtin_classify_type, chosen to match the values
+/// produced by GCC's builtin.
+enum class GCCTypeClass {
+ None = -1,
+ Void = 0,
+ Integer = 1,
+ // GCC reserves 2 for character types, but instead classifies them as
+ // integers.
+ Enum = 3,
+ Bool = 4,
+ Pointer = 5,
+ // GCC reserves 6 for references, but appears to never use it (because
+ // expressions never have reference type, presumably).
+ PointerToDataMember = 7,
+ RealFloat = 8,
+ Complex = 9,
+ // GCC reserves 10 for functions, but does not use it since GCC version 6 due
+ // to decay to pointer. (Prior to version 6 it was only used in C++ mode).
+ // GCC claims to reserve 11 for pointers to member functions, but *actually*
+ // uses 12 for that purpose, same as for a class or struct. Maybe it
+ // internally implements a pointer to member as a struct? Who knows.
+ PointerToMemberFunction = 12, // Not a bug, see above.
+ ClassOrStruct = 12,
+ Union = 13,
+ // GCC reserves 14 for arrays, but does not use it since GCC version 6 due to
+ // decay to pointer. (Prior to version 6 it was only used in C++ mode).
+ // GCC reserves 15 for strings, but actually uses 5 (pointer) for string
+ // literals.
----------------
AaronBallman wrote:
Needs to be updated after https://github.com/llvm/llvm-project/pull/72036 lands; sharing this with ExprConstant.cpp would be even better though. It might make sense to have a local header in `clang/lib/AST/` for contents that are shared between `Interp/*` and `ExprConstant.cpp`, WDYT?
https://github.com/llvm/llvm-project/pull/71972
More information about the cfe-commits
mailing list