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

--- Comment #2 from Corey Kosak <gnu at kosak dot com> ---
Thanks for the reply and the correction about illegally running the destructor.

As for why the compiler can't do the optimization itself, I don't know, but the
optimization isn't applied here either:

```
void func(bool &b) {
    if (b) {
        b = false;
    }
}
```

However, it seems we can force the optimization to happen if we do the
assignment in both branches of the 'if', as in
```
void func(bool &b) {
    if (b) {
        b = false;
    } else {
        b = false;
    }
}

```

...which suggests that a less Yuck-inducing diff might be

```
--- optional.ORIG       2023-11-10 21:37:00.623586305 +0000
+++ optional    2023-11-10 21:38:54.021199563 +0000
@@ -316,6 +316,8 @@
       {
        if (this->_M_engaged)
          _M_destroy();
+        else
+          this->_M_engaged = false;
       }
     };

```

which produces the desired assembly, but at the cost of looking to the reader
like it's superfluous code.

...with the disclaimer that I don't understand why the "if
(!std::__is_constant_evaluated())" was necessary in your change, so I didn't
mention it here, so I could be missing something still.

Reply via email to