blob: ec5075482c455d0e10e557c3ef6126e98f8eec10 (
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" }
template <typename T>
struct Span {
T* data_;
int len_;
~Span();
[[nodiscard]] constexpr auto operator[](int n) const noexcept -> T& { return data_[n]; }
};
template <>
struct [[gnu::no_dangling]] Span<int> {
int* data_;
int len_;
~Span();
[[nodiscard]] constexpr auto operator[](int n) const noexcept -> int& { return data_[n]; }
};
auto getch() -> Span<char>;
auto geti() -> Span<int>;
void
f ()
{
[[maybe_unused]] const auto &a = getch()[0]; // { dg-warning "dangling reference" }
[[maybe_unused]] const auto &b = geti()[0]; // { dg-bogus "dangling reference" }
}
|