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

            Bug ID: 121122
           Summary: -Wdangling-reference false postitive when adding a
                    non-dangling reference to the mix
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: b.stanimirov at abv dot bg
  Target Milestone: ---

I reproduce this without fail on gcc 13 to trunk (as of this post)

This code expectedly produces no warnings:

```
struct vec { int x, y; };
struct generator {
    const vec a;
    generator(const vec& a) 
        : a(a) 
    {}

    struct iterator {
        const vec a;
        int i;
        iterator(const vec& a) : a(a) {
            i = a.x;
        }

        iterator& operator++() {
            ++i;
            return *this;
        }

        int operator*() const {
            return i;
        }

        bool operator==(const iterator& b) const { return i == b.i; }
        bool operator!=(const iterator& b) const { return i != b.i; }
    };

    iterator begin() const { return {a}; }
    iterator end() const { return {vec{a.y, a.y}}; }
};

generator generate(const vec& v) {
    return {v};
}

int loop() {
    int sum = 0;
    for (auto i : generate({1, 2})) {
        sum += i;
    }
    return sum;
}
```

Compiler explorer: https://godbolt.org/z/xf1P5ecWj

I then add another reference to the mix, which is most definitely not dangling
(even less dangling than the already-not-dangling temporary):

```
struct vec { int x, y; };
struct generator {
    const vec& ref;  // HERE!!!!!
    const vec a;
    generator(const vec& ref, const vec& a) 
        : ref(ref) // HERE!!!!!
        , a(a) 
    {}

    struct iterator {
        const vec a;
        int i;
        iterator(const vec& a) : a(a) {
            i = a.x;
        }

        iterator& operator++() {
            ++i;
            return *this;
        }

        int operator*() const {
            return i;
        }

        bool operator==(const iterator& b) const { return i == b.i; }
        bool operator!=(const iterator& b) const { return i != b.i; }
    };

    iterator begin() const { return {a}; }
    iterator end() const { return {vec{a.y, a.y}}; }
};

generator generate(const vec& r, const vec& v) {
    return {r, v};
}

int loop() {
    const vec vv = {0, 0}; // HERE!!!!!
    int sum = 0;
    for (auto i : generate(vv, {1, 2})) {
        sum += i;
    }
    return sum;
}
```

And I get -Wdangling-reference

Compiler explorer with bug: https://godbolt.org/z/6Gsxj5xcr

Reply via email to