<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On May 19, 2009, at 11:22 AM, steve naroff wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>// <b>Seven classes</b>. In this case, ObjCObjectPointerType is abstract. </div><div><br></div><div>class <b>ObjCObjectPointerType</b> : public Type { ... };</div><div><br></div><div>class <b>ObjCIdType</b> : public ObjCObjectPointerType { ... };</div><div>class <b>ObjCInterfacePointerType</b> : public ObjCObjectPointerType { ... };</div><div>class <b>ObjCClassType</b> : public ObjCObjectPointerType { ... };</div><div><br></div><div>class <b>ObjCQualifiedIdType</b> : public ObjCIdType, public llvm::FoldingSetNode { ... };</div><div><div>class <b>ObjCQualifiedInterfacePointerType</b> : public ObjCInterfacePointerType, public llvm::FoldingSetNode { ... };</div><div><div>class <b>ObjCQualifiedClassType</b> : public ObjCClassType, public llvm::FoldingSetNode { ... };</div><div><br></div></div><div>I think having a common base class (abstract or not) makes either of these more appealing than what we have now.</div></div></div></blockquote><br></div><div>How about eight classes?</div><div><br></div><div>// <b>Eight classes.</b> In this case, both ObJCObjectPointerType and ObjCProtocolQualifierNode are abstract.</div><div><br></div><div>class <b>ObjCObjectPointerType</b> : public Type { ... };</div><div><br></div><div>class <b>ObjCIdType</b> : public ObjCObjectPointerType { ... };</div><div>class <b>ObjCInterfacePointerType</b> : public ObjCObjectPointerType { ... };</div><div>class <b>ObjCClassType</b> : public ObjCObjectPointerType { ... };</div><div><br></div><div>class <b>ObjCProtocolQualifierNode</b> : public llvm::FoldingSetNode { ... };</div><div><br></div><div>class <b>ObjCQualifiedIdtype</b> : public ObjCIdType, public ObjCProtocolQualifierNode { ... };</div><div>class <b>ObjCQualifiedInterfacePointerType</b> : public ObjCInterfacePointerType, public ObjCProtocolQualifierNode { ... };</div><div>class <b>ObjCQualifiedClassType</b> : public ObjCClassType, public ObjCProtocolQualifierNode { ... };</div><div><br></div><div>This composition enables the "protocol-qualified" concept to be abstract too.</div><div><br></div><div>(I don't know the clang codebase enough to give ObJCProtocolQualifierNode a good name.)</div><div><br></div><div>  -- Chris</div><div><br></div></body></html>