On Mon, Nov 14, 2022, 04:42 David Brown via Gcc wrote: > On 13/11/2022 19:43, Alejandro Colomar via Gcc wrote: > > Hi Andrew! > > > > On 11/13/22 19:41, Andrew Pinski wrote: > >> On Sun, Nov 13, 2022 at 10:40 AM Andrew Pinski > wrote: > >>> > >>> On Sun, Nov 13, 2022 at 10:36 AM Alejandro Colomar via Gcc > >>> wrote: > >>>> > >>>> Hi, > >>>> > >>>> While discussing some idea for a new feature, I tested the following > >>>> example > >>>> program: > >>>> > >>>> > >>>> int main(void) > >>>> { > >>>> int i = i; > >>>> return i; > >>>> } > >>> > >>> This is NOT a bug but a documented way of having the warning not > >>> being there. > >>> See > >>> > https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Warning-Options.html#index-Winit-self > >>> > >>> > https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Warning-Options.html#index-Wuninitialized > >>> > >>> "If you want to warn about code that uses the uninitialized value of > >>> the variable in its own initializer, use the -Winit-self option." > >> > >> I should note the main reason why I Know about this is because I fixed > >> this feature years ago (at least for C front-end) > >> and added the option to disable the feature. > > > > I'm curious: what are the reasons why one would want to disable such a > > warning? > > Why is it not in -Wall or -Wextra? > > > > Thanks, > > > > Alex > > > > Warnings are not perfect - there is always the risk of false positives > and false negatives. And different people will have different ideas > about what code is perfectly reasonable, and what code is risky and > should trigger a warning. Thus gcc has warning flag groups (-Wall, > -Wextra) that try to match common consensus, and individual flags for > personal fine-tuning. > > Sometimes it is useful to have a simple way to override a warning in > code, without going through "#pragma GCC diagnostic" lines (which are > powerful, but not pretty). > > So if you have : > > int i; > if (a == 1) i = 1; > if (b == 1) i = 2; > if (c == 1) i = 3; > return i; > > the compiler will warn that "i" may not be initialised. But if you > /know/ that one of the three conditions will match (or you don't care > what "i" is if it does not match), then you know your code is fine and > don't want the warning. Writing "int i = i;" is a way of telling the > compiler "I know what I am doing, even though this code looks dodgy, > because I know more than you do". > > It's just like writing "while ((*p++ = *q++));", or using a cast to void > to turn off an "unused parameter" warning. > Wouldn't it be easier, faster, and more obvious to the reader to just use "int i = 0"? I'm curious what a real world use case is where you can't do the more common thing if =0. >