ICE: tree check: expected class 'declaration', have 'exceptional' (error_mark) in pushtag, at cp/name- lookup.c:4658
g++ is very confused about forward-declared classes and friend classes. -------------------------------------------------- GCC version info: Using built-in specs. Configured with: ../configure --prefix=/sw --prefix=/sw/lib/gcc4 --enable- languages=c,c++,objc,f95,java --infodir=/share/info --with-gmp=/sw --with-as=/sw/lib/odcctools/ bin/as --with-ld=/sw/lib/odcctools/bin/ld --with-included-gettext --host=powerpc-apple-darwin Thread model: posix gcc version 4.0.0 20050130 (experimental) /sw/lib/gcc4/libexec/gcc/powerpc-apple-darwin/4.0.0/cc1plus -E -quiet -v -D__DYNAMIC__ -D__APPLE_CC__=1 gcc4death.cc -fPIC -fpch-preprocess -o gcc4death.ii ignoring nonexistent directory "/sw/lib/gcc4/lib/gcc/powerpc-apple-darwin/4.0.0/../../../../powerpc- apple-darwin/include" #include "..." search starts here: #include <...> search starts here: /sw/lib/gcc4/lib/gcc/powerpc-apple-darwin/4.0.0/../../../../include/c++/4.0.0 /sw/lib/gcc4/lib/gcc/powerpc-apple-darwin/4.0.0/../../../../include/c++/4.0.0/powerpc-apple- darwin /sw/lib/gcc4/lib/gcc/powerpc-apple-darwin/4.0.0/../../../../include/c++/4.0.0/backward /usr/local/include /sw/lib/gcc4/include /sw/lib/gcc4/lib/gcc/powerpc-apple-darwin/4.0.0/include /usr/include /System/Library/Frameworks /Library/Frameworks End of search list. /sw/lib/gcc4/libexec/gcc/powerpc-apple-darwin/4.0.0/cc1plus -fpreprocessed gcc4death.ii -fPIC -quiet -dumpbase gcc4death.cc -auxbase gcc4death -version -o gcc4death.s GNU C++ version 4.0.0 20050130 (experimental) (powerpc-apple-darwin) compiled by GNU C version 3.3 20030304 (Apple Computer, Inc. build 1640). GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 ------------------------------------------ command to reproduce: g++-4.0 -c gcc4death.cc -o gcc4death.o ------------------------------------------ gcc error feedback: util/persistent_object_manager_gcc4death.h: In instantiation of 'util::persistent_traits<whatever>': gcc4death.cc:7: instantiated from here util/persistent_object_manager_gcc4death.h:480: error: use of 'persistent_object_manager' is ambiguous util/persistent_object_manager_gcc4death.h:67: error: first declared as 'class util:: persistent_object_manager' here util/persistent_object_manager_gcc4death.h:28: error: also declared as 'struct util::memory:: persistent_object_manager' here util/persistent_object_manager_gcc4death.h:480: error: conflicting declaration 'struct util:: persistent_object_manager' util/persistent_object_manager_gcc4death.h:67: error: 'class util::persistent_object_manager' has a previous declaration as 'class util::persistent_object_manager' util/persistent_object_manager_gcc4death.h:480: internal compiler error: tree check: expected class 'declaration', have 'exceptional' (error_mark) in pushtag, at cp/name-lookup.c:4658 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. =============== "gcc4death.ii" ================ # 1 "gcc4death.cc" # 1 "<built-in>" # 1 "<command line>" # 1 "gcc4death.cc" # 1 "util/persistent_object_manager_gcc4death.h" 1 # 24 "util/persistent_object_manager_gcc4death.h" namespace util { class persistent_object_manager; namespace memory { class pointer_manipulator { friend class persistent_object_manager; }; } } # 45 "util/persistent_object_manager_gcc4death.h" namespace util { # 58 "util/persistent_object_manager_gcc4death.h" using namespace memory; # 67 "util/persistent_object_manager_gcc4death.h" class persistent_object_manager { # 467 "util/persistent_object_manager_gcc4death.h" }; # 479 "util/persistent_object_manager_gcc4death.h" template <class T> class persistent_traits { friend class persistent_object_manager; # 525 "util/persistent_object_manager_gcc4death.h" }; } # 3 "gcc4death.cc" 2 class whatever { }; static const util::persistent_traits<whatever> __blah__; =================== end-of-file ================= other comments: The above code should produce the following error as reported by gcc-3.3 and gcc-3.4. gcc4death.cc:7: error: uninitialized const `__blah__' -- Summary: ICE: tree check: expected class 'declaration', have 'exceptional' (error_mark) in pushtag, at cp/name- lookup.c:4658 Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: fang at csl dot cornell dot edu CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19948