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

            Bug ID: 114225
           Summary: False positive -Werror=dangling-reference
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: asharafutdinov at adalisk dot com
  Target Milestone: ---

#include <variant>

struct A
{
    int i;
};

struct Getter
{
    Getter(const A & a) : var(&a) {}
    const int & operator ()(const A * a) const { return a->i; }
    const int & value() const { return std::visit(*this, var); }
    std::variant<const A *> var;
};

int main()
{
    A a { .i = 1 };
    const auto & i = Getter{ a }.value();
    return i;
}

The code above produces an incorrect dangling reference warning with g++-13
-std=c++20 -Wall -Wextra -pedantic-errors:

<source>: In function 'int main()':
<source>:19:18: warning: possibly dangling reference to a temporary
[-Wdangling-reference]
   19 |     const auto & i = Getter{ a }.value();
      |                  ^
<source>:19:39: note: the temporary was destroyed at the end of the full
expression 'Getter(a).Getter::value()'
   19 |     const auto & i = Getter{ a }.value();
      |                      ~~~~~~~~~~~~~~~~~^~

Reply via email to