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

mauro russo <ing.russomauro at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ing.russomauro at gmail dot com

--- Comment #25 from mauro russo <ing.russomauro at gmail dot com> ---
Hello,

I was going to post a new potential bug (for gcc 14.2) and then found two
exist: PR 60212 and this one, too.

I will paste here below my intended message with the error description, but
note that in my description a missing warning happens also for trivial type
when the value-initialization is used.
I wasn't sure whether to post this message here or in PR 60212.




I found the case while studying differences about user-provided and
non-user-provided explicitly-defaulted default constructors.


In the following code:

struct X{
    X() = default;
    // int m;
};

//X::X() = default;

int main()
{
    X x;

    return 0;
}

gcc raises a warning about unused variable x,


but in the following other code (https://godbolt.org/z/36WKzbvP6)

struct X{
    X(); // = default;
    // int m;
};

X::X() = default;

int main()
{
    X x;

    return 0;
}

no warning is issued.


Well, in second case, the explictly-defaulted default constructor is
user-provided, which also leads it not to be trivial (and, consequently, the
type neither).
However, in both cases, no initialization of any base or non-static data member
is done, and nothing changes also if a data member "int m;" is added (with no
default member initializer).

I cannot figure out what motivation may lead to a different behaviour.

In particular, if the opposite behaviour would have happened, I could have
supposed the error to be related to the vacuous-initialization when
non-user-provided (first case).

Additionally, note that if 'x' is value-initialized ("X x{};"), then the
warning disappears in both cases (trivial or non-trivial), regardless of adding
or not an "int m;" data member, where the only theoretical difference (beyond
the 'trivial' and consequent 'vacuous-initialization') is that no
zero-initialization is performed as first step of the value-initialization (see
https://eel.is/c++draft/dcl.init.general#9.1), before the
default-initialization (that does nothing).

Reply via email to