c++: -Wdangling-reference with reference wrapper [PR107532]
[official-gcc.git] / gcc / testsuite / g++.dg / warn / Wdangling-reference8.C
blob330de1fd05ddc36f9f596d5420f0bad051360edf
1 // PR c++/107532
2 // { dg-do compile { target c++11 } }
3 // { dg-options "-Wdangling-reference" }
5 struct Plane { unsigned int bytesused; };
7 // Passes a reference through. Does not change lifetime.
8 template <typename T>
9 struct Ref {
10     const T& i_;
11     Ref(const T & i) : i_(i) {}
12     const T & inner();
15 struct FrameMetadata {
16     Ref<const Plane> planes() const { return p_; }
18     Plane p_;
21 void bar(const Plane & meta);
22 void foo(const FrameMetadata & fm)
24     const Plane & meta = fm.planes().inner();
25     bar(meta);
26     const Plane & meta2 = FrameMetadata().planes().inner(); // { dg-warning "dangling reference" }
27     bar(meta2);
30 struct S {
31   const S& self () { return *this; }
32 } s;
34 const S& r1 = s.self();
35 const S& r2 = S().self(); // { dg-warning "dangling reference" }
37 struct D {
40 struct C {
41   D d;
42   Ref<const D> get() const { return d; }
45 struct B {
46   C c;
47   const C& get() const { return c; }
48   B();
51 struct A {
52   B b;
53   const B& get() const { return b; }
56 void
57 g (const A& a)
59   const auto& d1 = a.get().get().get().inner();
60   (void) d1;
61   const auto& d2 = A().get().get().get().inner(); // { dg-warning "dangling reference" }
62   (void) d2;
63   const auto& d3 = A().b.get().get().inner(); // { dg-warning "dangling reference" }
64   (void) d3;
65   const auto& d4 = a.b.get().get().inner();
66   (void) d4;
67   const auto& d5 = a.b.c.get().inner();
68   (void) d5;
69   const auto& d6 = A().b.c.get().inner(); // { dg-warning "dangling reference" }
70   (void) d6;
71   Plane p;
72   Ref<Plane> r(p);
73   const auto& d7 = r.inner();
74   (void) d7;
75   const auto& d8 = Ref<Plane>(p).inner();
76   (void) d8;