[cfe-dev] [Bug] Destructor of temporary objects bound to reference variable not called in expected order.

suyog sarda sardask01 at gmail.com
Tue Jul 1 02:22:41 PDT 2014


Hi,

This is a gcc test case






















*extern "C" int printf (const char *, ...);int c;int r;struct A{  A() {
printf ("A()\n"); if (c++) r = 1; }  A(const A&) { printf ("A(const
A&)\n"); ++c; }  ~A() { printf ("~A()\n"); --c; }};struct B{  B(int, const
A& = A()) { printf ("B()\n"); }};int main(){  B b[] = { 0, 1 };  return r;}*

Output from Clang (latest trunk):






*A()B()A()B()~A()~A()*

Output from gcc 4.8 :






*A()B()~A()A()B()~A() *

As we can see, the destructor of temporary objects are not called
immediately in case of clang.
The temporary A passed to the constructor for b[0] should have been
destroyed before going on to construct b[1].

According to standards,

The temporary to which the reference is bound or the temporary that is the
complete object of a subobject to which the reference is bound persists for
the lifetime of the reference except:
-- A temporary bound to a reference member in a constructor's
ctor-initializer ( 12.6.2) persists until the constructor exits.
-- A temporary bound to a reference parameter in a function call ( 5.2.2)
persists until the completion of the full-expression containing the call.

So even though A's temporary is bound to reference, it should get destroyed
as soon as b[0] gets constructed before going forward to construct b[1].

This seems similar to http://llvm.org/bugs/show_bug.cgi?id=16476

Richard, any comment/help on this from you will be most welcomed (Since bug
16476 was filed by you :)). Does this require major change in code and
handling of temporaries?

Is this also related to
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1634 ?


-- 
With regards,
Suyog Sarda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140701/cf6ed511/attachment.html>


More information about the cfe-dev mailing list