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

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


The following reply was made to PR c/9166; it has been noted by GNATS.

From: "Joseph S. Myers" <jsm28@cam.ac.uk>
To: <neil@gcc.gnu.org>
Cc: <gcc-gnats@gcc.gnu.org>,  <gcc-bugs@gcc.gnu.org>
Subject: Re: c/9166: [2003-01-03] C front end's type scoping not right
Date: Sat, 4 Jan 2003 11:24:42 +0000 (GMT)

 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-prs mailing list