[AST] Use static_assert to verify types instead of undefined classes.
No functionliaty change intended. llvm-svn: 288133
This commit is contained in:
parent
198dd205e6
commit
7fff35479c
|
@ -630,8 +630,8 @@ CanQual<T> CanQual<T>::CreateUnsafe(QualType Other) {
|
|||
template<typename T>
|
||||
template<typename U>
|
||||
CanProxy<U> CanQual<T>::getAs() const {
|
||||
ArrayType_cannot_be_used_with_getAs<U> at;
|
||||
(void)at;
|
||||
static_assert(!TypeIsArrayType<T>::value,
|
||||
"ArrayType cannot be used with getAs!");
|
||||
|
||||
if (Stored.isNull())
|
||||
return CanProxy<U>();
|
||||
|
@ -645,8 +645,8 @@ CanProxy<U> CanQual<T>::getAs() const {
|
|||
template<typename T>
|
||||
template<typename U>
|
||||
CanProxy<U> CanQual<T>::castAs() const {
|
||||
ArrayType_cannot_be_used_with_getAs<U> at;
|
||||
(void)at;
|
||||
static_assert(!TypeIsArrayType<U>::value,
|
||||
"ArrayType cannot be used with castAs!");
|
||||
|
||||
assert(!Stored.isNull() && isa<U>(Stored.getTypePtr()));
|
||||
return CanQual<U>::CreateUnsafe(Stored);
|
||||
|
|
|
@ -5916,17 +5916,15 @@ inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
|
|||
|
||||
// Helper class template that is used by Type::getAs to ensure that one does
|
||||
// not try to look through a qualified type to get to an array type.
|
||||
template <typename T, bool isArrayType = (std::is_same<T, ArrayType>::value ||
|
||||
std::is_base_of<ArrayType, T>::value)>
|
||||
struct ArrayType_cannot_be_used_with_getAs {};
|
||||
|
||||
template<typename T>
|
||||
struct ArrayType_cannot_be_used_with_getAs<T, true>;
|
||||
template <typename T>
|
||||
using TypeIsArrayType =
|
||||
std::integral_constant<bool, std::is_same<T, ArrayType>::value ||
|
||||
std::is_base_of<ArrayType, T>::value>;
|
||||
|
||||
// Member-template getAs<specific type>'.
|
||||
template <typename T> const T *Type::getAs() const {
|
||||
ArrayType_cannot_be_used_with_getAs<T> at;
|
||||
(void)at;
|
||||
static_assert(!TypeIsArrayType<T>::value,
|
||||
"ArrayType cannot be used with getAs!");
|
||||
|
||||
// If this is directly a T type, return it.
|
||||
if (const T *Ty = dyn_cast<T>(this))
|
||||
|
@ -5956,8 +5954,8 @@ inline const ArrayType *Type::getAsArrayTypeUnsafe() const {
|
|||
}
|
||||
|
||||
template <typename T> const T *Type::castAs() const {
|
||||
ArrayType_cannot_be_used_with_getAs<T> at;
|
||||
(void) at;
|
||||
static_assert(!TypeIsArrayType<T>::value,
|
||||
"ArrayType cannot be used with castAs!");
|
||||
|
||||
if (const T *ty = dyn_cast<T>(this)) return ty;
|
||||
assert(isa<T>(CanonicalType));
|
||||
|
|
Loading…
Reference in New Issue