bool isDerivedType() const; // C99 6.2.5p20
bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers)
bool isAggregateType() const;
+ bool isFundamentalType() const;
+ bool isCompoundType() const;
// Type Predicates: Check to see if this type is structurally the specified
// type, ignoring typedefs and qualifiers.
return *this;
}
+/// \brief Tests whether the type is categorized as a fundamental type.
+///
+/// \returns True for types specified in C++0x [basic.fundamental].
+inline bool Type::isFundamentalType() const {
+ return isVoidType() ||
+ // FIXME: It's really annoying that we don't have an
+ // 'isArithmeticType()' which agrees with the standard definition.
+ (isArithmeticType() && !isEnumeralType());
+}
+
+/// \brief Tests whether the type is categorized as a compound type.
+///
+/// \returns True for types specified in C++0x [basic.compound].
+inline bool Type::isCompoundType() const {
+ // C++0x [basic.compound]p1:
+ // Compound types can be constructed in the following ways:
+ // -- arrays of objects of a given type [...];
+ return isArrayType() ||
+ // -- functions, which have parameters of given types [...];
+ isFunctionType() ||
+ // -- pointers to void or objects or functions [...];
+ isPointerType() ||
+ // -- references to objects or functions of a given type. [...]
+ isReferenceType() ||
+ // -- classes containing a sequence of objects of various types, [...];
+ isRecordType() ||
+ // -- unions, which ar classes capable of containing objects of different types at different times;
+ isUnionType() ||
+ // -- enumerations, which comprise a set of named constant values. [...];
+ isEnumeralType() ||
+ // -- pointers to non-static class members, [...].
+ isMemberPointerType();
+}
+
inline bool Type::isFunctionType() const {
return isa<FunctionType>(CanonicalType);
}
case UTT_IsEnum:
return T->isEnumeralType();
case UTT_IsUnion:
- if (const RecordType *Record = T->getAs<RecordType>())
- return Record->getDecl()->isUnion();
- return false;
+ return T->isUnionType();
case UTT_IsClass:
- if (const RecordType *Record = T->getAs<RecordType>())
- return !Record->getDecl()->isUnion();
- return false;
+ return T->isClassType() || T->isStructureType();
case UTT_IsFunction:
return T->isFunctionType();
case UTT_IsReference:
return T->isReferenceType();
case UTT_IsArithmetic:
- return T->isArithmeticType() && ! T->isEnumeralType();
+ return T->isArithmeticType() && !T->isEnumeralType();
case UTT_IsFundamental:
- return T->isVoidType() || (T->isArithmeticType() && ! T->isEnumeralType());
+ return T->isFundamentalType();
case UTT_IsObject:
- // Defined in Section 3.9 p8 of the Working Draft, essentially:
- // !__is_reference(T) && !__is_function(T) && !__is_void(T).
- return ! (T->isReferenceType() || T->isFunctionType() || T->isVoidType());
+ return T->isObjectType();
case UTT_IsScalar:
return T->isScalarType();
case UTT_IsCompound:
- return ! (T->isVoidType() || T->isArithmeticType()) || T->isEnumeralType();
+ return T->isCompoundType();
case UTT_IsMemberPointer:
return T->isMemberPointerType();