Skip to content

Commit 65eb74e

Browse files
committed
PointerLikeTypeTraits: Standardize NumLowBitsAvailable on static constexpr rather than anonymous enum
This is (more?) usable by GDB pretty printers and seems nicer to write. There's one tricky caveat that in C++14 (LLVM's codebase today) the static constexpr member declaration is not a definition - so odr use of this constant requires an out of line definition, which won't be provided (that'd make all these trait classes more annoyidng/expensive to maintain). But the use of this constant in the library implementation is/should always be in a non-odr context - only two unit tests needed to be touched to cope with this/avoid odr using these constants. Based on/expanded from D72590 by Christian Sigg.
1 parent de022a8 commit 65eb74e

File tree

26 files changed

+62
-66
lines changed

26 files changed

+62
-66
lines changed

clang/include/clang/AST/CanonicalType.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ struct PointerLikeTypeTraits<clang::CanQual<T>> {
384384
}
385385

386386
// qualifier information is encoded in the low bits.
387-
enum { NumLowBitsAvailable = 0 };
387+
static constexpr int NumLowBitsAvailable = 0;
388388
};
389389

390390
} // namespace llvm

clang/include/clang/AST/DeclGroup.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ namespace llvm {
147147
return clang::DeclGroupRef::getFromOpaquePtr(P);
148148
}
149149

150-
enum { NumLowBitsAvailable = 0 };
150+
static constexpr int NumLowBitsAvailable = 0;
151151
};
152152

153153
} // namespace llvm

clang/include/clang/AST/ExternalASTSource.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,9 +504,8 @@ struct PointerLikeTypeTraits<
504504
static void *getAsVoidPointer(Ptr P) { return P.getOpaqueValue(); }
505505
static Ptr getFromVoidPointer(void *P) { return Ptr::getFromOpaqueValue(P); }
506506

507-
enum {
508-
NumLowBitsAvailable = PointerLikeTypeTraits<T>::NumLowBitsAvailable - 1
509-
};
507+
static constexpr int NumLowBitsAvailable =
508+
PointerLikeTypeTraits<T>::NumLowBitsAvailable - 1;
510509
};
511510

512511
} // namespace llvm

clang/include/clang/AST/TemplateName.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ struct PointerLikeTypeTraits<clang::TemplateName> {
559559
}
560560

561561
// No bits are available!
562-
enum { NumLowBitsAvailable = 0 };
562+
static constexpr int NumLowBitsAvailable = 0;
563563
};
564564

565565
} // namespace llvm.

clang/include/clang/AST/Type.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ namespace llvm {
8585
return static_cast< ::clang::Type*>(P);
8686
}
8787

88-
enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
88+
static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
8989
};
9090

9191
template<>
@@ -96,7 +96,7 @@ namespace llvm {
9696
return static_cast< ::clang::ExtQuals*>(P);
9797
}
9898

99-
enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
99+
static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
100100
};
101101

102102
} // namespace llvm
@@ -1295,7 +1295,7 @@ struct PointerLikeTypeTraits<clang::QualType> {
12951295
}
12961296

12971297
// Various qualifiers go in low bits.
1298-
enum { NumLowBitsAvailable = 0 };
1298+
static constexpr int NumLowBitsAvailable = 0;
12991299
};
13001300

13011301
} // namespace llvm

clang/include/clang/Basic/IdentifierTable.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ struct PointerLikeTypeTraits<clang::Selector> {
967967
return clang::Selector(reinterpret_cast<uintptr_t>(P));
968968
}
969969

970-
enum { NumLowBitsAvailable = 0 };
970+
static constexpr int NumLowBitsAvailable = 0;
971971
};
972972

973973
// Provide PointerLikeTypeTraits for IdentifierInfo pointers, which
@@ -982,7 +982,7 @@ struct PointerLikeTypeTraits<clang::IdentifierInfo*> {
982982
return static_cast<clang::IdentifierInfo*>(P);
983983
}
984984

985-
enum { NumLowBitsAvailable = 1 };
985+
static constexpr int NumLowBitsAvailable = 1;
986986
};
987987

988988
template<>
@@ -995,7 +995,7 @@ struct PointerLikeTypeTraits<const clang::IdentifierInfo*> {
995995
return static_cast<const clang::IdentifierInfo*>(P);
996996
}
997997

998-
enum { NumLowBitsAvailable = 1 };
998+
static constexpr int NumLowBitsAvailable = 1;
999999
};
10001000

10011001
} // namespace llvm

clang/include/clang/Basic/SourceLocation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ namespace llvm {
482482
// Teach SmallPtrSet how to handle SourceLocation.
483483
template<>
484484
struct PointerLikeTypeTraits<clang::SourceLocation> {
485-
enum { NumLowBitsAvailable = 0 };
485+
static constexpr int NumLowBitsAvailable = 0;
486486

487487
static void *getAsVoidPointer(clang::SourceLocation L) {
488488
return L.getPtrEncoding();

clang/include/clang/CodeGen/ConstantInitFuture.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitBuilderBase*> {
3535

3636
static inline void *getAsVoidPointer(T p) { return p; }
3737
static inline T getFromVoidPointer(void *p) {return static_cast<T>(p);}
38-
enum { NumLowBitsAvailable = 2 };
38+
static constexpr int NumLowBitsAvailable = 2;
3939
};
4040
}
4141

@@ -79,10 +79,8 @@ class ConstantInitFuture {
7979
result.Data = PairTy::getFromOpaqueValue(value);
8080
return result;
8181
}
82-
enum {
83-
NumLowBitsAvailable =
84-
llvm::PointerLikeTypeTraits<PairTy>::NumLowBitsAvailable
85-
};
82+
static constexpr int NumLowBitsAvailable =
83+
llvm::PointerLikeTypeTraits<PairTy>::NumLowBitsAvailable;
8684
};
8785

8886
} // end namespace CodeGen
@@ -100,7 +98,7 @@ struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitFuture> {
10098
static inline T getFromVoidPointer(void *p) {
10199
return T::getFromOpaqueValue(p);
102100
}
103-
enum { NumLowBitsAvailable = T::NumLowBitsAvailable };
101+
static constexpr int NumLowBitsAvailable = T::NumLowBitsAvailable;
104102
};
105103

106104
} // end namespace llvm

clang/include/clang/Sema/Ownership.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ namespace llvm {
116116

117117
template <class T>
118118
struct PointerLikeTypeTraits<clang::OpaquePtr<T>> {
119-
enum { NumLowBitsAvailable = 0 };
119+
static constexpr int NumLowBitsAvailable = 0;
120120

121121
static inline void *getAsVoidPointer(clang::OpaquePtr<T> P) {
122122
// FIXME: Doesn't work? return P.getAs< void >();

llvm/include/llvm/ADT/IntervalMap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ class NodeRef {
491491
struct CacheAlignedPointerTraits {
492492
static inline void *getAsVoidPointer(void *P) { return P; }
493493
static inline void *getFromVoidPointer(void *P) { return P; }
494-
enum { NumLowBitsAvailable = Log2CacheLine };
494+
static constexpr int NumLowBitsAvailable = Log2CacheLine;
495495
};
496496
PointerIntPair<void*, Log2CacheLine, unsigned, CacheAlignedPointerTraits> pip;
497497

0 commit comments

Comments
 (0)