Bugs in the Debian/GNU GNU compiler setup ========================================= Before reporting a bug, please ------------------------------ - Check that the behaviour really is a bug. Have a look into some ANSI standards document. - Check at the end of this document for known bugs/behaviour. - Check http://www.debian.org/Bugs, if this behaviour / this bug already is reported. - Check http://gcc.gnu.org/bugs.html for known bugs. When reporting a bug, please ---------------------------- - read /usr/doc/debian/bug-reporting.txt - read http://gcc.gnu.org/faq.html#bugreport. - included the PREPROCESSED output (foo.i or foo.ii) in your report. - decide where to report the bug. Please send a CC to gcc@packages.debian.org, if you decide to report the bug directly to gcc-bugs@gcc.gnu.org. How to report a bug ------------------- [Taken from http://gcc.gnu.org/faq.html#bugreport] There are complete instructions in the gcc info manual, section Bugs. The manual can also be read using `M-x info' in Emacs, or if the GNU info program is installed on your system by `info --node "(gcc)Bugs"'. Or see the file BUGS included with the gcc source code. Before you report a bug for the C++ compiler, please check the list of well-known bugs. If you want to report a bug with an earlier version, we recommend upgrading to the current release first. In short, if gcc says Internal compiler error (or any other error that you'd like us to be able to reproduce, for that matter), please mail a bug report to gcc-bugs@gcc.gnu.org including: - The gcc version - The system type - All options you passed to gcc - Preprocessed output of the source file that caused the compiler error All this can normally be accomplished by mailing the command line, the output of the command, and the resulting `your-file.i' for C, or `your-file.ii' for C++, corresponding to: gcc -v --save-temps all-your-options your-file.c Typically the CPP output will be large, so please compress the resulting file with one of the popular compression programs such as gzip, bzip2, compress or pkzip, then include the compressed CPP output as an attachment to your message. The gcc lists have message size limits (100 kbytes) and bug reports over those limits will currently be bounced. We're trying to find a way to allow larger bug reports to be posted, but this is currently impossible. So, although we prefer to have complete bug reports archived, if you cannot reduce the bug report below the limit, please make it available for ftp or http and post the URL. Known Bugs and Non-Bugs ----------------------- [Please see /usr/share/doc/gcc/FAQ or http://gcc.gnu.org/faq.html first] C++ exceptions don't work with C libraries ------------------------------------------ [Taken from the closed bug report #22769] C++ exceptions don't work with C libraries, if the C code wasn't designed to be thrown through. A solution could be to translate all C libraries with -fexceptions. Mostly trying to throw an exception in a callback function (qsort, Tcl command callbacks, etc ...). Example: #include #include class A {}; static int SortCondition(void const*, void const*) { printf("throwing 'sortcondition' exception\n"); throw A(); } int main(int argc, char *argv[]) { int list[2]; try { SortCondition(NULL,NULL); } catch (A) { printf("caught test-sortcondition exception\n"); } try { qsort(&list, sizeof(list)/sizeof(list[0]),sizeof(list[0]), &SortCondition); } catch (A) { printf("caught real-sortcondition exception\n"); } return 0; } Andrew Macleod responded: When compiled with the table driven exception handling, exception can only be thrown through functions which have been compiled with the table driven EH. If a function isn't compiled that way, then we do not have the frame unwinding information required to restore the registers when unwinding. I believe the setjmp/longjmp mechanism will throw through things like this, but its produces much messier code. (-fsjlj-exceptions) The C compiler does support exceptions, you just have to turn them on with -fexceptions. Your main options are to: a) Don't use callbacks, or at least don't throw through them. b) Get the source and compile the library with -fexceptions (You have to explicitly turn on exceptions in the C compiler) c) always use -fsjlj-exceptions (boo, bad choice :-) g++: "undefined reference" to static const array in class --------------------------------------------------------- The following code compiles under GNU C++ 2.7.2 with correct results, but produces the same linker error with GNU C++ 2.95.2. Alexandre Oliva responded: All of them are correct. A static data member *must* be defined outside the class body even if it is initialized within the class body, but no diagnostic is required if the definition is missing. It turns out that some releases do emit references to the missing symbol, while others optimize it away. #include class Test { public: Test(const char *q); protected: static const unsigned char Jam_signature[4] = "JAM"; }; Test::Test(const char *q) { if (memcmp(q, Jam_signature, sizeof(Jam_signature)) != 0) cerr << "Hello world!\n"; } int main(void) { Test::Test("JAM"); return 0; } [EDIT ME: scan Debian bug reports and write some nice summaries ...]