From: Daniel Dunbar Date: Thu, 26 Feb 2009 20:52:22 +0000 (+0000) Subject: Add Type::hasPointerRepresentation predicate. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8958891f5fa1e593c4519a36b3df427ee019d70b;p=clang Add Type::hasPointerRepresentation predicate. - For types whose native representation is a pointer. - Use to replace ExprConstant.cpp:HasPointerEvalType, CodeGenFunction::isObjCPointerType. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65569 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index f05185b339..f5bd5f19f0 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -390,6 +390,12 @@ public: bool isDependentType() const { return Dependent; } bool isOverloadType() const; // C++ overloaded function + /// hasPointerRepresentation - Whether this type is represented + /// natively as a pointer; this includes pointers, references, block + /// pointers, and Objective-C interface, qualified id, and qualified + /// interface types. + bool hasPointerRepresentation() const; + // Type Checking Functions: Check to see if this type is structurally the // specified type, ignoring typedefs and qualifiers, and return a pointer to // the best type we can. @@ -1936,6 +1942,12 @@ inline bool Type::isOverloadType() const { return isSpecificBuiltinType(BuiltinType::Overload); } +inline bool Type::hasPointerRepresentation() const { + return (isPointerType() || isReferenceType() || isBlockPointerType() || + isObjCInterfaceType() || isObjCQualifiedIdType() || + isObjCQualifiedInterfaceType()); +} + /// Insertion operator for diagnostics. This allows sending QualType's into a /// diagnostic with <<. inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 6899b61703..5cfc6e6ab3 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -279,14 +279,8 @@ public: }; } // end anonymous namespace -static bool HasPointerEvalType(const Expr* E) { - return E->getType()->isPointerType() - || E->getType()->isBlockPointerType() - || E->getType()->isObjCQualifiedIdType(); -} - static bool EvaluatePointer(const Expr* E, APValue& Result, EvalInfo &Info) { - if (!HasPointerEvalType(E)) + if (!E->getType()->hasPointerRepresentation()) return false; Result = PointerExprEvaluator(Info).Visit(const_cast(E)); return Result.isLValue(); @@ -1570,7 +1564,7 @@ bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { } else if (getType()->isIntegerType()) { if (!IntExprEvaluator(Info, Result.Val).Visit(const_cast(this))) return false; - } else if (HasPointerEvalType(this)) { + } else if (getType()->hasPointerRepresentation()) { if (!EvaluatePointer(this, Result.Val, Info)) return false; } else if (getType()->isRealFloatingType()) { diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index e560bfd82f..7a98b0c1c6 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -525,9 +525,7 @@ void X86_64ABIInfo::classify(QualType Ty, } else if (const EnumType *ET = Ty->getAsEnumType()) { // Classify the underlying integer type. classify(ET->getDecl()->getIntegerType(), Context, OffsetBase, Lo, Hi); - } else if (Ty->isPointerType() || Ty->isReferenceType() || - Ty->isBlockPointerType() || Ty->isObjCQualifiedIdType() || - Ty->isObjCQualifiedInterfaceType()) { + } else if (Ty->hasPointerRepresentation()) { Current = Integer; } else if (const VectorType *VT = Ty->getAsVectorType()) { uint64_t Size = Context.getTypeSize(VT); diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 2f09734666..81fd3871d6 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -73,17 +73,11 @@ const llvm::Type *CodeGenFunction::ConvertType(QualType T) { return CGM.getTypes().ConvertType(T); } -bool CodeGenFunction::isObjCPointerType(QualType T) { - // All Objective-C types are pointers. - return T->isObjCInterfaceType() || - T->isObjCQualifiedInterfaceType() || T->isObjCQualifiedIdType(); -} - bool CodeGenFunction::hasAggregateLLVMType(QualType T) { // FIXME: Use positive checks instead of negative ones to be more // robust in the face of extension. - return !isObjCPointerType(T) &&!T->isRealType() && !T->isPointerType() && - !T->isReferenceType() && !T->isVoidType() && !T->isVectorType() && !T->isFunctionType() && + return !T->hasPointerRepresentation() &&!T->isRealType() && + !T->isVoidType() && !T->isVectorType() && !T->isFunctionType() && !T->isBlockPointerType(); } diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 8b5986c471..918646f955 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -366,10 +366,6 @@ public: /// TypeOfSelfObject - Return type of object that this self represents. QualType TypeOfSelfObject(); - /// isObjCPointerType - Return true if the specificed AST type will map onto - /// some Objective-C pointer type. - static bool isObjCPointerType(QualType T); - /// hasAggregateLLVMType - Return true if the specified AST type will map into /// an aggregate LLVM type or is void. static bool hasAggregateLLVMType(QualType T);