return isa<FunctionType>(CanonicalType);
}
-PointerType *Type::isPointerType() const {
- if (PointerType *PTy = dyn_cast<PointerType>(CanonicalType))
+const PointerType *Type::isPointerType() const {
+ // If this is directly a pointer type, return it.
+ if (const PointerType *PTy = dyn_cast<PointerType>(this))
+ return PTy;
+ // If this is a typedef for a pointer type, strip the typedef off.
+ if (const PointerType *PTy = dyn_cast<PointerType>(CanonicalType))
return PTy;
return 0;
}
return false;
}
+bool Type::isComplexType() const {
+ return isa<ComplexType>(CanonicalType);
+}
+
+const VectorType *Type::isVectorType() const {
+ // Are we directly a vector type?
+ if (const VectorType *VTy = dyn_cast<VectorType>(this))
+ return VTy;
+ // If this is a typedef for a vector type, strip the typedef off.
+ if (const VectorType *VTy = dyn_cast<VectorType>(CanonicalType))
+ return VTy;
+ return 0;
+}
+
+
// C99 6.2.7p1: If both are complete types, then the following additional
// requirements apply...FIXME (handle compatibility across source files).
bool Type::tagTypesAreCompatible(QualType lhs, QualType rhs) {
return false;
}
-bool Type::isComplexType() const {
- return isa<ComplexType>(CanonicalType);
-}
-
-VectorType *Type::isVectorType() const {
- if (VectorType *VTy = dyn_cast<VectorType>(CanonicalType))
- return VTy;
- return 0;
-}
-
bool Type::isArithmeticType() const {
if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
return BT->getKind() != BuiltinType::Void;
// and index from the expression types.
Expr *BaseExpr, *IndexExpr;
QualType ResultType;
- if (PointerType *PTy = LHSTy->isPointerType()) {
+ if (const PointerType *PTy = LHSTy->isPointerType()) {
BaseExpr = LHSExp;
IndexExpr = RHSExp;
// FIXME: need to deal with const...
ResultType = PTy->getPointeeType();
- } else if (PointerType *PTy = RHSTy->isPointerType()) { // uncommon: 123[Ptr]
+ } else if (const PointerType *PTy = RHSTy->isPointerType()) {
+ // Handle the uncommon case of "123[Ptr]".
BaseExpr = RHSExp;
IndexExpr = LHSExp;
// FIXME: need to deal with const...
ResultType = PTy->getPointeeType();
- } else if (VectorType *VTy = LHSTy->isVectorType()) { // vectors: V[123]
+ } else if (const VectorType *VTy = LHSTy->isVectorType()) { // vectors: V[123]
BaseExpr = LHSExp;
IndexExpr = RHSExp;
// FIXME: need to deal with const...
bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating)
/// Vector types
- VectorType *isVectorType() const; // GCC vector type.
+ const VectorType *isVectorType() const; // GCC vector type.
/// Derived types (C99 6.2.5p20). isFunctionType() is also a derived type.
bool isDerivedType() const;
- PointerType *isPointerType() const;
+ const PointerType *isPointerType() const;
bool isReferenceType() const;
bool isArrayType() const;
bool isStructureType() const;