https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117509
Bug ID: 117509
Summary: False negative on -Wdangling-reference
Product: gcc
Version: 14.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: barry.revzin at gmail dot com
Target Milestone: ---
Here's another Optional-related example:
template <class T>
struct Optional {
union { T v; };
bool flag;
[[nodiscard]] auto value() && -> T&& { return (T&&)v; }
[[nodiscard]] auto operator*() && -> T&& { return (T&&)v; }
};
auto f() -> Optional<int>;
auto g() {
[[maybe_unused]] auto&& a = f().value(); // warns here
[[maybe_unused]] auto&& b = *f(); // no warning here
}
value() and operator*() are synonymous for the purpose of this issue - they're
both returning an rvalue reference to v. Both of them dangle here.
gcc gives me a warning on 'a', but not on 'b'. I tried various incantations of
[[gnu::nodangling]] to annotate operator*() to try to convince gcc that it does
actually dangle here, but to no avail.