When a static const reference bound is bound to a temporary, the temporary is
destroyed when the enclosing function exits. The lifetime of the temporary
should (I believe) be the same as that of the reference.

The program below illustrates the problem. The bug did not occur with 3.2.1,
3.2.3 or 3.3. It occurs with 3.3.1, 3.3.5, 3.4.1, 3.4.3 and a cvs checkout of
gcc-4_0-branch.

Command line and output:
--------------------------------------
$ g++ -v -save-temps lifetime.cpp
Reading specs from /usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/specs
Configured with: ../gcc-3.4.3/configure --exec-prefix=/usr/local/gcc-3.4.3
--prefix=/usr/local/gcc-3.4.3 --enable-threads --enable-languages=c,c++
Thread model: posix
gcc version 3.4.3
 /usr/local/gcc-3.4.3/libexec/gcc/i686-pc-linux-gnu/3.4.3/cc1plus -E -quiet -v
-D_GNU_SOURCE lifetime.cpp -mtune=pentiumpro -o lifetime.ii
ignoring nonexistent directory
"/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 
/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/../../../../include/c++/3.4.3
 
/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/../../../../include/c++/3.4.3/i686-pc-linux-gnu
 
/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/../../../../include/c++/3.4.3/backward
 /usr/local/include
 /usr/local/gcc-3.4.3/include
 /usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/include
 /usr/include
End of search list.
 /usr/local/gcc-3.4.3/libexec/gcc/i686-pc-linux-gnu/3.4.3/cc1plus -fpreprocessed
lifetime.ii -quiet -dumpbase lifetime.cpp -mtune=pentiumpro -auxbase lifetime
-version -o lifetime.s
GNU C++ version 3.4.3 (i686-pc-linux-gnu)
  compiled by GNU C version 3.4.3.
GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32080
 as -V -Qy -o lifetime.o lifetime.s
GNU assembler version 2.11.93.0.2 (i386-redhat-linux) using BFD version
2.11.93.0.2 20020207
 /usr/local/gcc-3.4.3/libexec/gcc/i686-pc-linux-gnu/3.4.3/collect2
--eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o
/usr/lib/crti.o /usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/crtbegin.o
-L/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3
-L/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/../../.. lifetime.o
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/local/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/crtend.o /usr/lib/crtn.o
--------------------------------------

Preprocessed output:
--------------------------------------
# 1 "lifetime.cpp"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "lifetime.cpp"
extern "C" int puts(const char*);

class Foo
{
public:
  Foo() { puts("Foo()"); }
  Foo(const Foo&) { puts("Foo(const Foo&)"); }
  ~Foo() { puts("~Foo()"); }
};

Foo get_foo()
{
  return Foo();
}

void func()
{
  static const Foo& t = get_foo();
}

int main()
{
  puts("Before func call 1");
  func();
  puts("After func call 1");

  puts("Before func call 2");
  func();
  puts("After func call 2");

  return 0;
}
--------------------------------------

Program output:
--------------------------------------
Before func call 1
Foo()
~Foo()
After func call 1
Before func call 2
~Foo()
After func call 2
--------------------------------------

Expected program output (produced by intel C++ 7.0):
--------------------------------------
Before func call 1
Foo()
After func call 1
Before func call 2
After func call 2
~Foo()
--------------------------------------

-- 
           Summary: Incorrect lifetime for temporary with static const
                    reference
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: cmkyahoo-gccbugzilla at yahoo dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20416

Reply via email to