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

             Bug #: 54293
           Summary: When a reference is bound to subobject of a temporary,
                    lifetime of the temporary is not extended
    Classification: Unclassified
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: ppluzhni...@google.com


Google reference: b/6996555

"ISO/IEC 14882:2011(E) 12.2.5 [class.temporary]

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: [etc]"

With gcc-4.6, the lifetime extension is not happening at all:

FAIL int
FAIL Obj

With gcc-4.7 and 4.8 (rev 190453), lifetime is extended for Obj subobject, but
not for 'int' (or 'char', or other primitive types):

FAIL int

The test:

#include <set>
#include <iostream>

std::set<const void*> subobjs;

template <typename T>
struct ValueHolder {
  explicit ValueHolder() {
    subobjs.insert(&v);
  }
  ~ValueHolder() {
    subobjs.erase(&v);
  }
  T v;
};

struct Obj { };

bool IsValid(const void* p) {
  return subobjs.find(p) != subobjs.end();
}

int main() {
  const int& ref_int = ValueHolder<int>().v;
  if (!IsValid(&ref_int)) {
    std::cout << "FAIL int" << std::endl;
  }

  const Obj& ref_obj = ValueHolder<Obj>().v;
  if (!IsValid(&ref_obj)) {
    std::cout << "FAIL Obj" << std::endl;
  }
}

Reply via email to