};
};
using ExprDependence = ExprDependenceScope::ExprDependence;
-static constexpr unsigned ExprDependenceBits = 5;
struct TypeDependenceScope {
enum TypeDependence : uint8_t {
};
};
using TypeDependence = TypeDependenceScope::TypeDependence;
-static constexpr unsigned TypeDependenceBits = 4;
#define LLVM_COMMON_DEPENDENCE(NAME) \
struct NAME##Scope { \
LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Dependent) \
}; \
}; \
- using NAME = NAME##Scope::NAME; \
- static constexpr unsigned NAME##Bits = 3;
+ using NAME = NAME##Scope::NAME;
LLVM_COMMON_DEPENDENCE(NestedNameSpecifierDependence)
LLVM_COMMON_DEPENDENCE(TemplateNameDependence)
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/PointerIntPair.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator.h"
unsigned ValueKind : 2;
unsigned ObjectKind : 3;
- unsigned /*ExprDependence*/ Dependent : ExprDependenceBits;
+ unsigned /*ExprDependence*/ Dependent : llvm::BitWidth<ExprDependence>;
};
- enum { NumExprBits = NumStmtBits + 5 + ExprDependenceBits };
+ enum { NumExprBits = NumStmtBits + 5 + llvm::BitWidth<ExprDependence> };
class ConstantExprBitfields {
friend class ASTStmtReader;
unsigned TC : 8;
/// Store information on the type dependency.
- /*TypeDependence*/ unsigned Dependence : TypeDependenceBits;
+ unsigned Dependence : llvm::BitWidth<TypeDependence>;
/// True if the cache (i.e. the bitfields here starting with
/// 'Cache') is valid.
return CachedLocalOrUnnamed;
}
};
- enum { NumTypeBits = 8 + TypeDependenceBits + 6 };
+ enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
protected:
// These classes allow subclasses to somewhat cleanly pack bitfields
#include "clang/Lex/Token.h"
#include "clang/Serialization/ASTBitCodes.h"
#include "clang/Serialization/ASTRecordReader.h"
+#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
/// The number of record fields required for the Expr class
/// itself.
static const unsigned NumExprFields =
- NumStmtFields + ExprDependenceBits + 3;
+ NumStmtFields + llvm::BitWidth<ExprDependence> + 3;
/// Read and initialize a ExplicitTemplateArgumentList structure.
void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
return U;
}
+constexpr unsigned bitWidth(uint64_t Value) {
+ return Value ? 1 + bitWidth(Value >> 1) : 0;
+}
+
template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>>
E operator~(E Val) {
return static_cast<E>(~Underlying(Val) & Mask<E>());
// Enable bitmask enums in namespace ::llvm and all nested namespaces.
LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
+template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>>
+constexpr unsigned BitWidth = BitmaskEnumDetail::bitWidth(uint64_t{
+ static_cast<std::underlying_type_t<E>>(
+ E::LLVM_BITMASK_LARGEST_ENUMERATOR)});
} // namespace llvm