[clang] [clang][NFC] move traits to tablegen (PR #201491)

Corentin Jabot via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 13 06:12:44 PDT 2026


================
@@ -0,0 +1,236 @@
+//==--- Traits.td - Generate expression and type traits -------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "TableGenBackends.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
+#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TableGenBackend.h"
+
+using namespace llvm;
+
+namespace {
+
+std::vector<const Record *>
+getAllDerivedDefsInDeclOrder(const RecordKeeper &Records, StringRef ClassName) {
+  std::vector<const Record *> Defs =
+      Records.getAllDerivedDefinitions(ClassName);
+  llvm::sort(Defs, [](const Record *A, const Record *B) {
+    return A->getID() < B->getID();
+  });
+  return Defs;
+}
+
+void emitKeyFlags(ArrayRef<const Record *> KeyFlags, raw_ostream &OS) {
+  assert(!KeyFlags.empty() && "KeyFlags should never be empty");
+  interleave(
+      KeyFlags, OS, [&](const Record *KeyFlag) { OS << KeyFlag->getName(); },
+      " | ");
+}
+
+StringRef recordKindToMacro(const Record *R) {
+  if (R->isSubClassOf("UnaryTrait"))
+    return "TYPE_TRAIT_1";
+  if (R->isSubClassOf("BinaryTrait"))
+    return "TYPE_TRAIT_2";
+  if (R->isSubClassOf("VariadicTrait"))
+    return "TYPE_TRAIT_N";
+  if (R->isSubClassOf("ArrayTrait"))
+    return "ARRAY_TYPE_TRAIT";
+  if (R->isSubClassOf("ExpressionTrait"))
+    return "EXPRESSION_TRAIT";
+  if (R->isSubClassOf("UnaryExprOrTypeTrait"))
+    return "UNARY_EXPR_OR_TYPE_TRAIT";
+  if (R->isSubClassOf("CXX11UnaryExprOrTypeTrait"))
+    return "CXX11_UNARY_EXPR_OR_TYPE_TRAIT";
+  if (R->isSubClassOf("TransformTypeTrait"))
+    return "TRANSFORM_TYPE_TRAIT_DEF";
+  if (R->isSubClassOf("Alias"))
+    return "ALIAS";
+  llvm_unreachable("unexpected Trait subclass");
----------------
cor3ntin wrote:

can we use StringSwitch here?

https://github.com/llvm/llvm-project/pull/201491


More information about the cfe-commits mailing list