summaryrefslogtreecommitdiffstats
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, 0 insertions, 594 deletions
diff --git a/contrib/gcc/BUGS b/contrib/gcc/BUGS
deleted file mode 100644
index d58a229..0000000
--- a/contrib/gcc/BUGS
+++ /dev/null
@@ -1,594 +0,0 @@
-
- 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
OpenPOWER on IntegriCloud