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