NOTE: Defaulting component because reported component no longer exists When compiling the following two lines: typedef double R; typedef R _Complex C; with the flags -std=c99 -pedantic, gcc gives the bogus warning: foo.c:2: warning: ISO C does not support complex integer types (Code based on the above definitions seems to work, however.) Environment: System: Linux ab-initio 2.4.25 #1 SMP Fri Jul 9 17:11:47 EDT 2004 i686 unknown Architecture: i686 host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: ../configure --prefix=/usr/local/gcc-3.4 --enable-languages=c,c++,f77 How-To-Repeat: Create a file foo.c with the above two lines, and compile with gcc -std=c99 -pedantic -c foo.c
Fix: Simply ignoring the warning seems to work okay.
Subject: Re: New: bogus warning about complex "integer" types from typedef On Tue, 18 Jan 2005, gcc-bugzilla at gcc dot gnu dot org wrote: > When compiling the following two lines: > > typedef double R; > typedef R _Complex C; This is not valid code; you can't use _Complex together with a typedef, only together with "float", "double" or "long double" in one of the forms listed in C99. The misleading diagnostic is a bug, which has been fixed in mainline: you now get the error t.c:2: error: two or more data types in declaration specifiers
Invalid based on JSM's comment.
Subject: Re: bogus warning about complex "integer" types from typedef On Tue, 18 Jan 2005, joseph at codesourcery dot com wrote: >> typedef double R; >> typedef R _Complex C; > > This is not valid code; you can't use _Complex together with a typedef, > only together with "float", "double" or "long double" in one of the forms > listed in C99. My copy of the C99 draft standard states (sec. 6.7.7): "A typedef declaration does not introduce a new type, only a synonym for the type so specified." According to this, "R complex" should be a synonym for "double complex", and therefore should be valid code. What justification do you have for claiming otherwise?
Subject: Re: bogus warning about complex "integer" types from typedef Okay, I guess I see what you mean. "double" in "double _Complex" is arguably not a "type", but rather a type-specifier as defined in 6.7.2, and the "each list of type-specifiers shall be one of the following sets", a prescribed list of combinations that does not include typedefs. What an annoyance; one has to define R via the preprocessor, then, in order to use consistent floating-point precisions everywhere in a program.
Subject: Re: bogus warning about complex "integer" types from typedef On Tue, 18 Jan 2005, stevenj at fftw dot org wrote: > Okay, I guess I see what you mean. "double" in "double _Complex" is > arguably not a "type", but rather a type-specifier as defined in 6.7.2, > and the "each list of type-specifiers shall be one of the following sets", > a prescribed list of combinations that does not include typedefs. Yes, that's my point. "double _Complex" is one valid list of type specifiers. "typedef name" is another, listed separately - a single type specifier, not part of any valid combinations.