c/9166: [2003-01-03] C front end's type scoping not right

Joseph S. Myers jsm28@cam.ac.uk
Sat Jan 4 11:25:00 GMT 2003


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



More information about the Gcc-bugs mailing list