Thread View: gnu.g++.bug
1 messages
1 total messages
Started by rjc
Thu, 16 Mar 1989 18:31
G++ 1.34.1 Named Return Values (no fix)
Author: 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!
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads