https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111607

            Bug ID: 111607
           Summary: False positive -Wdangling-reference
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fiesh at zefix dot tv
  Target Milestone: ---

The following code triggers a `-Wdangling-reference` warning:

t.cpp: In function ‘consteval auto f(const V&)’:
t.cpp:19:22: warning: possibly dangling reference to a temporary
[-Wdangling-reference]
   19 |         auto const & s = std::visit([](auto const & v) -> S const & {
return v.s; }, v);
      |                      ^
t.cpp:19:36: note: the temporary was destroyed at the end of the full
expression ‘std::visit<f(const V&)::<lambda(const auto:31&)>, const
variant<A>&>(<lambda closure object>f(const V&)::<lambda(const auto:31&)>(), (*
& v))’
   19 |         auto const & s = std::visit([](auto const & v) -> S const & {
return v.s; }, v);
      |                         
~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




#include <variant>

struct S {
        constexpr S(int i_) : i(i_) {}
        S(S const &) = delete;
        S & operator=(S const &) = delete;
        S(S &&) = delete;
        S & operator=(S &&) = delete;
        int i;
};

struct A {
        S s{0};
};

using V = std::variant<A>;

consteval auto f(V const & v) {
        auto const & s = std::visit([](auto const & v) -> S const & { return
v.s; }, v);
        return s.i;
}

int main() {
        constexpr V a{std::in_place_type<A>};
        constexpr auto i = f(a);
        return i;
}


It makes sure the warning is wrong though by

* having S be non-copyable
* evaluating everything at compile time where UB is not allowed to happen

Reply via email to