[all-commits] [llvm/llvm-project] 18baeb: [ADT] Alternative way to declare enum type as bitmask

Serge Pavlov via All-commits all-commits at lists.llvm.org
Mon Feb 20 22:45:55 PST 2023

  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 18baeb89b566a1c0011c6a9960f402bd151224dd
  Author: Serge Pavlov <sepavloff at gmail.com>
  Date:   2023-02-21 (Tue, 21 Feb 2023)

  Changed paths:
    M llvm/include/llvm/ADT/BitmaskEnum.h
    M llvm/unittests/ADT/BitmaskEnumTest.cpp

  Log Message:
  [ADT] Alternative way to declare enum type as bitmask

If an enumeration represents a set of bit flags, using the macro
LLVM_MARK_AS_BITMASK_ENUM can make operations with such enumeration more
convenient. It however brings problems if the enumeration is non-scoped.
As the macro adds an item LLVM_BITMASK_LARGEST_ENUMERATOR to the
enumeration type, only one such type may be declared as bitmask. This
problem could be solved by convertion of the enumeration to scoped, but
it requires static_casts in new places and the convenience can be

This change introduces a new macro LLVM_DECLARE_ENUM_AS_BITMASK, which
allows non-invasive convertion of an enumeration into bitmask. It
provides specialization to trait classes, which previously were built
based on presence of LLVM_BITMASK_LARGEST_ENUMERATOR in the enumeration.
The macro must be specified in global or llvm namespace because the
trait classes are declared in llvm namespace.

Differential Revision: https://reviews.llvm.org/D144202

More information about the All-commits mailing list