// PR c++/107532
// { dg-do compile { target c++11 } }
// { dg-options "-Wdangling-reference" }
struct Plane { unsigned int bytesused; };
// Passes a reference through. Does not change lifetime.
template <typename T>
struct Ref {
const T& i_;
Ref(const T & i) : i_(i) {}
const T & inner();
};
struct FrameMetadata {
Ref<const Plane> planes() const { return p_; }
Plane p_;
};
void bar(const Plane & meta);
void foo(const FrameMetadata & fm)
{
const Plane & meta = fm.planes().inner();
bar(meta);
const Plane & meta2 = FrameMetadata().planes().inner(); // { dg-warning "dangling reference" }
bar(meta2);
}
struct S {
const S& self () { return *this; }
} s;
const S& r1 = s.self();
const S& r2 = S().self(); // { dg-warning "dangling reference" }
struct D {
};
struct C {
D d;
Ref<const D> get() const { return d; }
};
struct B {
C c;
const C& get() const { return c; }
B();
};
struct A {
B b;
const B& get() const { return b; }
};
void
g (const A& a)
{
const auto& d1 = a.get().get().get().inner();
(void) d1;
const auto& d2 = A().get().get().get().inner(); // { dg-warning "dangling reference" }
(void) d2;
const auto& d3 = A().b.get().get().inner(); // { dg-warning "dangling reference" }
(void) d3;
const auto& d4 = a.b.get().get().inner();
(void) d4;
const auto& d5 = a.b.c.get().inner();
(void) d5;
const auto& d6 = A().b.c.get().inner(); // { dg-warning "dangling reference" }
(void) d6;
Plane p;
Ref<Plane> r(p);
const auto& d7 = r.inner();
(void) d7;
const auto& d8 = Ref<Plane>(p).inner();
(void) d8;
}