Okay, with the week-end I have been able to look at this issue a bit more in-depth:<br><br>So, the first issue is:<br><br><div style="margin-left: 40px;">struct S {<br>  int array[32];<br>};<br><br>S value() { return S(); }<br>
<br>S const& return_temporary() {<br>  return value();<br>}<br></div><br>The return statement yields the following AST:<br><br>          <ReturnStmt file="f2" line="9" col="3" endcol="16"><br>
            <ImplicitCastExpr file="f2" line="9" col="10" endcol="16" type="_17"><br>              <CallExpr file="f2" line="9" col="10" endcol="16" type="_8" num_args="0"><br>
                <ImplicitCastExpr file="f2" line="9" col="10" type="_1E"><br>                  <DeclRefExpr file="f2" line="9" col="10" type="_1A" ref="_18" name="value"/><br>
                </ImplicitCastExpr><br>              </CallExpr><br>            </ImplicitCastExpr><br>          </ReturnStmt><br><br>However `static DeclRefExpr* EvalVal(Expr *E)` in SemaChecking.cpp (line 1979) does not handle `CallExpr` (or CXXOperatorCallExpr or CXXMemberCallExpr for that matter)<br>
<br>I was thinking about adding a case in the switch:<br><br><div style="margin-left: 40px;">  case Stmt::CallExprClass:<br>  case Stmt::CXXMemberCallExprClass:<br>  case Stmt::CXXOperatorCallExprClass: {<br>    // Functions / Methods / Operators<br>
    // that return a pointer or prvalue<br>    CallExpr* CE = cast<CallExpr>(E);<br>    if (!CE->getCallReturnType()->isReferenceType()) {<br>      return CE;<br>    }<br>    return NULL;<br>  }<br></div><br>since at the moment it's not handled at all. However there are MANY possible kinds for Type, so I am quite puzzled when it comes to figuring out which ones are okay and which are not... Furthermore there is it seems the issue of `typedef` which might embed a reference within and that we'll need to account for.<br>
<br><br>Regarding the second issue:<br><br><div style="margin-left: 40px;">S const& return_bounded_temporary() {<br>  S const& bind = value();<br>  return bind;<br>}<br></div><br>This returns the following AST:<br>
<br>          <ReturnStmt file="f2" line="10" col="3" endcol="10"><br>            <DeclRefExpr file="f2" line="10" col="10" type="_17" ref="_1D" name="bind"/><br>
          </ReturnStmt><br><br>So there is no indication here that the reference variable has bounded a temporary at all, I would have expected something like CXXBindTemporaryExpr.<br><br><br>Comments are welcome :)<br>
<br><br><div class="gmail_quote">2010/9/16 Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div style="word-wrap: break-word;">No it doesn't.  There is active work on this front, but no ETA right now.<div><div></div><div class="h5"><div><br><div><div>On Sep 15, 2010, at 3:18 PM, Alexei Svitkine wrote:</div>
<br><blockquote type="cite">Does the analyzer support C++ now?<div><br></div><div>-Alexei<br><br><div class="gmail_quote">On Wed, Sep 15, 2010 at 5:25 PM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com" target="_blank">kremenek@apple.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div><br>
On Sep 15, 2010, at 1:13 PM, Eli Friedman wrote:<br>
<br>
> On Wed, Sep 15, 2010 at 12:58 PM, Matthieu Monrocq<br>
> <<a href="mailto:matthieu.monrocq@gmail.com" target="_blank">matthieu.monrocq@gmail.com</a>> wrote:<br>
>> Therefore it seems that the proper thing to do would be to diagnose the<br>
>> issue (in both get_reference_no_warning cases) and let the developer fix<br>
>> them. I surmise it should be possible to detect them (since VC++ already<br>
>> detects the first case), but then, as I said, I am very naive about<br>
>> compilers yet.<br>
>><br>
>> I hope to look at this further during the week-end, guess it would be as<br>
>> good a way as any to try and understand how Clang work<br>
><br>
> Yes, we should be able to diagnose both cases... the relevant code is<br>
> Sema::CheckReturnStackAddr in SemaChecking.cpp.<br>
><br>
> -Eli<br>
<br>
</div>I'll fix this.  It will be good for me (after being confused about this one).<br>
<div><div></div><div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div>
</blockquote></div><br></div></div></div></div></blockquote></div><br>