[gnu.g++.bug] BUG in G++ 1.34.0 - bogus error

rfg@MCC.COM (Ron Guilmette) (03/11/89)

The following code gets an error using G++ 1.34.0/Sun3.  It shouldn't.

Cut here
------------------------------------------------------------------------
/*
Description - The c++ "manual" (p. 270) says that "... a declaration may add
		default arguments not given in previous declarations"  This
		privledge should probably extend to method declarations and
		function declarations alike.  The following code checks that
		a re-declaration of a method may add some new defaults.
*/

struct class1 {
	void method1 (int arg1, int arg2);
	void method1 (int arg1, int arg2 = 35);
};
---------------------------------------------------------------------------
g++  -S x06.cc
x06.cc:11: `void class1::method1 (int, int (=  35 ))' is already defined in aggregate scope


// Ron Guilmette  -  MCC  -  Experimental (parallel) Systems Kit Project
// 3500 West Balcones Center Drive,  Austin, TX  78759  -  (512)338-3740
// ARPA: rfg@mcc.com
// UUCP: {rutgers,uunet,gatech,ames,pyramid}!cs.utexas.edu!pp!rfg

schmidt@crimee.ics.uci.edu (Doug Schmidt) (03/11/89)

In article <8903110137.AA08978@riunite.aca.mcc.com> rfg@MCC.COM (Ron Guilmette) writes:
++ The following code gets an error using G++ 1.34.0/Sun3.  It shouldn't.
++ 
++ Cut here
++ ------------------------------------------------------------------------
++ /*
++ Description - The c++ "manual" (p. 270) says that "... a declaration may add
++ 		default arguments not given in previous declarations"  This
++ 		privledge should probably extend to method declarations and
++ 		function declarations alike.  The following code checks that
++ 		a re-declaration of a method may add some new defaults.
++ */
++ 
++ struct class1 {
++ 	void method1 (int arg1, int arg2);
++ 	void method1 (int arg1, int arg2 = 35);
++ };
++ ---------------------------------------------------------------------------
++ g++  -S x06.cc
++ x06.cc:11: `void class1::method1 (int, int (=  35 ))' is already defined in aggregate scope

I'm not sure if G++ is wrong here.  Here's what cfront 1.2.1 sez:

----------------------------------------
CC  bug.c:
"bug.c", line 12: error: two declarations of class1::method1()
sorry, cannot recover from previous error
1 error
----------------------------------------

This error certainly makes intuitive sense, although I can see how one
might come to the other interpretation from the ``manual.''  I guess
we'll just have to wait for 2.0 and the new C++ reference...

Doug
--
schmidt@ics.uci.edu (ARPA) |   Per me si va nella citta' dolente.
office: (714) 856-4043     |   Per me si va nell'eterno dolore.
                           |   Per me si va tra la perduta gente.
                           |   Lasciate ogni speranza o voi ch'entrate.

rfg@MCC.COM (Ron Guilmette) (03/12/89)

Doug,

Allow me to post a follow-up to your follow-up on one of my recent G++
bug reports.  Your follow-up was as follows:

|In article <8903110137.AA08978@riunite.aca.mcc.com> rfg@MCC.COM (Ron Guilmette) writes:
|++ The following code gets an error using G++ 1.34.0/Sun3.  It shouldn't.
|++ 
|++ Cut here
|++ ------------------------------------------------------------------------
|++ /*
|++ Description - The c++ "manual" (p. 270) says that "... a declaration may add
|++ 		default arguments not given in previous declarations"  This
|++ 		privledge should probably extend to method declarations and
|++ 		function declarations alike.  The following code checks that
|++ 		a re-declaration of a method may add some new defaults.
|++ */
|++ 
|++ struct class1 {
|++ 	void method1 (int arg1, int arg2);
|++ 	void method1 (int arg1, int arg2 = 35);
|++ };
|++ ---------------------------------------------------------------------------
|++ g++  -S x06.cc
|++ x06.cc:11: `void class1::method1 (int, int (=  35 ))' is already defined in aggregate scope
|
|I'm not sure if G++ is wrong here.  Here's what cfront 1.2.1 sez:
|
|----------------------------------------
|CC  bug.c:
|"bug.c", line 12: error: two declarations of class1::method1()
|sorry, cannot recover from previous error
|1 error
|----------------------------------------
|
|This error certainly makes intuitive sense, although I can see how one
|might come to the other interpretation from the ``manual.''  I guess
|we'll just have to wait for 2.0 and the new C++ reference...

I believe that the "manual" (if you could call it that!) and my
interpretation are both correct, and that this *is* a bug.  I think
that the idea was to allow you to have one declaration of a method
or function then some calls to that method/function, then another
declaration of the method/function with more defaults, then some more
calls which may now make use of the added defaults.

This is definitely allowed for non-member functions (and is supported
by G++ 1.34.0 for such functions).  I think that in this case, the same
semantics should apply to both member and non-member functions.

// Ron Guilmette  -  MCC  -  Experimental (parallel) Systems Kit Project
// 3500 West Balcones Center Drive,  Austin, TX  78759  -  (512)338-3740
// ARPA: rfg@mcc.com
// UUCP: {rutgers,uunet,gatech,ames,pyramid}!cs.utexas.edu!pp!rfg