<div dir="ltr"><div dir="ltr">On Mon, 26 Oct 2020 at 16:57, Lewis, Cannada via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div style="overflow-wrap: break-word;">
I’m not a standards reading expert but does 
<div><br>
<div><i>Note <a href="https://eel.is/c++draft/expr.prim.lambda#capture-note-7" target="_blank">7</a></i>:
<div id="gmail-m_7254625266423515611capture-11.sentence-2">An <a href="https://eel.is/c++draft/expr.prim.id.general#nt:id-expression" title="7.5.4.1 General [expr.prim.id.general]" target="_blank">
<span id="gmail-m_7254625266423515611ntref:id-expression_____"><span><i>id-expression</i></span></span></a> that is not an odr-use refers to the original entity, never to a member of the closure type<a href="https://eel.is/c++draft/expr.prim.lambda#capture-11.sentence-2" target="_blank">.</a></div>
<div id="gmail-m_7254625266423515611capture-11.sentence-3">However, such an <a href="https://eel.is/c++draft/expr.prim.id.general#nt:id-expression" title="7.5.4.1 General [expr.prim.id.general]" target="_blank">
<span id="gmail-m_7254625266423515611ntref:id-expression______"><span><i>id-expression</i></span></span></a> can still cause the implicit capture of the entity<a href="https://eel.is/c++draft/expr.prim.lambda#capture-11.sentence-3" target="_blank">.</a></div>
— <i>end note</i></div>
<div><i><br>
</i></div>
<div>From the text imply that the program <a href="https://godbolt.org/z/feKxdK" target="_blank">
https://godbolt.org/z/feKxdK</a> is actually implementation defined? Or does gcc have a bug here? </div></div></div></blockquote><div><br></div><div>GCC has a bug, according to the standard wording. The mention of myfoo does not constitute an odr-use, so is not rewritten to use the capture. Clang's behavior is correct per the standard wording.</div><div><br></div><div>The standard rule is certainly surprising in this particular case. I think the rule in question is driven by the desire for adding a capture-default to a valid lambda to not change its meaning. For example: <a href="https://godbolt.org/z/nrWsvj">https://godbolt.org/z/nrWsvj</a></div><div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;"><div>
<div>-Drew  <br>
<div><br>
<blockquote type="cite">
<div>On Oct 26, 2020, at 4:33 PM, Hubert Tong <<a href="mailto:hubert.reinterpretcast@gmail.com" target="_blank">hubert.reinterpretcast@gmail.com</a>> wrote:</div>
<br>
<div>
<div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none">
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Mon, Oct 26, 2020 at 1:26 PM Lewis, Cannada via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>Hello, 
<div><br>
</div>
<div>We recently encountered an issue where clang has some unexpected behavior with respect to the capture of local references to global variables <a href="https://godbolt.org/z/KasP9K" target="_blank">https://godbolt.org/z/KasP9K</a>.</div>
<div><br>
</div>
<div>Most compilers (gcc, MSVC, icc) appear to create a member variable to hold the value of `myfoo` and have `dummy` return a size of 16.  Clang does not store a member for `myfoo` (in the AST there is no `FieldDecl` for `myfoo`). </div>
<div><br>
</div>
<div>This leads to the interesting issue here: <a href="https://godbolt.org/z/G59e7M" target="_blank">https://godbolt.org/z/G59e7M</a></div>
<div>Where clang and gcc will print out different values.  </div>
<div><br>
</div>
<div>I don’t know if this is a clang issue (known?), or a {gcc,icc,msvc} issue, or is implementation defined, but any insight on this would be welcome.   </div>
</div>
</blockquote>
<div>N4861 subclause 7.5.5.2 [expr.prim.lambda.capture] paragraph 11 seems to apply. The local entity being captured is a reference and it is not odr-used (see [basic.def.odr] paragraph 4).<br>
</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div><br>
</div>
<div>-Drew </div>
</div>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a></blockquote>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>

_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>