[Bug c++/19948] New: ICE: tree check: expected class 'declaration', have 'exceptional' (error_mark) in pushtag, at cp/name-lookup.c:4658

fang at csl dot cornell dot edu gcc-bugzilla@gcc.gnu.org
Mon Feb 14 15:06:00 GMT 2005


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



More information about the Gcc-bugs mailing list