Windows build is broken http://lab.llvm.org:8011/builders/sanitizer-windows/builds/27686/steps/run%20tests/logs/stdio
On Fri, Aug 19, 2016 at 5:12 PM Manman Ren via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: mren > Date: Fri Aug 19 19:04:21 2016 > New Revision: 279351 > > URL: http://llvm.org/viewvc/llvm-project?rev=279351&view=rev > Log: > [NFC] Add a class ObjCProtocolQualifiers to wrap APIs for ObjC protocol > list. > > This is in preparation of adding a new type class ObjCTypeParamType that > can take protocol qualifiers. ObjCProtocolQualifiers will be shared between > ObjCObjectType and ObjCTypeParamType. > > rdar://24619481 > rdar://25060179 > > Differential Revision: http://reviews.llvm.org/D23078 > > Modified: > cfe/trunk/include/clang/AST/Type.h > cfe/trunk/lib/AST/Type.cpp > > Modified: cfe/trunk/include/clang/AST/Type.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=279351&r1=279350&r2=279351&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Type.h (original) > +++ cfe/trunk/include/clang/AST/Type.h Fri Aug 19 19:04:21 2016 > @@ -4699,6 +4699,59 @@ public: > } > }; > > +/// This class wraps the list of protocol qualifiers. For types that can > +/// take ObjC protocol qualifers, they can subclass this class. > +template <class T> > +class ObjCProtocolQualifiers { > +protected: > + ObjCProtocolQualifiers() {} > + ObjCProtocolDecl * const *getProtocolStorage() const { > + return > const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage(); > + } > + > + ObjCProtocolDecl **getProtocolStorage() { > + return static_cast<T*>(this)->getProtocolStorageImpl(); > + } > + void setNumProtocols(unsigned N) { > + static_cast<T*>(this)->setNumProtocolsImpl(N); > + } > + void initialize(ArrayRef<ObjCProtocolDecl *> protocols) { > + setNumProtocols(protocols.size()); > + assert(getNumProtocols() == protocols.size() && > + "bitfield overflow in protocol count"); > + if (!protocols.empty()) > + memcpy(getProtocolStorage(), protocols.data(), > + protocols.size() * sizeof(ObjCProtocolDecl*)); > + } > + > +public: > + typedef ObjCProtocolDecl * const *qual_iterator; > + typedef llvm::iterator_range<qual_iterator> qual_range; > + > + qual_range quals() const { return qual_range(qual_begin(), qual_end()); > } > + qual_iterator qual_begin() const { return getProtocolStorage(); } > + qual_iterator qual_end() const { return qual_begin() + > getNumProtocols(); } > + > + bool qual_empty() const { return getNumProtocols() == 0; } > + > + /// Return the number of qualifying protocols in this type, or 0 if > + /// there are none. > + unsigned getNumProtocols() const { > + return static_cast<const T*>(this)->getNumProtocolsImpl(); > + } > + > + /// Fetch a protocol by index. > + ObjCProtocolDecl *getProtocol(unsigned I) const { > + assert(I < getNumProtocols() && "Out-of-range protocol access"); > + return qual_begin()[I]; > + } > + > + /// Retrieve all of the protocol qualifiers. > + ArrayRef<ObjCProtocolDecl *> getProtocols() const { > + return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols()); > + } > +}; > + > /// Represents a class type in Objective C. > /// > /// Every Objective C type is a combination of a base type, a set of > @@ -4727,7 +4780,9 @@ public: > /// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType > /// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually > /// this should get its own sugar class to better represent the source. > -class ObjCObjectType : public Type { > +class ObjCObjectType : public Type, > + public ObjCProtocolQualifiers<ObjCObjectType> { > + friend class ObjCProtocolQualifiers; > // ObjCObjectType.NumTypeArgs - the number of type arguments stored > // after the ObjCObjectPointerType node. > // ObjCObjectType.NumProtocols - the number of protocols stored > @@ -4747,16 +4802,20 @@ class ObjCObjectType : public Type { > mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool> > CachedSuperClassType; > > - ObjCProtocolDecl * const *getProtocolStorage() const { > - return const_cast<ObjCObjectType*>(this)->getProtocolStorage(); > - } > - > QualType *getTypeArgStorage(); > const QualType *getTypeArgStorage() const { > return const_cast<ObjCObjectType *>(this)->getTypeArgStorage(); > } > > - ObjCProtocolDecl **getProtocolStorage(); > + ObjCProtocolDecl **getProtocolStorageImpl(); > + /// Return the number of qualifying protocols in this interface type, > + /// or 0 if there are none. > + unsigned getNumProtocolsImpl() const { > + return ObjCObjectTypeBits.NumProtocols; > + } > + void setNumProtocolsImpl(unsigned N) { > + ObjCObjectTypeBits.NumProtocols = N; > + } > > protected: > ObjCObjectType(QualType Canonical, QualType Base, > @@ -4833,30 +4892,6 @@ public: > ObjCObjectTypeBits.NumTypeArgs); > } > > - typedef ObjCProtocolDecl * const *qual_iterator; > - typedef llvm::iterator_range<qual_iterator> qual_range; > - > - qual_range quals() const { return qual_range(qual_begin(), qual_end()); > } > - qual_iterator qual_begin() const { return getProtocolStorage(); } > - qual_iterator qual_end() const { return qual_begin() + > getNumProtocols(); } > - > - bool qual_empty() const { return getNumProtocols() == 0; } > - > - /// Return the number of qualifying protocols in this interface type, > - /// or 0 if there are none. > - unsigned getNumProtocols() const { return > ObjCObjectTypeBits.NumProtocols; } > - > - /// Fetch a protocol by index. > - ObjCProtocolDecl *getProtocol(unsigned I) const { > - assert(I < getNumProtocols() && "Out-of-range protocol access"); > - return qual_begin()[I]; > - } > - > - /// Retrieve all of the protocol qualifiers. > - ArrayRef<ObjCProtocolDecl *> getProtocols() const { > - return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols()); > - } > - > /// Whether this is a "__kindof" type as written. > bool isKindOfTypeAsWritten() const { return > ObjCObjectTypeBits.IsKindOf; } > > @@ -4919,7 +4954,7 @@ inline QualType *ObjCObjectType::getType > return reinterpret_cast<QualType > *>(static_cast<ObjCObjectTypeImpl*>(this)+1); > } > > -inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorage() { > +inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() { > return reinterpret_cast<ObjCProtocolDecl**>( > getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs); > } > > Modified: cfe/trunk/lib/AST/Type.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=279351&r1=279350&r2=279351&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Type.cpp (original) > +++ cfe/trunk/lib/AST/Type.cpp Fri Aug 19 19:04:21 2016 > @@ -546,15 +546,9 @@ ObjCObjectType::ObjCObjectType(QualType > ObjCObjectTypeBits.NumTypeArgs = typeArgs.size(); > assert(getTypeArgsAsWritten().size() == typeArgs.size() && > "bitfield overflow in type argument count"); > - ObjCObjectTypeBits.NumProtocols = protocols.size(); > - assert(getNumProtocols() == protocols.size() && > - "bitfield overflow in protocol count"); > if (!typeArgs.empty()) > memcpy(getTypeArgStorage(), typeArgs.data(), > typeArgs.size() * sizeof(QualType)); > - if (!protocols.empty()) > - memcpy(getProtocolStorage(), protocols.data(), > - protocols.size() * sizeof(ObjCProtocolDecl*)); > > for (auto typeArg : typeArgs) { > if (typeArg->isDependentType()) > @@ -565,6 +559,9 @@ ObjCObjectType::ObjCObjectType(QualType > if (typeArg->containsUnexpandedParameterPack()) > setContainsUnexpandedParameterPack(); > } > + // Initialize the protocol qualifiers. The protocol storage is known > + // after we set number of type arguments. > + initialize(protocols); > } > > bool ObjCObjectType::isSpecialized() const { > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits