Article View: gnu.g++.bug
Article #1736G++ 1.34.1 Named Return Values (no fix)
From: rjc
Date: Thu, 16 Mar 1989 18:31
Date: Thu, 16 Mar 1989 18:31
138 lines
4350 bytes
4350 bytes
G++ 1.34.1 with GCC 1.34
Vax 8350, Ultrix V2.2-1 System #4
config.g++ vax
I tried using named return values. It didn't seem to work as advertised.
Is it broken, or was the advertisement wrong?
>From ucla-cs!oberon!bloom-beacon!tut.cis.ohio-state.edu!YAHI.STANFORD.EDU!mdt Thu Mar 16 09:53:32 PST 1989
>[...]
>
>GNU C++ 1.34.1 also has three new experimental features.
>
>1. Named return values. Example:
>
>struct A { ... A (); A (A&); ... };
>
>// old way
>A foo ()
>{
> A tmp; // calls A() constructor
>
> ... things which modify `tmp' ...
> return tmp; // calls A(A&) constructor
>}
>
>// new way
>A foo () return tmp; // calls A () constructor on entry
>{
> ... things which modify `tmp' ...
> return tmp; // call to A (A&) constructor not needed
>}
>[...]
Following this description, we are told that tmp is not declared:
bug.cc:
----------------------------------------------------------
/* test named return values
* Rob Collins (rjc@cs.ucla.edu)
*/
struct A {
int i;
A(int x) { printf("A(%d)\n", x); i = x; };
A(A& x) { printf("A(A& x), x.i == %d\n", x.i); i = x.i; };
~A(void) { printf("~A(%d)\n", i); };
void operator += (A& x) { printf("+=(%d, %d)\n", i, x.i); i += x.i; };
};
A foo (void) return tmp = 4;
{
printf("foo(void), tmp.i == %d\n", tmp.i);
return tmp;
}
main()
{
A bar = 5;
bar += foo();
printf("main(), bar.i == %d\n", bar.i);
}
----------------------------------------------------------
Script started on Thu Mar 16 10:27:42 1989
% g++ -v bug.cc
g++ version 1.34.1
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dvax -Dunix -D__vax__ -D__unix__ bug.cc /tmp/cc007922.cpp
GNU CPP version 1.34
/usr/local/lib/gcc-c++ /tmp/cc007922.cpp -quiet -dumpbase bug.cc -noreg -version -o /tmp/cc007922.s
GNU C++ version 1.34.1 (vax) compiled by GNU C version 1.34.
In function foo ():
bug.cc:15: `tmp' was not declared (first use this function)
bug.cc:15: (Each undeclared identifier is reported only once
bug.cc:15: for each function it appears in.)
bug.cc:16: `tmp' was not declared (first use this function)
% ^D
script done on Thu Mar 16 10:27:51 1989
Adding a declaration of tmp inside the function foo results in successful
compilation:
bug.cc:
----------------------------------------------------------
/* test named return values
* Rob Collins (rjc@cs.ucla.edu)
*/
struct A {
int i;
A(int x) { printf("A(%d)\n", x); i = x; };
A(A& x) { printf("A(A& x), x.i == %d\n", x.i); i = x.i; };
~A(void) { printf("~A(%d)\n", i); };
void operator += (A& x) { printf("+=(%d, %d)\n", i, x.i); i += x.i; };
};
A foo (void) return tmp = 4;
{
A tmp = 1;
printf("foo(void), tmp.i == %d\n", tmp.i);
return tmp;
}
main()
{
A bar = 5;
bar += foo();
printf("main(), bar.i == %d\n", bar.i);
}
----------------------------------------------------------
Script started on Thu Mar 16 10:28:45 1989
% g++ -v bug.cc
g++ version 1.34.1
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dvax -Dunix -D__vax__ -D__unix__ bug.cc /tmp/cc007930.cpp
GNU CPP version 1.34
/usr/local/lib/gcc-c++ /tmp/cc007930.cpp -quiet -dumpbase bug.cc -noreg -version -o /tmp/cc007930.s
GNU C++ version 1.34.1 (vax) compiled by GNU C version 1.34.
gas /tmp/cc007930.s -o bug.o
/usr/local/lib/gcc-ld++ -C /usr/local/lib/crt0+.o bug.o -lg++ /usr/local/lib/gcc-gnulib -lc
% a.out
A(5)
A(1)
foo(void), tmp.i == 1
A(A& x), x.i == 1
~A(1)
+=(5, 1)
~A(1)
main(), bar.i == 6
~A(6)
% ^D
script done on Thu Mar 16 10:29:12 1989
In foo(), the return value constructor is not called. In addition, tmp
is copied on return from foo().
-------------------------------------------------------------------------------
rjc@cs.ucla.edu
This is what happens when I sit on my keyboard: AISBDFAORI:KHGEDSYTFBFISKVDJ MN
Next week: what happens when I throw my keyboard out the window!
Technical Details
Message-ID:
<21850@shemp.CS.UCLA.EDU>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!rutgers!ucla-cs!rjcShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!rutgers!ucla-cs!rjc From: rjc@maui.cs.ucla.edu Newsgroups: gnu.g++.bug Subject: G++ 1.34.1 Named Return Values (no fix) Message-ID: <21850@shemp.CS.UCLA.EDU> Date: 16 Mar 89 18:31:35 GMT Sender: news@CS.UCLA.EDU Reply-To: rjc@CS.UCLA.EDU () Distribution: gnu Organization: UCLA Computer Science Department Lines: 138