<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 15, 2014 at 4:32 PM, Herb Sutter <span dir="ltr">&lt;<a href="mailto:hsutter@microsoft.com" target="_blank">hsutter@microsoft.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div><div class="im">
<p class="MsoNormal">I would expect that that we would have consensus that the lifetime of an object of type D *should* start at some point in this code (and more specifically that the code has defined behavior):<u></u><u></u></p>

<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">  B *p = (B*)malloc(sizeof(B));<u></u><u></u></p>
<p class="MsoNormal">  p-&gt;i = 0;<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
</div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">(blink) D is not even mentioned, so why would we expect that? Can you explain?</span></p></div>
</div></blockquote><div><br></div><div>Sorry, editing error, I meant &#39;B&#39; here.</div><div><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:11pt"> </span></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div lang="EN-US" link="blue" vlink="purple"><div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d">If the standard said the lifetime of a D object started somewhere here, I would wonder if there’s a defect in the lifetime wording. That would seem to violate
 sensible notions of type safety.</span></p></div></div></blockquote><div><br></div><div>Playing devil&#39;s advocate again: it would be entirely unobservable whether an object of type &#39;B&#39; or &#39;D&#39; actually had its lifetime start here. Why would you be surprised if you got a &#39;D&#39; instead of a &#39;B&#39;? Indeed, if later I wrote:</div>
<div><br></div><div>D *q = (D*)p; // ha ha, it was a D object the whole time!</div><div>int n = q-&gt;i;</div><div><br></div><div>... why should that /not/ work? How is this any different from if I cast to D* before I used the object as a B?</div>
<div><a name="143987ef66270065__MailEndCompose"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1f497d"> </span></a></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div lang="EN-US" link="blue" vlink="purple"><div>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">From:</span></b><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"> <a href="mailto:ub-bounces@open-std.org" target="_blank">ub-bounces@open-std.org</a> [mailto:<a href="mailto:ub-bounces@open-std.org" target="_blank">ub-bounces@open-std.org</a>]
<b>On Behalf Of </b>Richard Smith<br>
<b>Sent:</b> Wednesday, January 15, 2014 3:09 PM</span></p><div><div class="h5"><br>
<b>To:</b> WG21 UB study group<br>
<b>Subject:</b> Re: [ub] type punning through congruent base class?<u></u><u></u></div></div><p></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">On Wed, Jan 15, 2014 at 1:48 PM, Herb Sutter &lt;<a href="mailto:hsutter@microsoft.com" target="_blank">hsutter@microsoft.com</a>&gt; wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div name="divtagdefaultwrapper">
<p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">Richard, I&#39;m not sure I understand your position... Given the following complete program ...<u></u><u></u></span></p>
<p><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  struct B { int i; };<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  struct D : B { };<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  int main() {<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">    B b; // line X<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  }<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">... are you actually saying that line X starts the lifetime of an object of type D? or just setting up a strawman? (Sorry, I really couldn&#39;t tell.)<u></u><u></u></span></p>

</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">If yes, then given the following complete program ...<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"><u></u> <u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  struct C { long long i; };<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  int main() {<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">    C c; // line Y<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  }<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">... are you saying that line Y could start the lifetime of an object of type D (which is not mentioned in the code), double, shared_ptr&lt;widget&gt;, or any other type than C, as long as the size
 of that other type is the same or less than sizeof(C)?<u></u><u></u></span></p>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I think my position is more nuanced. There are a set of cases that I think people expect to have defined behavior, and the standard does not currently distinguish those cases from your cases above, as far as I can tell -- if using malloc
 to create an object &quot;with trivial initialization&quot; is acceptable, then it appears that *any* way of producing the appropriately-sized-and-aligned storage is acceptable.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I would expect that that we would have consensus that the lifetime of an object of type D *should* start at some point in this code (and more specifically that the code has defined behavior):<u></u><u></u></p>

</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">  B *p = (B*)malloc(sizeof(B));<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  p-&gt;i = 0;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I would expect to also have consensus that the same is true here:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">  alignof(B) char buffer[sizeof(B)];<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  B *p = (B*)buffer;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  p-&gt;i = 0;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(These expectations are based on the vast amount of existing code that relies upon these behaviors, not on the wording of the standard.)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">So, that&#39;s &quot;what people probably expect&quot;. Next, &quot;what the standard says&quot;. Consider 3.8/1:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">&quot;The lifetime of an object of type T begins when:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">— storage with the proper alignment and size for type T is obtained, and<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">— if the object has non-trivial initialization, its initialization is complete.&quot;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">This requires us to answer three questions: (1) is there an object of type B in the above snippets, (2) when is storage for it obtained, and (3) does it have non-trivial initialization? It seems that &quot;yes, before the storage is used as
 an object of type B, no&quot; is a self-consistent set of answers, and one that gives the program defined behavior. There are also sets of answers that give the program undefined behavior, and the standard doesn&#39;t give us direction in how we might pick a set of
 answers to these questions.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">There seem to be two obvious ways forward: either (a) if we can pick answers to these questions such that the program has defined behavior, then the program has defined behavior, or (b) if we can pick answers to these questions such that
 the program has undefined behavior, then the program has undefined behavior.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">If we want to align &quot;what people probably expect&quot; with &quot;what the standard says&quot;, it seems we need to either change the above rule, or accept interpretation (a), under which the program above is valid, as is any other program where &#39;buffer&#39;
 obtains storage of the appropriate size and alignment for an object of type D. (Option (a) also matches the behavior of current optimizing compilers, as far as I&#39;m aware.)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I&#39;ve spent quite some time thinking about and discussing this problem and related issues (such as, under what circumstances does a pointer point to an object, when do two pointers alias, ...), and I personally think that the best approach
 here is to embrace option (a) above: if there exist a consistent set of choices of object lifetimes such that the program has defined behavior, then the program has the behavior implied by that set. (I have a sketch proof that such behavior is the same for
 *every* such consistent set, aside from deviations caused by unspecified values and other pre-existing sources of nondeterminism.) In essence, the implication of this is that objects&#39; lifetimes would start just in time to avoid undefined behavior.<u></u><u></u></p>

</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Put another way, yes, I personally think this code should have defined behavior:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">C c; // #1<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">static_assert(sizeof(C) &gt;= sizeof(D) &amp;&amp; alignof(C) &gt;= alignof(D), &quot;&quot;);<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">D *p = (D*)&amp;c;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">d-&gt;i = 0; // #2<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">... and the lifetime of a D object at address &amp;c should start at some point between lines #1 and #2. (Naturally, the lifetime of the C object ended before this happened.) Moreover, this is something that plenty of existing C++ code relies
 on.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div name="divtagdefaultwrapper">
<div>
<div>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">From:</span></b><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;">
<a href="mailto:ub-bounces@open-std.org" target="_blank">ub-bounces@open-std.org</a> &lt;<a href="mailto:ub-bounces@open-std.org" target="_blank">ub-bounces@open-std.org</a>&gt; on behalf of Richard Smith &lt;<a href="mailto:richardsmith@google.com" target="_blank">richardsmith@google.com</a>&gt;<br>

<b>Sent:</b> Monday, January 6, 2014 3:44 PM<u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;"><br>
<b>To:</b> WG21 UB study group<br>
<b>Subject:</b> Re: [ub] type punning through congruent base class?<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"> <u></u><u></u></span></p>
</div>
</div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">On Mon, Jan 6, 2014 at 10:22 AM, Jason Merrill &lt;<a href="mailto:jason@redhat.com" target="_blank">jason@redhat.com</a>&gt; wrote:<u></u><u></u></span></p>

<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">On 01/06/2014 04:26 AM, Fabio Fracassi wrote:<br>
&gt; if it is not (legal): could we make it legal or would we run afoul of<br>
&gt; the aliasing rules?<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">The access is not allowed by the aliasing rules in 3.10.  But it seems<br>
that this would be:<u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><br>
struct B {<br>
   int i;<br>
};<br>
<br>
struct D {<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">   B bmem;<br>
   void foo() { /* access bmem.i */ }<br>
};<br>
<br>
B b;<br>
reinterpret_cast&lt;D&amp;&gt;(b).foo();<br>
<br>
because B is a non-static data member of D, and 9.2/19 guarantees that<br>
the address of D::bmem is the same as the address of the D object.<u></u><u></u></span></p>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">How is that fundamentally different? 9.3.1/2 makes that UB too, if &#39;reinterpret_cast&lt;D&amp;&gt;(b)&#39; does not refer to an object of type &#39;b&#39;. And within D::foo, the implicit this-&gt;bmem
 would have the same problem.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">If I might play devil&#39;s advocate for a moment...<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  struct B { int i; };<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  struct D : B {<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">    void foo();<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  };<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  B b;<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">I claim this line starts the lifetime of an object of type D. Per [basic.life]p1, the lifetime of an object of type &#39;D&#39; begins when storage with the proper alignment and size
 for type T is obtained (which &quot;B b&quot; happens to satisfy). The object does not have non-trivial initialization, so the second bullet does not apply.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">(This is the same argument that makes this valid:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  D *p = (D*)malloc(sizeof(D));<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  p-&gt;foo();<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">... so any counterargument will need to explain why the two cases are fundamentally different.)<u></u><u></u></span></p>

</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">Then:<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">  reinterpret_cast&lt;D&amp;&gt;(b).foo();<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#282828">... is valid, because the cast produces the same memory address, and that memory address contains an object of type &#39;D&#39; (as claimed above).<u></u><u></u></span></p>

</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
ub mailing list<br>
<a href="mailto:ub@isocpp.open-std.org" target="_blank">ub@isocpp.open-std.org</a><br>
<a href="http://www.open-std.org/mailman/listinfo/ub" target="_blank">http://www.open-std.org/mailman/listinfo/ub</a><u></u><u></u></p>
</blockquote>
</div>
</div>
</div>
</div></div></div>
</div>
</div>

<br>_______________________________________________<br>
ub mailing list<br>
<a href="mailto:ub@isocpp.open-std.org">ub@isocpp.open-std.org</a><br>
<a href="http://www.open-std.org/mailman/listinfo/ub" target="_blank">http://www.open-std.org/mailman/listinfo/ub</a><br>
<br></blockquote></div><br></div></div>