For sharing :

- newest gcc version (11) sets by default of bunch of new tests for code correctness

- it spits out around ten thousand lines of warnings (*), making it quite impossible to look into compiler output


there are a couple of genuine issues reported by gcc11

- Rémi and I already sent a serie of patches for addressing those

- a strange indentation waiting for a volunteer

  (in dlls/wininet/internet.c:2878, the line
        lpwhh->ErrorMask = *(ULONG*)lpBuffer;

  at the end of the if/else chain is misindented)


unfortunately, most of the generated warnings are false positives, that need to be fixed (or removerd) before GCC11 becomes mainstream

- Fedora 35 with GCC11 is in beta right now, and GA is mid of October

- I haven't checked other distros though, but I expect similar evolution in coming weeks/months

- in Fedora both gcc and mingw-gcc have been upgraded to version 11


The false positives we need to tackle:


A) misleading indentation

===================

GCC11 complains about code like:

        foo;

todo_wine

        ok(tst, ...);

        bar;

(gcc11 warns about 'bar ' not being properly indented wrt todo_wine)

there are (as of today) 817 occurrences of those in wine tree (spread across 127 files)

and counts for ~90% (*) of the line of warnings generated by GCC

only 2 true positives are generated by this GCC warning


Remarks:

- constructs on a single line don't generate the warning

     todo_wine ok(tst, ...); // ok no warning, whatever the indentation of the line wrt the rest of the code

- having the ok(tst, ...) inside a block after the todo_wine doesn't generate the warning


possible solutions:

- disable the warning in configure

   cons: will not trigger on true positive

   pros: minor impact on code base (either committed and under progress in dev:s trees)

- merge the todo_wine and ok() line into a single one

   pros: keep current indentation, coherent with todo_wine + block

   cons: harder to read, esp. for todo_wine_if

   cons: for todo_wine_if, could generate too long lines

   cons: large impact on code base

   pros/cons: git blame on ok() line will tell who removed the todo_wine, not who wrote the test

- reindent only problematic todo_wine

        foo;

        todo_wine

        ok(tst, ...);

        bar;

    ^ without indenting the line ok(tst, ...);

    ^ without indenting the "todo_wine {\n<...>\n}" nor the "todo_wine ok()" on a single line constructs as they don't generate warnings

    pros/cons: indentation isn't used for adding comments to the code (that's what comments are for)

    cons: large impact on code base

- reindent all todo_wine

    same as above, but also reindenting the "todo_wine {\n<...>\n}" and the "todo_wine ok()" on a single line constructs

    pros/cons: indentation isn't used for adding comments to the code (that's what comments are for)

    cons: large impact on code base


B) uninitialized objects

===============

GCC11 warns on code like:

void foo(const TYPE* s);

.....

TYPE s;

foo(&s);

because, s isn't initialized, and is passed as const ptr, hence could be read by function foo without being initialized

proposal:

- depending on context, different fixes are at hand: either initialize s, or when applicable, play with aliasing

C) partial structures

============

In a bunch of places, we use a pointer to a structure, where underlying allocated object is smaller than the actual size of the structure.

(roughly 400 lines of warnings (*))


It's used:

- when dealing with two structures sharing their first fields (like in BITMAP for example)

- in tests, to test behavior will various sizes of objects as input...


proposal: disable this warning in configure


D) sizeof/sizeof

=========

GCC11 warns when sizeof(foo)/sizeof(bar) is used and cannot be reduced to computing the number of elements of an array

proposal: rewrite as sizeof(foo)/(sizeof(bar)) (note the parenthesis around sizeof(bar), as suggested by GCC)


A+


(*) those values are rough estimates, only consider the order of magnitude