Date: Tue, 7 Nov 2000 12:17:34 +0200 From: Peter Pentchev <roam@orbitel.bg> To: Giorgos Keramidas <keramida@ceid.upatras.gr> Cc: hackers@freebsd.org Subject: Re: umask(2) and -Wconversion Message-ID: <20001107121734.D314@ringworld.oblivion.bg> In-Reply-To: <20001107120511.A98074@gray.westgate.gr>; from keramida@ceid.upatras.gr on Tue, Nov 07, 2000 at 12:05:11PM %2B0200 References: <20001107120511.A98074@gray.westgate.gr>
next in thread | previous in thread | raw e-mail | index | archive | help
In my experience, the problem is not only with umask(2) - GCC *is* a bit stubborn about -Wconversion; I wonder if this is really a GCC bug :( I'm having the same problems with many other functions when passing integer constants - even if I explicitly cast them to a long or unsigned long or plain unsigned int or whatever the particular function needs, GCC seems to ignore the cast and whines about the conversion nonetheless :( Can anybody else confirm this? I can't dig out a code snippet right now, but ISTR a recurring case of this when compiling with BDECFLAGS a program which includes ncurses.h, then passes integer constants to init_pair() or something similar. G'luck, Peter -- If there were no counterfactuals, this sentence would not have been paradoxical. On Tue, Nov 07, 2000 at 12:05:11PM +0200, Giorgos Keramidas wrote: > While trying to compile libskey with various warnings enabled, I > discovered the following funny thing about -Wconversion and umask(2), > which caused libskey to fail to compile, because it compiles by default > with -Werror which makes every warning fatal. > > I found that the warning is caused when a program that calls umask(2) is > compiled with -Wconversion. The info page of gcc says about -Wconversion: > > `-Wconversion' > Warn if a prototype causes a type conversion that is different > from what would happen to the same argument in the absence of a > prototype. This includes conversions of fixed point to floating > and vice versa, and conversions changing the width or signedness > of a fixed point argument except when the same as the default > promotion. > > Also, warn if a negative integer constant expression is implicitly > converted to an unsigned type. For example, warn about the > assignment `x = -1' if `x' is unsigned. But do not warn about > explicit casts like `(unsigned) -1'. > > The following test program when compiled with -Wconversion shown below > will always give a warning, even if I explicitly try to cast the > argument of umask() to mode_t. > > 1 #include <stdio.h> > 2 #include <sys/stat.h> > 3 > 4 int main (void) > 5 { > 6 mode_t oldmask; > 7 > 8 oldmask = umask(0); > 9 printf("The umask has changed\n"); > 10 umask(oldmask); > 11 return 0; > 12 } > > The output given when I compile this with -Wconversion is: > > gray-charon:/home/charon/test% gcc -Wconversion test.c -o test > test.c: In function `main': > test.c:8: warning: passing arg 1 of `umask' with different width due to prototype > test.c:10: warning: passing arg 1 of `umask' with different width due to prototype > > The problem is that even if I change line 8 to read: > > 8 oldmask = umask((mode_t) 0); > > the warning is still there. Am I being a bit too strict with all these > warnings here? If not, does anyone else have any idea why umask(2) will > always cause such a warning, and how I can go about correcting it? > Casting obviously fails, so something else needs to be done. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001107121734.D314>