1 // PR c++/66477
2 // { dg-do compile { target c++11 } }
3
ga4 struct a { constexpr bool g() const { return true; } };
g(a &)5 constexpr bool g(a&) { return true;}
h(a)6 constexpr bool h(a) { return true;}
7
8 a a1;
9 a& ar = a1;
10
f(a ap,a & arp)11 void f(a ap, a& arp)
12 {
13 a a2;
14 a& ar2 = a2;
15
16 // Most of these are OK because no data is actually loaded.
17 static_assert (a1.g(),"");
18 static_assert (g(a1),"");
19 static_assert (h(a1),"");
20
21 static_assert (a2.g(),"");
22 static_assert (g(a2),"");
23 static_assert (h(a2),"");
24
25 static_assert (ap.g(),"");
26 static_assert (g(ap),"");
27 static_assert (h(ap),"");
28
29 static_assert (ar.g(),"");
30 static_assert (g(ar),"");
31 static_assert (h(ar),"");
32
33 // But these are specifically prohibited in [expr.const]/4.12:
34 // * an id-expression that refers to a variable or data member of reference
35 // type unless the reference has a preceding initialization and either
36 // ** it is usable in constant expressions or
37 // ** its lifetime began within the evaluation of e;
38
39 static_assert (ar2.g(),""); // { dg-error "constant" }
40 static_assert (g(ar2),""); // { dg-error "constant" }
41 static_assert (h(ar2),""); // { dg-error "constant" }
42
43 static_assert (arp.g(),""); // { dg-error "constant" }
44 static_assert (g(arp),""); // { dg-error "constant" }
45 static_assert (h(arp),""); // { dg-error "constant" }
46 }
47