aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/ext/attr-no-dangling7.C
blob: 3c392ed409f84f9ca0bdccc9cdb902b0c3ad6f72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// PR c++/110358
// { dg-do compile { target c++20 } }
// { dg-options "-Wdangling-reference" }

class X { };
const X x1;
const X x2;

template<bool... N>
[[gnu::no_dangling(N)]] const X& get(const int& i); // { dg-error "parameter packs not expanded" }

template<typename T>
[[gnu::no_dangling(T::x)]] // { dg-error "member" }
const X& foo(const int& i);

bool val () { return true; }

[[gnu::no_dangling(val ())]]   // { dg-error "call" }
const X& bar (const int& i);

[[gnu::no_dangling(20)]] const X& fn1 (const int &);

void
test ()
{
  [[maybe_unused]] const X& x1 = bar (10);	  // { dg-warning "dangling" }
  [[maybe_unused]] const X& x2 = foo<int> (10);	  // { dg-error "no matching" }
  [[maybe_unused]] const X& x3			  // { dg-warning "dangling" }
    = fn1 (10);					  // { dg-error "narrowing" }
}