[clang] 0fea0d2 - [clang][NFC] Annotate DeclBase.h with `preferred_type`
Vlad Serebrennikov via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 3 22:44:06 PDT 2023
Author: Vlad Serebrennikov
Date: 2023-11-04T08:43:59+03:00
New Revision: 0fea0d2f3b5e5be011e229cdddc7540095ff9236
URL: https://github.com/llvm/llvm-project/commit/0fea0d2f3b5e5be011e229cdddc7540095ff9236
DIFF: https://github.com/llvm/llvm-project/commit/0fea0d2f3b5e5be011e229cdddc7540095ff9236.diff
LOG: [clang][NFC] Annotate DeclBase.h with `preferred_type`
This patch adds `preferred_type` annotations to `Decl` and `DeclContext` bit-fields. Those annotations help debuggers reason about the type of the value stored in bit-field.
Added:
Modified:
clang/include/clang/AST/DeclBase.h
Removed:
################################################################################
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index fdc59ac7419d9e3..5b1038582bc6747 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -16,6 +16,7 @@
#include "clang/AST/ASTDumperUtils.h"
#include "clang/AST/AttrIterator.h"
#include "clang/AST/DeclarationName.h"
+#include "clang/AST/SelectorLocationsKind.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
@@ -284,31 +285,38 @@ class alignas(8) Decl {
SourceLocation Loc;
/// DeclKind - This indicates which class this is.
+ LLVM_PREFERRED_TYPE(Kind)
unsigned DeclKind : 7;
/// InvalidDecl - This indicates a semantic error occurred.
+ LLVM_PREFERRED_TYPE(bool)
unsigned InvalidDecl : 1;
/// HasAttrs - This indicates whether the decl has attributes or not.
+ LLVM_PREFERRED_TYPE(bool)
unsigned HasAttrs : 1;
/// Implicit - Whether this declaration was implicitly generated by
/// the implementation rather than explicitly written by the user.
+ LLVM_PREFERRED_TYPE(bool)
unsigned Implicit : 1;
/// Whether this declaration was "used", meaning that a definition is
/// required.
+ LLVM_PREFERRED_TYPE(bool)
unsigned Used : 1;
/// Whether this declaration was "referenced".
/// The
diff erence with 'Used' is whether the reference appears in a
/// evaluated context or not, e.g. functions used in uninstantiated templates
/// are regarded as "referenced" but not "used".
+ LLVM_PREFERRED_TYPE(bool)
unsigned Referenced : 1;
/// Whether this declaration is a top-level declaration (function,
/// global variable, etc.) that is lexically inside an objc container
/// definition.
+ LLVM_PREFERRED_TYPE(bool)
unsigned TopLevelDeclInObjCContainer : 1;
/// Whether statistic collection is enabled.
@@ -326,15 +334,19 @@ class alignas(8) Decl {
/// Access - Used by C++ decls for the access specifier.
// NOTE: VC++ treats enums as signed, avoid using the AccessSpecifier enum
+ LLVM_PREFERRED_TYPE(AccessSpecifier)
unsigned Access : 2;
/// Whether this declaration was loaded from an AST file.
+ LLVM_PREFERRED_TYPE(bool)
unsigned FromASTFile : 1;
/// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
+ LLVM_PREFERRED_TYPE(IdentifierNamespace)
unsigned IdentifierNamespace : 14;
/// If 0, we have not computed the linkage of this declaration.
+ LLVM_PREFERRED_TYPE(Linkage)
mutable unsigned CacheValidAndLinkage : 3;
/// Allocate memory for a deserialized declaration.
@@ -1443,35 +1455,42 @@ class DeclContext {
class DeclContextBitfields {
friend class DeclContext;
/// DeclKind - This indicates which class this is.
+ LLVM_PREFERRED_TYPE(Decl::Kind)
uint64_t DeclKind : 7;
/// Whether this declaration context also has some external
/// storage that contains additional declarations that are lexically
/// part of this context.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t ExternalLexicalStorage : 1;
/// Whether this declaration context also has some external
/// storage that contains additional declarations that are visible
/// in this context.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t ExternalVisibleStorage : 1;
/// Whether this declaration context has had externally visible
/// storage added since the last lookup. In this case, \c LookupPtr's
/// invariant may not hold and needs to be fixed before we perform
/// another lookup.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t NeedToReconcileExternalVisibleStorage : 1;
/// If \c true, this context may have local lexical declarations
/// that are missing from the lookup table.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t HasLazyLocalLexicalLookups : 1;
/// If \c true, the external source may have lexical declarations
/// that are missing from the lookup table.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t HasLazyExternalLexicalLookups : 1;
/// If \c true, lookups should only return identifier from
/// DeclContext scope (for example TranslationUnit). Used in
/// LookupQualifiedName()
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t UseQualifiedLookup : 1;
};
@@ -1484,38 +1503,47 @@ class DeclContext {
class TagDeclBitfields {
friend class TagDecl;
/// For the bits in DeclContextBitfields
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
/// The TagKind enum.
+ LLVM_PREFERRED_TYPE(TagTypeKind)
uint64_t TagDeclKind : 3;
/// True if this is a definition ("struct foo {};"), false if it is a
/// declaration ("struct foo;"). It is not considered a definition
/// until the definition has been fully processed.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsCompleteDefinition : 1;
/// True if this is currently being defined.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsBeingDefined : 1;
/// True if this tag declaration is "embedded" (i.e., defined or declared
/// for the very first time) in the syntax of a declarator.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsEmbeddedInDeclarator : 1;
/// True if this tag is free standing, e.g. "struct foo;".
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsFreeStanding : 1;
/// Indicates whether it is possible for declarations of this kind
/// to have an out-of-date definition.
///
/// This option is only enabled when modules are enabled.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t MayHaveOutOfDateDef : 1;
/// Has the full definition of this type been required by a use somewhere in
/// the TU.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsCompleteDefinitionRequired : 1;
/// Whether this tag is a definition which was demoted due to
/// a module merge.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsThisDeclarationADemotedDefinition : 1;
};
@@ -1528,6 +1556,7 @@ class DeclContext {
class EnumDeclBitfields {
friend class EnumDecl;
/// For the bits in TagDeclBitfields.
+ LLVM_PREFERRED_TYPE(TagDeclBitfields)
uint64_t : NumTagDeclBits;
/// Width in bits required to store all the non-negative
@@ -1540,19 +1569,23 @@ class DeclContext {
/// True if this tag declaration is a scoped enumeration. Only
/// possible in C++11 mode.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsScoped : 1;
/// If this tag declaration is a scoped enum,
/// then this is true if the scoped enum was declared using the class
/// tag, false if it was declared with the struct tag. No meaning is
/// associated if this tag declaration is not a scoped enum.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsScopedUsingClassTag : 1;
/// True if this is an enumeration with fixed underlying type. Only
/// possible in C++11, Microsoft extensions, or Objective C mode.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsFixed : 1;
/// True if a valid hash is stored in ODRHash.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasODRHash : 1;
};
@@ -1565,49 +1598,64 @@ class DeclContext {
class RecordDeclBitfields {
friend class RecordDecl;
/// For the bits in TagDeclBitfields.
+ LLVM_PREFERRED_TYPE(TagDeclBitfields)
uint64_t : NumTagDeclBits;
/// This is true if this struct ends with a flexible
/// array member (e.g. int X[]) or if this union contains a struct that does.
/// If so, this cannot be contained in arrays or other structs as a member.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasFlexibleArrayMember : 1;
/// Whether this is the type of an anonymous struct or union.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t AnonymousStructOrUnion : 1;
/// This is true if this struct has at least one member
/// containing an Objective-C object pointer type.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasObjectMember : 1;
/// This is true if struct has at least one member of
/// 'volatile' type.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasVolatileMember : 1;
/// Whether the field declarations of this record have been loaded
/// from external storage. To avoid unnecessary deserialization of
/// methods/nested types we allow deserialization of just the fields
/// when needed.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t LoadedFieldsFromExternalStorage : 1;
/// Basic properties of non-trivial C structs.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t NonTrivialToPrimitiveDefaultInitialize : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t NonTrivialToPrimitiveCopy : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t NonTrivialToPrimitiveDestroy : 1;
/// The following bits indicate whether this is or contains a C union that
/// is non-trivial to default-initialize, destruct, or copy. These bits
/// imply the associated basic non-triviality predicates declared above.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasNonTrivialToPrimitiveDefaultInitializeCUnion : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasNonTrivialToPrimitiveDestructCUnion : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasNonTrivialToPrimitiveCopyCUnion : 1;
/// Indicates whether this struct is destroyed in the callee.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t ParamDestroyedInCallee : 1;
/// Represents the way this type is passed to a function.
+ LLVM_PREFERRED_TYPE(RecordArgPassingKind)
uint64_t ArgPassingRestrictions : 2;
/// Indicates whether this struct has had its field layout randomized.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsRandomized : 1;
/// True if a valid hash is stored in ODRHash. This should shave off some
@@ -1624,10 +1672,12 @@ class DeclContext {
class OMPDeclareReductionDeclBitfields {
friend class OMPDeclareReductionDecl;
/// For the bits in DeclContextBitfields
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
/// Kind of initializer,
/// function call or omp_priv<init_expr> initialization.
+ LLVM_PREFERRED_TYPE(OMPDeclareReductionInitKind)
uint64_t InitializerKind : 2;
};
@@ -1644,71 +1694,99 @@ class DeclContext {
/// For DeductionCandidateKind
friend class CXXDeductionGuideDecl;
/// For the bits in DeclContextBitfields.
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
+ LLVM_PREFERRED_TYPE(StorageClass)
uint64_t SClass : 3;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsInline : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsInlineSpecified : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsVirtualAsWritten : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsPure : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasInheritedPrototype : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasWrittenPrototype : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsDeleted : 1;
/// Used by CXXMethodDecl
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsTrivial : 1;
/// This flag indicates whether this function is trivial for the purpose of
/// calls. This is meaningful only when this function is a copy/move
/// constructor or a destructor.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsTrivialForCall : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsDefaulted : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsExplicitlyDefaulted : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasDefaultedFunctionInfo : 1;
/// For member functions of complete types, whether this is an ineligible
/// special member function or an unselected destructor. See
/// [class.mem.special].
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsIneligibleOrNotSelected : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasImplicitReturnZero : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsLateTemplateParsed : 1;
/// Kind of contexpr specifier as defined by ConstexprSpecKind.
+ LLVM_PREFERRED_TYPE(ConstexprSpecKind)
uint64_t ConstexprKind : 2;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t BodyContainsImmediateEscalatingExpression : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t InstantiationIsPending : 1;
/// Indicates if the function uses __try.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t UsesSEHTry : 1;
/// Indicates if the function was a definition
/// but its body was skipped.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasSkippedBody : 1;
/// Indicates if the function declaration will
/// have a body, once we're done parsing it.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t WillHaveBody : 1;
/// Indicates that this function is a multiversioned
/// function using attribute 'target'.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsMultiVersion : 1;
/// Only used by CXXDeductionGuideDecl. Indicates the kind
/// of the Deduction Guide that is implicitly generated
/// (used during overload resolution).
+ LLVM_PREFERRED_TYPE(DeductionCandidate)
uint64_t DeductionCandidateKind : 2;
/// Store the ODRHash after first calculation.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasODRHash : 1;
/// Indicates if the function uses Floating Point Constrained Intrinsics
+ LLVM_PREFERRED_TYPE(bool)
uint64_t UsesFPIntrin : 1;
// Indicates this function is a constrained friend, where the constraint
// refers to an enclosing template for hte purposes of [temp.friend]p9.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t FriendConstraintRefersToEnclosingTemplate : 1;
};
@@ -1721,6 +1799,7 @@ class DeclContext {
class CXXConstructorDeclBitfields {
friend class CXXConstructorDecl;
/// For the bits in FunctionDeclBitfields.
+ LLVM_PREFERRED_TYPE(FunctionDeclBitfields)
uint64_t : NumFunctionDeclBits;
/// 20 bits to fit in the remaining available space.
@@ -1729,12 +1808,15 @@ class DeclContext {
/// will need to be shrunk if some bit is added to NumDeclContextBitfields,
/// NumFunctionDeclBitfields or CXXConstructorDeclBitfields.
uint64_t NumCtorInitializers : 17;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsInheritingConstructor : 1;
/// Whether this constructor has a trail-allocated explicit specifier.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasTrailingExplicitSpecifier : 1;
/// If this constructor does't have a trail-allocated explicit specifier.
/// Whether this constructor is explicit specified.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsSimpleExplicit : 1;
};
@@ -1748,43 +1830,56 @@ class DeclContext {
friend class ObjCMethodDecl;
/// For the bits in DeclContextBitfields.
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
/// The conventional meaning of this method; an ObjCMethodFamily.
/// This is not serialized; instead, it is computed on demand and
/// cached.
+ LLVM_PREFERRED_TYPE(ObjCMethodFamily)
mutable uint64_t Family : ObjCMethodFamilyBitWidth;
/// instance (true) or class (false) method.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsInstance : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsVariadic : 1;
/// True if this method is the getter or setter for an explicit property.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsPropertyAccessor : 1;
/// True if this method is a synthesized property accessor stub.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsSynthesizedAccessorStub : 1;
/// Method has a definition.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsDefined : 1;
/// Method redeclaration in the same interface.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsRedeclaration : 1;
/// Is redeclared in the same interface.
+ LLVM_PREFERRED_TYPE(bool)
mutable uint64_t HasRedeclaration : 1;
/// \@required/\@optional
+ LLVM_PREFERRED_TYPE(ObjCImplementationControl)
uint64_t DeclImplementation : 2;
/// in, inout, etc.
+ LLVM_PREFERRED_TYPE(Decl::ObjCDeclQualifier)
uint64_t objcDeclQualifier : 7;
/// Indicates whether this method has a related result type.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t RelatedResultType : 1;
/// Whether the locations of the selector identifiers are in a
/// "standard" position, a enum SelectorLocationsKind.
+ LLVM_PREFERRED_TYPE(SelectorLocationsKind)
uint64_t SelLocsKind : 2;
/// Whether this method overrides any other in the class hierarchy.
@@ -1794,9 +1889,11 @@ class DeclContext {
/// the same selector and is of the same kind (class or instance).
/// A method in an implementation is not considered as overriding the same
/// method in the interface or its categories.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsOverriding : 1;
/// Indicates if the method was a definition but its body was skipped.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasSkippedBody : 1;
};
@@ -1809,6 +1906,7 @@ class DeclContext {
class ObjCContainerDeclBitfields {
friend class ObjCContainerDecl;
/// For the bits in DeclContextBitfields
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint32_t : NumDeclContextBits;
// Not a bitfield but this saves space.
@@ -1827,16 +1925,18 @@ class DeclContext {
class LinkageSpecDeclBitfields {
friend class LinkageSpecDecl;
/// For the bits in DeclContextBitfields.
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
- /// The language for this linkage specification with values
- /// in the enum LinkageSpecDecl::LanguageIDs.
+ /// The language for this linkage specification.
+ LLVM_PREFERRED_TYPE(LinkageSpecLanguageIDs)
uint64_t Language : 3;
/// True if this linkage spec has braces.
/// This is needed so that hasBraces() returns the correct result while the
/// linkage spec body is being parsed. Once RBraceLoc has been set this is
/// not used, so it doesn't need to be serialized.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t HasBraces : 1;
};
@@ -1849,20 +1949,27 @@ class DeclContext {
class BlockDeclBitfields {
friend class BlockDecl;
/// For the bits in DeclContextBitfields.
+ LLVM_PREFERRED_TYPE(DeclContextBitfields)
uint64_t : NumDeclContextBits;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsVariadic : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t CapturesCXXThis : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t BlockMissingReturnType : 1;
+ LLVM_PREFERRED_TYPE(bool)
uint64_t IsConversionFromLambda : 1;
/// A bit that indicates this block is passed directly to a function as a
/// non-escaping parameter.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t DoesNotEscape : 1;
/// A bit that indicates whether it's possible to avoid coying this block to
/// the heap when it initializes or is assigned to a local variable with
/// automatic storage.
+ LLVM_PREFERRED_TYPE(bool)
uint64_t CanAvoidCopyToHeap : 1;
};
More information about the cfe-commits
mailing list