};
-/// ObjCQualifiedClassType - to represent Class<protocol-list>.
-///
-/// Duplicate protocols are removed and protocol list is canonicalized to be in
-/// alphabetical order.
-class ObjCQualifiedClassType : public Type,
- public llvm::FoldingSetNode {
- // List of protocols for this protocol conforming 'id' type
- // List is sorted on protocol name. No protocol is enterred more than once.
- llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols;
-
- ObjCQualifiedClassType(ObjCProtocolDecl **Protos, unsigned NumP)
- : Type(ObjCQualifiedClass, QualType()/*these are always canonical*/,
- /*Dependent=*/false),
- Protocols(Protos, Protos+NumP) { }
- friend class ASTContext; // ASTContext creates these.
-public:
-
- ObjCProtocolDecl *getProtocols(unsigned i) const {
- return Protocols[i];
- }
- unsigned getNumProtocols() const {
- return Protocols.size();
- }
- ObjCProtocolDecl **getReferencedProtocols() {
- return &Protocols[0];
- }
-
- typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
- qual_iterator qual_begin() const { return Protocols.begin(); }
- qual_iterator qual_end() const { return Protocols.end(); }
-
- virtual void getAsStringInternal(std::string &InnerString) const;
-
- void Profile(llvm::FoldingSetNodeID &ID);
- static void Profile(llvm::FoldingSetNodeID &ID,
- ObjCProtocolDecl **protocols, unsigned NumProtocols);
-
- static bool classof(const Type *T) {
- return T->getTypeClass() == ObjCQualifiedClass;
- }
- static bool classof(const ObjCQualifiedClassType *) { return true; }
-
-};
-
// Inline function definitions.
/// getUnqualifiedType - Return the type without any qualifiers.
TYPE(ObjCInterface, Type)
TYPE(ObjCQualifiedInterface, ObjCInterfaceType)
TYPE(ObjCQualifiedId, Type)
-TYPE(ObjCQualifiedClass, Type)
#undef DEPENDENT_TYPE
#undef NON_CANONICAL_TYPE
/// \brief An ObjCQualifiedInterfaceType record.
TYPE_OBJC_QUALIFIED_INTERFACE = 22,
/// \brief An ObjCQualifiedIdType record.
- TYPE_OBJC_QUALIFIED_ID = 23,
- /// \brief An ObjCQualifiedClassType record.
- TYPE_OBJC_QUALIFIED_CLASS = 24
+ TYPE_OBJC_QUALIFIED_ID = 23
};
/// \brief The type IDs for special types constructed by semantic
// alignment requirements: getPointerInfo should take an AddrSpace.
return getTypeInfo(QualType(cast<ExtQualType>(T)->getBaseType(), 0));
case Type::ObjCQualifiedId:
- case Type::ObjCQualifiedClass:
case Type::ObjCQualifiedInterface:
Width = Target.getPointerWidth(0);
Align = Target.getPointerAlign(0);
case Type::FixedWidthInt:
// Distinct fixed-width integers are not compatible.
return QualType();
- case Type::ObjCQualifiedClass:
- // Distinct qualified classes are not compatible.
- return QualType();
case Type::ExtQual:
// FIXME: ExtQual types can be compatible even if they're not
// identical!
isa<BlockPointerType>(CanonicalType) ||
isa<MemberPointerType>(CanonicalType) ||
isa<ComplexType>(CanonicalType) ||
- isa<ObjCQualifiedIdType>(CanonicalType) ||
- isa<ObjCQualifiedClassType>(CanonicalType);
+ isa<ObjCQualifiedIdType>(CanonicalType);
}
/// \brief Determines whether the type is a C++ aggregate type or C
case Type::MemberPointer:
case Type::TemplateSpecialization:
case Type::QualifiedName:
- case Type::ObjCQualifiedClass:
// Unsupported types
return llvm::DIType();
}
case Type::ObjCQualifiedId:
- case Type::ObjCQualifiedClass:
// Protocols don't influence the LLVM type.
return ConvertTypeRecursive(Context.getObjCIdType());
Protos.push_back(cast<ObjCProtocolDecl>(GetDecl(Record[Idx++])));
return Context.getObjCQualifiedIdType(&Protos[0], NumProtos);
}
-
- case pch::TYPE_OBJC_QUALIFIED_CLASS:
- // FIXME: Deserialize ObjCQualifiedClassType
- assert(false && "Cannot de-serialize ObjC qualified class types yet");
- return QualType();
}
-
// Suppress a GCC warning
return QualType();
}
Code = pch::TYPE_OBJC_QUALIFIED_ID;
}
-void
-PCHTypeWriter::VisitObjCQualifiedClassType(const ObjCQualifiedClassType *T) {
- Record.push_back(T->getNumProtocols());
- for (unsigned I = 0, N = T->getNumProtocols(); I != N; ++I)
- Writer.AddDeclRef(T->getProtocols(I), Record);
- Code = pch::TYPE_OBJC_QUALIFIED_CLASS;
-}
-
//===----------------------------------------------------------------------===//
// Declaration serialization
//===----------------------------------------------------------------------===//
return QualType();
}
-QualType
-TemplateTypeInstantiator::
-InstantiateObjCQualifiedClassType(const ObjCQualifiedClassType *T,
- unsigned Quals) const {
- assert(false && "Objective-C types cannot be dependent");
- return QualType();
-}
-
/// \brief The actual implementation of Sema::InstantiateType().
QualType TemplateTypeInstantiator::Instantiate(QualType T) const {
// If T is not a dependent type, there is nothing to do.