This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c/9166: [2003-01-03] C front end's type scoping not right
- From: "Joseph S. Myers" <jsm28 at cam dot ac dot uk>
- To: <neil at gcc dot gnu dot org>
- Cc: <gcc-gnats at gcc dot gnu dot org>, <gcc-bugs at gcc dot gnu dot org>
- Date: Sat, 4 Jan 2003 11:24:42 +0000 (GMT)
- Subject: Re: c/9166: [2003-01-03] C front end's type scoping not right
On 4 Jan 2003 neil@gcc.gnu.org wrote:
> /* Compile the code snippet below with -pedantic. The code is illegal
> because the function f is redeclared with an incompatible prototype,
> but GCC doesn't winge. */
>
> struct bar {int x, y;};
>
> void foo ()
> {
> extern void f( struct bar {double x, y;} );
> }
>
> void f (struct bar );
What makes you think the former prototype is visible at the latter? The
former declaration has block scope; as the Rationale discusses, there is a
delibrate compromise in the standard here, where a former block scope
external declaration can be considered, but need not be. Incompatible
declarations need only be diagnosed in the same scope (by 6.7#4).
Declarations refering to the same object or function that are not in the
same scope merely yield undefined behavior if of incompatible types
(6.2.7#2). That said, a mandatory pedwarn for a latter declaration
incompatible with a former invisible declaration would make sense, but
there is no bug here and the former declaration shouldn't be considered
visible for most ordinary purposes (seeing whether the function is
declared when it is used, converting arguments, etc.) - just to complain
about the incompatibility with another declaration.
--
Joseph S. Myers
jsm28@cam.ac.uk