david@TERA.COM (David Callahan) (12/16/89)
In section 9.7 on Nested Class Declarations of the AT&T Product
Reference Manual for 2.0, it is stated that:
The "exporting" of classes and typedefs and enumeration
names into an enclosing scope continues until the global
or a local block scope is reached.
Does that also include the names if individual constants in an
enumeration type?
This is directed to gnu.g++.bug because I have found what must be a
bug in g++ and I don't have acccess to cfront to compare.
Here is the example:
--------------------
struct Node {
enum node_enum { other, load, store, add, test } ;
node_enum value ;
public:
Node& operator=(node_enum e) { value = e ; return *this ; }
int operator==(Node) ;
Node operator=(int) ;
} ;
struct Edge {
enum edge_enum { load, store, add, test } ;
edge_enum value ;
public:
Edge & operator=(edge_enum e) { value = e ; return *this ; }
} ;
foo(Node & t) {
node_enum n2 = Node::load ;
t = Node::load ;
t = 4 ;
t = store ; // this is line 25
t = Edge::load ;
}
-------------------- End Example ---------------
Running g++ 1.36.1 configured for sun3-nfp-os4, on this example I get
the following:
g++ -v -S enum.c
gcc version 1.36.1 (based on GCC 1.36)
/usr/local/lib/g++-1.36.1/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Dmc68020 enum.c /usr/tmp/cca09721.cpp
GNU CPP version 1.36
/usr/local/lib/g++-1.36.1/gcc-cc1plus /usr/tmp/cca09721.cpp -quiet -dumpbase enum.c -version -o enum.s
GNU C++ version 1.36.1 (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -mbitfield
enum.c: In function int foo (struct Node &):
enum.c:25: `store' undeclared (first use this function)
enum.c:25: (Each undeclared identifier is reported only once
enum.c:25: for each function it appears in.)
----------
g++ is making the individual names private to the class. This is
great, I wish the enumeration name was also private...
Looking at the assembler I observe that g++ also respects the
enumeration type when it does function resolution.
There does appear to be a bug implementing the store into t with
Edge::load. g++ appears to treat "Edge::load" as if were a
"node_enum" instead of implicitly casting it into and int.
Here is the assembler for the above after the error on line 25
is commented out:
#NO_APP
gcc_compiled.:
.text
.even
.globl _foo__FR4Node
_foo__FR4Node:
link a6,#-4
movel d2,sp@-
moveq #1,d2
movel d2,a6@(-4)
movel a6@(8),a0
moveq #1,d0
movel d0,a0@
movel a0,d1
jra L6
L6:
pea 4:w
movel a6@(8),sp@-
jbsr _op$assign_nop__4Nodei
movel a6@(8),a0
clrl d0
addqw #8,sp
movel d0,a0@
movel a0,d1
jra L7
L7:
L5:
movel a6@(-8),d2
unlk a6
rts
---------------------------
David Callahan david@tera.com
Tera Computer Co. 400 North 34th Street, Suite 300 Seattle WA, 98103