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

Ion Lupascu <ion.lupascu at barclays dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ion.lupascu at barclays dot com

--- Comment #7 from Ion Lupascu <ion.lupascu at barclays dot com> ---
Not really, The issue still persists

Check this example:
#include <iostream>
#include <limits>
#include <optional>

std::optional<double> getValue(){
    return 3.14;
}

int main(){
    const double &v = *getValue();
    std::cout<<"v:=" << v  << std::endl;
    if (v == 0.0) {
        __builtin_abort();
    }
    return 0;
}

compiled with GCC trunk (v13) and the following flags: -O3 -std=c++17 -Werror
-Wall -Wextra

returns:
Program returned: 139
v:=0

link to play: https://godbolt.org/z/fPhxqe1h3

clang behaves correctly till v 10, it extends the lifetime, in v10 it catches
with dangling-gsl check. when adding a more complex value rather than double
clang doesn't catch it but it extends the lifetime. e.g.:

#include <iostream>
#include <limits>
#include <optional>

namespace
{

struct Data{
    double v;
};

} // namespace

std::optional<Data> getValue(){
    return Data{3.14};
}

int main(){
    const double &v = getValue()->v;
    std::cout<<"v:=" << v  << std::endl;
    if (v == 0.0) {
        __builtin_abort();
    }
    return 0;
}

link to play : https://godbolt.org/z/WoeGqhn7E

where GCC catches with the following error:
<source>: In function 'int main()':
<source>:20:25: error: using a dangling pointer to an unnamed temporary
[-Werror=dangling-pointer=]
   20 |     std::cout<<"v:=" << v  << std::endl;
      |                         ^
<source>:19:31: note: unnamed temporary defined here
   19 |     const double &v = getValue()->v;
      |                       ~~~~~~~~^~
cc1plus: all warnings being treated as errors
ASM generation compiler returned: 1


GCC must first fix the temporary values lifetime when bounded by reference.

Reply via email to