summaryrefslogtreecommitdiff
path: root/contrib/gcc/BUGS
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/BUGS')
-rw-r--r--contrib/gcc/BUGS594
1 files changed, 594 insertions, 0 deletions
diff --git a/contrib/gcc/BUGS b/contrib/gcc/BUGS
new file mode 100644
index 0000000000000..d58a2296888af
--- /dev/null
+++ b/contrib/gcc/BUGS
@@ -0,0 +1,594 @@
+
+ GCC Bugs
+
+ The latest version of this document is always available at
+ [1]http://www.gnu.org/software/gcc/bugs.html.
+ _________________________________________________________________
+
+Table of Contents
+
+ * [2]Reporting Bugs
+ + [3]What we need
+ + [4]What we DON'T want
+ + [5]Where to post it
+ + [6]Detailed bug reporting instructions
+ + [7]Detailed bug reporting instructions for GNAT
+ * [8]Managing Bugs (GNATS and the test-suite)
+ * [9]Frequently Reported Bugs in GCC
+ + [10]General
+ + [11]Fortran
+ + [12]C
+ + [13]C++
+ o [14]Common problems updating from G++ 2.95 to G++ 3.0
+ o [15]Non-bugs
+ o [16]Missing features
+ o [17]Parse errors for "simple" code
+ o [18]Optimization at -O3 takes a very long time
+ _________________________________________________________________
+
+ Reporting Bugs
+
+ Our preferred way of receiving bugs is via the [19]GCC GNATS bug
+ reporting system.
+
+ Before you report a bug, please check the [20]list of well-known bugs
+ and, if possible in any way, try a current development snapshot. If
+ you want to report a bug with versions of GCC before 3.1 we strongly
+ recommend upgrading to the current release first.
+
+ Before reporting that GCC compiles your code incorrectly, please
+ compile it with gcc -Wall and see whether this shows anything wrong
+ with your code that could be the cause instead of a bug in GCC.
+
+Summarized bug reporting instructions
+
+ After this summary, you'll find detailed bug reporting instructions,
+ that explain how to obtain some of the information requested in this
+ summary.
+
+ What we need
+
+ Please include in your bug report all of the following items, the
+ first three of which can be obtained from the output of gcc -v:
+ * the exact version of GCC;
+ * the system type;
+ * the options given when GCC was configured/built;
+ * the complete command line that triggers the bug;
+ * the compiler output (error messages, warnings, etc.); and
+ * the preprocessed file (*.i*) that triggers the bug, generated by
+ adding -save-temps to the complete compilation command, or, in the
+ case of a bug report for the GNAT front end, a complete set of
+ source files (see below).
+
+ What we do not want
+
+ * A source file that #includes header files that are left out of the
+ bug report (see above)
+ * That source file and a collection of header files.
+ * An attached archive (tar, zip, shar, whatever) containing all (or
+ some :-) of the above.
+ * A code snippet that won't cause the compiler to produce the exact
+ output mentioned in the bug report (e.g., a snippet with just a
+ few lines around the one that apparently triggers the bug, with
+ some pieces replaced with ellipses or comments for extra
+ obfuscation :-)
+ * The location (URL) of the package that failed to build (we won't
+ download it, anyway, since you've already given us what we need to
+ duplicate the bug, haven't you? :-)
+ * An error that occurs only some of the times a certain file is
+ compiled, such that retrying a sufficient number of times results
+ in a successful compilation; this is a symptom of a hardware
+ problem, not of a compiler bug (sorry)
+ * E-mail messages that complement previous, incomplete bug reports.
+ Post a new, self-contained, full bug report instead, if possible
+ as a follow-up to the original bug report
+ * Assembly files (*.s) produced by the compiler, or any binary
+ files, such as object files, executables or core files
+ * Duplicate bug reports, or reports of bugs already fixed in the
+ development tree, especially those that have already been reported
+ as fixed last week :-)
+ * Bugs in the assembler, the linker or the C library. These are
+ separate projects, with separate mailing lists and different bug
+ reporting procedures
+ * Bugs in releases or snapshots of GCC not issued by the GNU
+ Project. Report them to whoever provided you with the release
+ * Questions about the correctness or the expected behavior of
+ certain constructs that are not GCC extensions. Ask them in forums
+ dedicated to the discussion of the programming language
+
+ Where to post it
+
+ Please submit your bug report directly to the [21]GCC GNATS bug
+ database. Only if this is not possible, mail all information to
+ [22]bug-gcc@gnu.org or [23]gcc-bugs@gcc.gnu.org.
+
+ The GCC lists have message size limits (200 kbytes) and bug reports
+ over those limits will currently be bounced. If your bug is larger
+ than that, please post it using the [24]GCC GNATS bug database.
+
+Detailed bug reporting instructions
+
+ Please refer to the [25]next section when reporting bugs in GNAT, the
+ Ada compiler.
+
+ In general, all the information we need can be obtained by collecting
+ the command line below, as well as its output and the preprocessed
+ file it generates.
+
+ gcc -v -save-temps all-your-options source-file
+
+ Typically the preprocessed file (extension .i for C or .ii for C++)
+ will be large, so please compress the resulting file with one of the
+ popular compression programs such as bzip2, gzip, zip or compress (in
+ decreasing order of preference). Use maximum compression (-9) if
+ available. Please include the compressed preprocessor output in your
+ bug report, even if the source code is freely available elsewhere; it
+ makes the job of our volunteer testers much easier.
+
+ The only excuses to not send us the preprocessed sources are (i) if
+ you've found a bug in the preprocessor, or (ii) if you've reduced the
+ testcase to a small file that doesn't include any other file. If you
+ can't post the preprocessed sources because they're proprietary code,
+ then try to create a small file that triggers the same problem.
+
+ Since we're supposed to be able to re-create the assembly output
+ (extension .s), you usually should not include it in the bug report,
+ although you may want to post parts of it to point out assembly code
+ you consider to be wrong.
+
+ Whether to use MIME attachments or uuencode is up to you. In any case,
+ make sure the compiler command line, version and error output are in
+ plain text, so that we don't have to decode the bug report in order to
+ tell who should take care of it. A meaningful subject indicating
+ language and platform also helps.
+
+ Please avoid posting an archive (.tar, .shar or .zip); we generally
+ need just a single file to reproduce the bug (the .i/.ii preprocessed
+ file), and, by storing it in an archive, you're just making our
+ volunteers' jobs harder. Only when your bug report requires multiple
+ source files to be reproduced should you use an archive. In any case,
+ make sure the compiler version, error message, etc, are included in
+ the body of your bug report as plain text, even if needlessly
+ duplicated as part of an archive.
+
+ If you fail to supply enough information for a bug report to be
+ reproduced, someone will probably ask you to post additional
+ information (or just ignore your bug report, if they're in a bad day,
+ so try to get it right on the first posting :-). In this case, please
+ post the additional information to the bug reporting mailing list, not
+ just to the person who requested it, unless explicitly told so. If
+ possible, please include in this follow-up all the information you had
+ supplied in the incomplete bug report (including the preprocessor
+ output), so that the new bug report is self-contained.
+
+Detailed bug reporting instructions for GNAT
+
+ See the [26]previous section for bug reporting instructions for GCC
+ language implementations other than Ada.
+
+ Bug reports have to contain at least the following information in
+ order to be useful:
+ * the exact version of GCC, as shown by "gcc -v";
+ * the system type;
+ * the options when GCC was configured/built;
+ * the exact command line passed to the gcc program triggering the
+ bug (not just the flags passed to gnatmake, but gnatmake prints
+ the parameters it passed to gcc)
+ * a collection of source files for reproducing the bug, preferably a
+ minimal set (see below);
+ * a description of the expected behavior;
+ * a description of actual behavior.
+
+ If your code depends on additional source files (usually package
+ specifications), submit the source code for these compilation units in
+ a single file that is acceptable input to gnatchop, i.e. contains no
+ non-Ada text. If the compilation terminated normally, you can usually
+ obtain a list of dependencies using the "gnatls -d main_unit" command,
+ where main_unit is the file name of the main compilation unit (which
+ is also passed to gcc).
+
+ If you report a bug which causes the compiler to print a bug box,
+ include that bug box in your report, and do not forget to send all the
+ source files listed after the bug box along with your report.
+
+ If you use gnatprep, be sure to send in preprocessed sources (unless
+ you have to report a bug in gnatprep).
+
+ When you have checked that your report meets these criteria, please
+ submit it accoding to our [27]generic instructions. (If you use a
+ mailing list for reporting, please include an "[Ada]" tag in the
+ subject.)
+
+ Managing Bugs (GNATS and the test-suite)
+
+ This section contains information mostly intended for GCC
+ contributors.
+
+ If you find a bug, but you are not fixing it (yet):
+ 1. Create a (minimal) test-case.
+ 2. Add the test-case to our test-suite, marking it as XFAIL unless
+ the bug is a regression.
+ 3. Add a bug report referencing the test-case to GNATS.
+
+ If you fix a bug for which there is already a GNATS entry:
+ 1. Remove the XFAIL on the test-case.
+ 2. Close the bug report in GNATS.
+
+ If you find a bug, and you are fixing it right then:
+ 1. Create a (minimal) test-case.
+ 2. Add the test-case to our test-suite, marking it as PASS.
+ 3. Check in your fixes.
+ _________________________________________________________________
+
+ Frequently Reported Bugs in GCC
+
+Fortran
+
+ Fortran bugs are documented in the G77 manual rather than explicitly
+ listed here. Please see [28]Known Causes of Trouble with GNU Fortran
+ in the G77 manual.
+ _________________________________________________________________
+
+C
+
+ The following are not bugs in the C compiler, but are reported often
+ enough to warrant a mention here.
+
+ Cannot initialize a static variable with stdin.
+ This has nothing to do with GCC, but people ask us about it a
+ lot. Code like this:
+
+#include <stdio.h>
+
+FILE *yyin = stdin;
+
+ will not compile with GNU libc (GNU/Linux libc6), because stdin
+ is not a constant. This was done deliberately, to make it
+ easier to maintain binary compatibility when the type FILE
+ needs to be changed. It is surprising for people used to
+ traditional Unix C libraries, but it is permitted by the C
+ standard.
+
+ This construct commonly occurs in code generated by old
+ versions of lex or yacc. We suggest you try regenerating the
+ parser with a current version of flex or bison, respectively.
+ In your own code, the appropriate fix is to move the
+ initialization to the beginning of main.
+
+ There is a common misconception that the GCC developers are
+ responsible for GNU libc. These are in fact two entirely
+ separate projects; please check the [29]GNU libc web pages for
+ details.
+
+ Cannot use preprocessor directive in macro arguments.
+ Let me guess... you wrote code that looks something like this:
+
+ memcpy(dest, src,
+#ifdef PLATFORM1
+ 12
+#else
+ 24
+#endif
+ );
+
+ and you got a whole pile of error messages:
+
+ test.c:11: warning: preprocessing directive not recognized within
+ macro arg
+ test.c:11: warning: preprocessing directive not recognized within
+ macro arg
+ test.c:11: warning: preprocessing directive not recognized within
+ macro arg
+ test.c: In function `foo':
+ test.c:6: undefined or invalid # directive
+ test.c:8: undefined or invalid # directive
+ test.c:9: parse error before `24'
+ test.c:10: undefined or invalid # directive
+ test.c:11: parse error before `#'
+
+ Update: As of GCC 3.2 this kind of construct is always accepted
+ and CPP will probably do what you expect, but see the manual
+ for detailed semantics.
+
+ However, versions of GCC prior to 3.2 did not allow you to put
+ #ifdef (or any other directive) inside the arguments of a
+ macro. Your C library's <string.h> happens to define memcpy as
+ a macro - this is perfectly legitimate. The code therefore
+ would not compile.
+
+ This kind of code is not portable. It is "undefined behavior"
+ according to the C standard; that means different compilers
+ will do different things with it. It is always possible to
+ rewrite code which uses conditionals inside macros so that it
+ doesn't. You could write the above example
+
+#ifdef PLATFORM1
+ memcpy(dest, src, 12);
+#else
+ memcpy(dest, src, 24);
+#endif
+
+ This is a bit more typing, but I personally think it's better
+ style in addition to being more portable.
+
+ In recent versions of glibc, printf is among the functions
+ which are implemented as macros.
+ _________________________________________________________________
+
+C++
+
+ This is the list of bugs (and non-bugs) in g++ (aka GNU C++) that are
+ reported very often, but not yet fixed. While it is certainly better
+ to fix bugs instead of documenting them, this document might save
+ people the effort of writing a bug report when the bug is already
+ well-known. [30]How to report bugs tells you how to report a bug.
+
+ There are many reasons why reported bugs don't get fixed. It might be
+ difficult to fix, or fixing it might break compatibility. Often,
+ reports get a low priority when there is a simple work-around. In
+ particular, bugs caused by invalid C++ code have a simple work-around,
+ fix the code. Now that there is an agreed ISO/ANSI standard for C++,
+ the compiler has a definitive document to adhere to. Earlier versions
+ might have accepted source code that is no longer C++. This means that
+ code which might have `worked' in a previous version, is now rejected.
+ You should update your code to be C++.
+
+ You should try to use the latest stable release of the GNU C++
+ compiler.
+
+ Common problems updating from G++ 2.95 to G++ 3.0
+
+ G++ 3.0 conforms much closer to the ISO C++ standard (available at
+ [31]http://www.ncits.org/cplusplus.htm).
+
+ We have also implemented some of the core and library defect reports
+ (available at
+ [32]http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html &
+ [33]http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html
+ respectively).
+ * The ABI has changed. This means that both class layout and name
+ mangling is different. You must recompile all c++ libraries (if
+ you don't you will get link errors).
+ * The standard library is much more conformant, and uses the std::
+ namespace.
+ * std:: is now a real namespace, not an alias for ::.
+ * The standard header files for the c library don't end with .h, but
+ begin with c (i.e. <cstdlib> rather than <stdlib.h>). The .h names
+ are still available, but are deprecated.
+ * <strstream> is deprecated, use <sstream> instead.
+ * streambuf::seekoff & streambuf::seekpos are private, instead use
+ streambuf::pubseekoff & streambuf::pubseekpos respectively.
+ * If std::operator << (std::ostream &, long long) doesn't exist, you
+ need to recompile libstdc++ with --enable-long-long.
+
+ This means you may get lots of errors about things like strcmp not
+ being found. You've most likely forgotton to tell the compiler to look
+ in the std:: namespace. There are several ways to do this,
+ * Say, std::strcmp at the call. This is the most explicit way of
+ saying what you mean.
+ * Say, using std::strcmp; somewhere before the call. You will need
+ to do this for each function or type you wish to use from the
+ standard library.
+ * Say, using namespace std; somewhere before the call. This is the
+ quick-but-dirty fix. This brings the whole of the std:: namespace
+ into scope. Never do this in a header file, as you will be forcing
+ users of your header file to do the same.
+
+ ABI bugs
+
+ 3.0 had a new ABI, which affected class layout, function mangling and
+ calling conventions. We had intended it to be complete, unfortunately
+ some issues came to light, too late to fix in the 3.0 series. The ABI
+ should not change in dot releases, so we addressed most issues in GCC
+ 3.1.
+
+ Covariant return types
+ We do not implement non-trivial covariant returns. We also
+ generate incorrect virtual function tables for trivial
+ covariance. Although trivial covariance will work, it is
+ incompatible with the ABI. GNATS PR 3706 tracks this problem.
+
+ Non-bugs
+
+ Here are some features that have been reported as bugs, but are not.
+
+ Nested classes can access private types of the containing class.
+ G++ now implements type access control on member types. Defect
+ report 45 clarifies that nested classes are members of the
+ class they are nested in, and so are granted access to private
+ members of that class.
+
+ Classes in exception specifiers must be complete types.
+ [15.4]/1 tells you that you cannot have an incomplete type, or
+ pointer to incomplete (other than cv void *) in an exception
+ specification.
+
+ G++ emits two copies of constructors and destructors.
+ In general there are three types of constructors (and
+ destructors).
+
+ 1. The complete object constructor/destructor.
+ 2. The base object constructor/destructor.
+ 3. The allocating destructor/deallocating destructor.
+
+ The first two are different, when virtual base classes are
+ involved. In some cases we can do better, and this is logged in
+ GNATS.
+
+ Exceptions don't work in multithreaded applications.
+ You need to rebuild g++ and libstdc++ with --enable-threads.
+ Remember, c++ exceptions are not like hardware interrupts. You
+ cannot throw an exception in one thread and catch it in
+ another. You cannot throw an exception from a signal handler,
+ and catch it in the main thread.
+
+ Global destructors are not run in the correct order.
+ Global destructors should be run in the reverse order of their
+ constructors completing. In most cases this is the same as the
+ reverse order of constructors starting, but sometimes it is
+ different, and that is important. You need to compile and link
+ your programs with --use-cxa-atexit. We have not turned this
+ switch on by default, as it requires a cxa aware runtime
+ library (libc, glibc, or equivalent).
+
+ Problems with floating point computations.
+ In a number of cases, GCC appears to perform floating point
+ computations incorrectly. For example, the program
+
+ #include <iostream>
+ int main() {
+ double min = 0.0;
+ double max = 0.5;
+ double width = 0.01;
+ std::cout << (int)(((max - min) / width) - 1) << std::endl;
+ }
+
+ might print 50 on some systems and optimization levels, and 51
+ on others.
+
+ The is the result of rounding: The computer cannot represent
+ all real numbers exactly, so it has to use approximations. When
+ computing with approximation, the computer needs to round to
+ the nearest representable number.
+
+ This is not a bug in the compiler, but an inherent limitation
+ of the float and double types. Please study [34]this paper for
+ more information.
+
+ Templates, scoping, and digraphs.
+ If you have a class in global namespace, say named X, and want
+ to give it as a template argument to some other class, say
+ std::vector, then this here fails with a parser error:
+ std::vector<::X>.
+
+ The reason is that the standard mandates that the sequence <:
+ is treated as if it were the token [, and the parser then
+ reports a parse error before the character : (by which it means
+ the second colon). There are several such combinations of
+ characters, and they are called digraphs.
+
+ The simplest way to avoid this is to write std::vector< ::X>,
+ i.e. place a space between the opening angle bracket and the
+ scope operator.
+
+ Missing features
+
+ We know some things are missing from G++.
+
+ The export keyword is not implemented.
+ Most C++ compilers (G++ included) do not yet implement export,
+ which is necessary for separate compilation of template
+ declarations and definitions. Without export, a template
+ definition must be in scope to be used. The obvious workaround
+ is simply to place all definitions in the header itself.
+ Alternatively, the compilation unit containing template
+ definitions may be included from the header.
+
+ Two stage lookup in templates is not implemented.
+ [14.6] specifies how names are looked up inside a template. G++
+ does not do this correctly, but for most templates this will
+ not be noticeable.
+
+ Parse errors for "simple" code
+
+ Up to and including GCC 3.0, the compiler will give "parse error" for
+ seemingly simple code, such as
+struct A{
+ A();
+ A(int);
+ void func();
+};
+
+struct B{
+ B(A);
+ B(A,A);
+ void func();
+};
+
+void foo(){
+ B b(A(),A(1)); //Variable b, initialized with two temporaries
+ B(A(2)).func(); //B temporary, initialized with A temporary
+}
+
+ The problem is that GCC starts to parse the declaration of b as a
+ function b returning B, taking a function returning A as an argument.
+ When it sees the 1, it is too late. The work-around in these cases is
+ to add additional parentheses around the expressions that are mistaken
+ as declarations:
+ (B(A(2))).func();
+
+ Sometimes, even that is not enough; to show the compiler that this
+ should be really an expression, a comma operator with a dummy argument
+ can be used:
+ B b((0,A()),A(1));
+
+ Another example is the parse error for the return statement in
+struct A{};
+
+struct B{
+ A a;
+ A f1(bool);
+};
+
+A B::f1(bool b)
+{
+ if (b)
+ return (A());
+ return a;
+}
+
+ The problem is that the compiler interprets A() as a function (taking
+ no arguments, returning A), and (A()) as a cast - with a missing
+ expression, hence the parse error. The work-around is to omit the
+ parentheses:
+ if (b)
+ return A();
+
+ This problem occurs in a number of variants; in throw statements,
+ people also frequently put the object in parentheses. The exact error
+ also somewhat varies with the compiler version. The work-arounds
+ proposed do not change the semantics of the program at all; they make
+ them perhaps less readable.
+
+ Optimization at -O3 takes a very long time
+
+ At -O3, all functions are candidates for inlining. The heuristic used
+ has some deficiencies which show up when allowed such freedom. This is
+ g++ specific, as it has an earlier inliner than gcc.
+
+References
+
+ 1. http://www.gnu.org/software/gcc/bugs.html
+ 2. http://gcc.gnu.org/bugs.html#report
+ 3. http://gcc.gnu.org/bugs.html#need
+ 4. http://gcc.gnu.org/bugs.html#dontwant
+ 5. http://gcc.gnu.org/bugs.html#where
+ 6. http://gcc.gnu.org/bugs.html#detailed
+ 7. http://gcc.gnu.org/bugs.html#gnat
+ 8. http://gcc.gnu.org/bugs.html#manage
+ 9. http://gcc.gnu.org/bugs.html#known
+ 10. http://gcc.gnu.org/bugs.html#general
+ 11. http://gcc.gnu.org/bugs.html#fortran
+ 12. http://gcc.gnu.org/bugs.html#c
+ 13. http://gcc.gnu.org/bugs.html#cplusplus
+ 14. http://gcc.gnu.org/bugs.html#updating
+ 15. http://gcc.gnu.org/bugs.html#nonbugs
+ 16. http://gcc.gnu.org/bugs.html#missing
+ 17. http://gcc.gnu.org/bugs.html#parsing
+ 18. http://gcc.gnu.org/bugs.html#-O3
+ 19. http://gcc.gnu.org/gnats.html
+ 20. http://gcc.gnu.org/bugs.html#known
+ 21. http://gcc.gnu.org/gnats.html
+ 22. mailto:bug-gcc@gnu.org
+ 23. mailto:gcc-bugs@gcc.gnu.org
+ 24. http://gcc.gnu.org/gnats.html
+ 25. http://gcc.gnu.org/bugs.html#gnat
+ 26. http://gcc.gnu.org/bugs.html#detailed
+ 27. http://gcc.gnu.org/bugs.html#where
+ 28. http://gcc.gnu.org/onlinedocs/g77/Trouble.html
+ 29. http://www.gnu.org/software/glibc/
+ 30. http://gcc.gnu.org/bugs.html#report
+ 31. http://www.ncits.org/cplusplus.htm
+ 32. http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html
+ 33. http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html
+ 34. http://www.validlab.com/goldberg/paper.ps