schmidt%siam.ics.uci.edu@PARIS.ICS.UCI.EDU ("Douglas C. Schmidt") (01/02/89)
Hi,
g++ 1.32 does not correctly handle the communtativity of array and
pointer indexing, i.e., A [ 0 ] == 0 [ A ]; I believe the following
patch fixes this temporarily. I've tested it a little, but I don't
know if it breaks something else.
Here's an example of what *didn't* compile before, and now does:
----------------------------------------
main ( ) {
typedef int VEC [ 20 ];
typedef VEC ( *PTA );
VEC a [ 10 ];
PTA ap = a;
0 [ ap ] [ 0 ] = 10000; // yikes, this is valid!
printf ( " * 0 [ ap ] = %d\n", * 0 [ ap ] ); // so's this!
}
----------------------------------------
Here are the original diagnostics:
----------------------------------------
g++ version 1.32.0
/usr/public/lib/g++/gcc-cpp -+ -v -I/cd/ua/schmidt/include/ -undef
-D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix test.c /tmp/cca06819.cpp
GNU CPP version 1.32
/usr/public/lib/g++/gcc-c++ /tmp/cca06819.cpp -quiet -dumpbase test.c
-fstrength-reduce -finline-functions -fmemoize-lookups -fsave-memoized
-fchar-charconst -version -o /tmp/cca06819.s
GNU C++ version 1.32.0 (sparc) compiled by GNU C version 1.31.
In function int main ():
test.c:8: [] applied to non-pointer type
test.c:8: [] applied to non-pointer type
test.c:8: invalid lvalue in assignment
test.c:9: [] applied to non-pointer type
test.c:9: invalid type argument of `unary *'
----------------------------------------
This now compiles and executes correctly with the following patch.
Doug
----------------------------------------
*** /usr/src/uci/usr/public/src-g++/cplus-parse.y Sat Dec 31 13:58:05 1988
--- cplus-parse.y Sun Jan 1 12:48:16 1989
***************
*** 672,677 ****
--- 672,680 ----
else if (TREE_CODE(type) == POINTER_TYPE
|| TREE_CODE(type) == ARRAY_TYPE)
$$ = build_array_ref ($1, $3);
+ else if (TREE_CODE (TREE_TYPE ($3)) == POINTER_TYPE
+ || TREE_CODE (TREE_TYPE ($3)) == ARRAY_TYPE)
+ $$ = build_array_ref ($1, $3);
else
error("[] applied to non-pointer type");
}