<div dir="ltr">On Thu, Jul 11, 2013 at 9:45 AM, Stephen Lin <span dir="ltr"><<a href="mailto:swlin@post.harvard.edu" target="_blank">swlin@post.harvard.edu</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">> I was about to answer the same thing, but hesitated. I know COM avoids<br>
> use virtual inheritance, and I think I've heard somebody say it's for<br>
> portability.<br>
><br>
> But the vtable ABI isn't standardized either, is it? Do all compilers<br>
> just happen to implement it the same way?<br>
><br>
<br>
</div>All compilers that allow C++ to implement COM objects must implement<br>
virtual tables (but not, for example, name mangling) in the same way<br>
for COM ABI compatibility; I was wondering if Clang did so already or<br>
not.<br></blockquote><div><br></div><div style>Personally, I've never tried and I don't have any test code for this handy.  Some things that are probably broken that would affect COM:</div><div style><br></div><div style>
- Record layout.  Warren has a patch for this.  One of the big things is the alignment of all the non-vfptr fields.  These appear to be laid out as though there is a parent struct with a vfptr and then an anonymous struct containing all the fields.  If the object doesn't contain any fields with more than pointer alignment, this shouldn't matter.</div>
<div style><br></div><div style>- Virtual method calls with multiple inheritance.  Timur has a patch for this.  The big change is that there are fewer thunks because the 'this' pointer on entry is adjusted to point at the vfptr used to perform the dispatch.  If you don't implement multiple interfaces, this shouldn't matter.</div>
<div style><br></div><div style>- Outside the scope of COM, things like virtual inheritance and virtual destructors are broken still.</div><div style><br></div><div style>Those are some pretty big caveats, so I assume COM interop is broken until tested.</div>
</div></div></div>