<p dir="ltr"><br>
On Mar 14, 2015 6:25 PM, "Tim Northover" <<a href="mailto:t.p.northover@gmail.com">t.p.northover@gmail.com</a>> wrote:<br>
><br>
> On 14 March 2015 at 17:55, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
> > I assume there's a bit more to it than this - otherwise we would've<br>
> > discovered it earlier? Which compiler is rejecting this code? Do you have a<br>
> > reduced example of something that clang accepts and this other compiler<br>
> > rejects?<br>
><br>
> Probably RVO related. The problematic constructor (and it does seem<br>
> pointless) is only invoked if an actual copy is needed. Clang takes<br>
> advantage of RVO even at -O0 and only ever calls<br>
> llvm::IntrusiveRefCntPtr<clang::ExternalSemaSource>::IntrusiveRefCntPtr(clang::ExternalSemaSource*).<br>
><br>
> If so, I suspect LLVM does need to be changed to work on compilers<br>
> without RVO too (the standard says implementations *may* perform that<br>
> optimisation, not that they must).</p>
<p dir="ltr">Clang is pretty good about warning about the technical use of those functions even if nrvo kicks in and they're never actually needed - older versions of gcc used to not do this checking, but to I believe now even gcc catches this.</p>
<p dir="ltr"> There may be some holes here, of course...</p>
<p dir="ltr">><br>
> I'd be interested to know what this other compiler was, too.<br>
><br>
> Tim.<br>
</p>