• Re: c initialization algorithm

    From Kaz Kylheku@21:1/5 to Thiago Adams on Sun Oct 13 23:33:04 2024
    On 2024-10-13, Thiago Adams <thiago.adams@gmail.com> wrote:
    The algorithm for C initialization as described in the standard and implemented in gcc allow this.

    struct X{
    int a,b,c;
    };

    int main()
    {
    struct X x = {.a=1,2,3,.a=1, 2, 3};
    }

    https://godbolt.org/z/7naedbEM6

    Basically, when a designed initializer is found the "cursor" goes to
    that member and the following members are initialized in order.

    I do not suspect that therw is an observable order. I.e. as
    in a required order considered observable behavior.

    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @Kazinator@mstdn.ca

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Tim Rentsch@21:1/5 to Kaz Kylheku on Sun Oct 13 22:00:39 2024
    Kaz Kylheku <643-408-1753@kylheku.com> writes:

    On 2024-10-13, Thiago Adams <thiago.adams@gmail.com> wrote:

    The algorithm for C initialization as described in the standard
    and implemented in gcc allow this.

    struct X{
    int a,b,c;
    };

    int main()
    {
    struct X x = {.a=1,2,3,.a=1, 2, 3};
    }

    https://godbolt.org/z/7naedbEM6

    Basically, when a designed initializer is found the "cursor" goes
    to that member and the following members are initialized in
    order.

    I do not suspect that therw is an observable order. I.e. as
    in a required order considered observable behavior.

    Have you checked to C standard to see what it says about that?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kaz Kylheku@21:1/5 to Thiago Adams on Tue Oct 15 20:30:43 2024
    On 2024-10-15, Thiago Adams <thiago.adams@gmail.com> wrote:
    int main() {
        struct X x = {.i = f(), .i = f() };
    }

    https://godbolt.org/z/rf984cGMM

    There is a warning in this sample and f is called just once.



    Forgot to say that I didn't find this part on the standard.
    I think initialization is also very superficial on books.

    The current public draft, which I think is still N3047, does
    address the issue of repeated mentions of the same subobject in
    a designated initializer:

    The initialization shall occur in initializer list order, each
    initializer provided for a particular subobject overriding any
    previously listed initializer for the same subobject.(184)

    Since the second .i = f() overrides the previously listed .i = f(),
    there is only one initialization of .i.

    It is not specified whether both calls to f() occur; i.e.
    is the initializing expression of the overridden initializer still
    evaluated?

    The referenced footnoted 184 address itself to this question.
    But not only is the footnote not normative text, as you know,
    it uses the phrase "might not", thus only clarifying that this
    aspect is not specified. f could be called twice or only once:

    184. Any initializer for the subobject which is overridden and
    so not used to initialize that subobject might not be evaluated at
    all.

    Don't write code that initializes subobjects more than once, or else if
    you do, don't have side effects in the initializing expressions such
    that the program depends on all of them being invoked.

    The implementation's warning is a good idea.

    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @Kazinator@mstdn.ca

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)