home *** CD-ROM | disk | FTP | other *** search
- Newsgroups: gnu.gcc.bug
- Path: sparky!uunet!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!computer-science.manchester.ac.UK!bevan
- From: bevan@computer-science.manchester.ac.UK (Stephen J Bevan)
- Subject: Some comments on new -W options in gcc 2.2
- Message-ID: <9207281157.AA08983@panda.cs.man.ac.uk>
- Sender: gnulists@ai.mit.edu
- Organization: GNUs Not Usenet
- Distribution: gnu
- Date: Tue, 28 Jul 1992 11:57:06 GMT
- Approved: bug-gcc@prep.ai.mit.edu
- Lines: 122
-
- This is not a bug report per se, rather an observation about some of
- the new warning options that have appeared with GCC 2.2.
-
- `-Waggregate-return'
- Warn if any functions that return structures or unions are defined
- or called. (In languages where you can return an array, this also
- elicits a warning.)
-
- I initially thought it was an attempt catch the case of returning a
- pointer to a stack allocated object which dissapears with the stack
- frame on exit. However, instead it seems to warn about perfectly
- valid structure returns (i.e. the values are copied off the stack
- frame). I'm therefore confused, what error(s) is this trying to
- catch?
-
-
- `-Wredundant-decls'
- Warn if anything is declared more than once in the same scope,
- even in cases where multiple declaration is valid and changes
- nothing.
-
- I think the utility of this could be greatly increased if it only
- complained about multiple _declarations_ rather than complaining about
- a declaration followed by a definition. i.e. code like the following
- seems quite normal practice and it to have the compiler warn about it
- seems rather pointless :-
-
- /* foo.h */
- extern int foo(int x);
-
- /* foo.c */
- #include "foo.h"
- int foo(int x) { ... }
-
- On the other hand multiple declarations such as having two "extern int
- foo(int x);" declarations in the code is worth knowing about.
- However, under the current scheme these are lost in the warnings about
- the situation described previously.
-
- There is also the interesting interation between the above and :-
-
- `-Wmissing-prototypes'
- Warn if a global function is defined without a previous prototype
- declaration. This warning is issued even if the definition itself
- provides a prototype. The aim is to detect global functions that
- fail to be declared in header files.
-
- It seems if both are enabled, no matter what is done warnings will be
- generated. For example, given the following program :-
-
- extern int foo(int x);
-
- int foo(int x) {return 10;}
-
- int main() {
- int v;
- v = foo(1);
- return 0;
- }
-
- Warnings are produced about duplicate definitions of "foo", and a
- missing prototype for "main" :-
-
- panda% gcc-new -v -pipe -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -ansi -pedantic foo.c
- Reading specs from /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/specs
- gcc version 2.2.2
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/cpp -lang-c -v -undef -D__GNUC__=2 -trigraphs -$ -D__STRICT_ANSI__ -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -pedantic foo.c |
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/cc1 -quiet -dumpbase foo.c -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -pedantic -ansi -version -o - |
- as - -o foo.o
- GNU CPP version 2.2.2 (sparc)
- GNU C version 2.2.2 (sparc) compiled by GNU C version 2.2.2.
- foo.c:3: warning: redundant redeclaration of `foo' in same scope
- foo.c:1: warning: previous declaration of `foo'
- foo.c:5: warning: function declaration isn't a prototype
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/ld -e start -dc -dp /lib/crt0.o -L/usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2 -L/usr/local/gcc foo.o -lgcc -lc -lgcc
-
- After adding a prototype for "main" :-
-
- extern int foo(int x);
-
- int foo(int x) {return 10;}
-
- int main(void);
-
- int main() {
- int v;
- v = foo(1);
- return 0;
- }
-
- A warning is then issued about duplicate prototypes for "main" :-
-
- panda% gcc-new -v -pipe -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -ansi -pedantic foo.c
- Reading specs from /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/specs
- gcc version 2.2.2
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/cpp -lang-c -v -undef -D__GNUC__=2 -trigraphs -$ -D__STRICT_ANSI__ -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -pedantic foo.c |
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/cc1 -quiet -dumpbase foo.c -Wall -Wcast-align -Wconversion -Waggregate-return -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -Wstrict-prototypes -Wshadow -Wcast-qual -Wpointer-arith -Wwrite-strings -pedantic -ansi -version -o - |
- as - -o foo.o
- GNU CPP version 2.2.2 (sparc)
- GNU C version 2.2.2 (sparc) compiled by GNU C version 2.2.2.
- foo.c:3: warning: redundant redeclaration of `foo' in same scope
- foo.c:1: warning: previous declaration of `foo'
- foo.c:7: warning: redundant redeclaration of `main' in same scope
- foo.c:5: warning: previous declaration of `main'
- /usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2/ld -e start -dc -dp /lib/crt0.o -L/usr/local/gcc/gcc-lib/sparc-sun-sunos4/2.2.2 -L/usr/local/gcc foo.o -lgcc -lc -lgcc
-
- I realise that these are optional warnings which I can choose not to
- enable if I don't want to, however, in their present state, they seem
- of little utility. So, whilst I'm all in favour of extra checks being
- done by the compiler, is there any chance of them being a little more
- intelligent?
-
- Finally, has any thought been given to removing all the different
- environment variables and replacing them with a single one, say "GCC".
- This would contain all the options (in command line syntax for) that
- the user wants enabled as default. Besides reducing environment
- variable name space polution, it would also allow the long list of
- warnings I like enabled as default to be defined once and for all
- rather than having to repeat them in each Makefile.
-
- bevan
-
-