<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div><div>On Sep 18, 2013, at 1:52 PM, Eli Friedman <<a href="mailto:eli.friedman@gmail.com">eli.friedman@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">On Tue, Sep 17, 2013 at 8:08 PM, jahanian <span dir="ltr"><<a href="mailto:fjahanian@apple.com" target="_blank">fjahanian@apple.com</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">Can you elaborate what got fixed. Are we matching gcc's behavior? I see that it is<br>
currently ""{E=^^?i^^?ii^^?}" for this test case.<br></blockquote><div><br></div><div>The patch fixes an assertion failure, and also nonsensical output when assertions are turned off.  (The encoding is supposed to match the layout of the class, and the class has two vptrs, not three.)<br></div></div></div></div></blockquote><div><br></div>Ok. Thanks.</div><div>- Fariborz</div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>
<br></div><div>-Eli<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
- Fariborz<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Sep 17, 2013, at 6:59 PM, Eli Friedman <<a href="mailto:eli.friedman@gmail.com">eli.friedman@gmail.com</a>> wrote:<br>
<br>
> Author: efriedma<br>
> Date: Tue Sep 17 20:59:16 2013<br>
> New Revision: 190912<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=190912&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=190912&view=rev</a><br>
> Log:<br>
> Fix ObjC @encode for C++ classes w/virtual bases.<br>
><br>
> PR17142.<br>
><br>
> Modified:<br>
>    cfe/trunk/lib/AST/ASTContext.cpp<br>
>    cfe/trunk/test/CodeGenObjCXX/<a href="http://encode.mm/" target="_blank">encode.mm</a><br>
><br>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=190912&r1=190911&r2=190912&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=190912&r1=190911&r2=190912&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)<br>
> +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Sep 17 20:59:16 2013<br>
> @@ -5552,7 +5552,8 @@ void ASTContext::getObjCEncodingForStruc<br>
>       if (base->isEmpty())<br>
>         continue;<br>
>       uint64_t offs = toBits(layout.getVBaseClassOffset(base));<br>
> -      if (FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())<br>
> +      if (offs >= uint64_t(toBits(layout.getNonVirtualSize())) &&<br>
> +          FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())<br>
>         FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),<br>
>                                   std::make_pair(offs, base));<br>
>     }<br>
><br>
> Modified: cfe/trunk/test/CodeGenObjCXX/<a href="http://encode.mm/" target="_blank">encode.mm</a><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/encode.mm?rev=190912&r1=190911&r2=190912&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/encode.mm?rev=190912&r1=190911&r2=190912&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGenObjCXX/<a href="http://encode.mm/" target="_blank">encode.mm</a> (original)<br>
> +++ cfe/trunk/test/CodeGenObjCXX/<a href="http://encode.mm/" target="_blank">encode.mm</a> Tue Sep 17 20:59:16 2013<br>
> @@ -214,3 +214,13 @@ public:<br>
> }<br>
> @end<br>
> // CHECK: internal global [41 x i8] c"{dynamic_class=\22_vptr$dynamic_class\22^^?}\00"<br>
> +<br>
> +namespace PR17142 {<br>
> +  struct A { virtual ~A(); };<br>
> +  struct B : virtual A { int y; };<br>
> +  struct C { virtual ~C(); int z; };<br>
> +  struct D : C, B { int a; };<br>
> +  struct E : D {};<br>
> +  // CHECK: @_ZN7PR171421xE = constant [14 x i8] c"{E=^^?i^^?ii}\00"<br>
> +  extern const char x[] = @encode(E);<br>
> +}<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
</div></div></blockquote></div><br></div></div>
</blockquote></div><br></body></html>