mirror of
https://github.com/pmret/gcc-papermario.git
synced 2024-11-09 20:32:32 +01:00
1000 lines
44 KiB
Plaintext
1000 lines
44 KiB
Plaintext
|
This is Info file gcc.info, produced by Makeinfo version 1.67 from the
|
|||
|
input file gcc.texi.
|
|||
|
|
|||
|
This file documents the use and the internals of the GNU compiler.
|
|||
|
|
|||
|
Published by the Free Software Foundation 59 Temple Place - Suite 330
|
|||
|
Boston, MA 02111-1307 USA
|
|||
|
|
|||
|
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998
|
|||
|
Free Software Foundation, Inc.
|
|||
|
|
|||
|
Permission is granted to make and distribute verbatim copies of this
|
|||
|
manual provided the copyright notice and this permission notice are
|
|||
|
preserved on all copies.
|
|||
|
|
|||
|
Permission is granted to copy and distribute modified versions of
|
|||
|
this manual under the conditions for verbatim copying, provided also
|
|||
|
that the sections entitled "GNU General Public License," "Funding for
|
|||
|
Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
|
|||
|
included exactly as in the original, and provided that the entire
|
|||
|
resulting derived work is distributed under the terms of a permission
|
|||
|
notice identical to this one.
|
|||
|
|
|||
|
Permission is granted to copy and distribute translations of this
|
|||
|
manual into another language, under the above conditions for modified
|
|||
|
versions, except that the sections entitled "GNU General Public
|
|||
|
License," "Funding for Free Software," and "Protect Your Freedom--Fight
|
|||
|
`Look And Feel'", and this permission notice, may be included in
|
|||
|
translations approved by the Free Software Foundation instead of in the
|
|||
|
original English.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble
|
|||
|
|
|||
|
Problems Compiling Certain Programs
|
|||
|
===================================
|
|||
|
|
|||
|
Certain programs have problems compiling.
|
|||
|
|
|||
|
* Parse errors may occur compiling X11 on a Decstation running
|
|||
|
Ultrix 4.2 because of problems in DEC's versions of the X11 header
|
|||
|
files `X11/Xlib.h' and `X11/Xutil.h'. People recommend adding
|
|||
|
`-I/usr/include/mit' to use the MIT versions of the header files,
|
|||
|
using the `-traditional' switch to turn off ANSI C, or fixing the
|
|||
|
header files by adding this:
|
|||
|
|
|||
|
#ifdef __STDC__
|
|||
|
#define NeedFunctionPrototypes 0
|
|||
|
#endif
|
|||
|
|
|||
|
* If you have trouble compiling Perl on a SunOS 4 system, it may be
|
|||
|
because Perl specifies `-I/usr/ucbinclude'. This accesses the
|
|||
|
unfixed header files. Perl specifies the options
|
|||
|
|
|||
|
-traditional -Dvolatile=__volatile__
|
|||
|
-I/usr/include/sun -I/usr/ucbinclude
|
|||
|
-fpcc-struct-return
|
|||
|
|
|||
|
most of which are unnecessary with GCC 2.4.5 and newer versions.
|
|||
|
You can make a properly working Perl by setting `ccflags' to
|
|||
|
`-fwritable-strings' (implied by the `-traditional' in the
|
|||
|
original options) and `cppflags' to empty in `config.sh', then
|
|||
|
typing `./doSH; make depend; make'.
|
|||
|
|
|||
|
* On various 386 Unix systems derived from System V, including SCO,
|
|||
|
ISC, and ESIX, you may get error messages about running out of
|
|||
|
virtual memory while compiling certain programs.
|
|||
|
|
|||
|
You can prevent this problem by linking GNU CC with the GNU malloc
|
|||
|
(which thus replaces the malloc that comes with the system). GNU
|
|||
|
malloc is available as a separate package, and also in the file
|
|||
|
`src/gmalloc.c' in the GNU Emacs 19 distribution.
|
|||
|
|
|||
|
If you have installed GNU malloc as a separate library package,
|
|||
|
use this option when you relink GNU CC:
|
|||
|
|
|||
|
MALLOC=/usr/local/lib/libgmalloc.a
|
|||
|
|
|||
|
Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
|
|||
|
the object file to `gmalloc.o' and use this option when you relink
|
|||
|
GNU CC:
|
|||
|
|
|||
|
MALLOC=gmalloc.o
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: External Bugs, Up: Trouble
|
|||
|
|
|||
|
Incompatibilities of GNU CC
|
|||
|
===========================
|
|||
|
|
|||
|
There are several noteworthy incompatibilities between GNU C and most
|
|||
|
existing (non-ANSI) versions of C. The `-traditional' option
|
|||
|
eliminates many of these incompatibilities, *but not all*, by telling
|
|||
|
GNU C to behave like the other C compilers.
|
|||
|
|
|||
|
* GNU CC normally makes string constants read-only. If several
|
|||
|
identical-looking string constants are used, GNU CC stores only one
|
|||
|
copy of the string.
|
|||
|
|
|||
|
One consequence is that you cannot call `mktemp' with a string
|
|||
|
constant argument. The function `mktemp' always alters the string
|
|||
|
its argument points to.
|
|||
|
|
|||
|
Another consequence is that `sscanf' does not work on some systems
|
|||
|
when passed a string constant as its format control string or
|
|||
|
input. This is because `sscanf' incorrectly tries to write into
|
|||
|
the string constant. Likewise `fscanf' and `scanf'.
|
|||
|
|
|||
|
The best solution to these problems is to change the program to use
|
|||
|
`char'-array variables with initialization strings for these
|
|||
|
purposes instead of string constants. But if this is not possible,
|
|||
|
you can use the `-fwritable-strings' flag, which directs GNU CC to
|
|||
|
handle string constants the same way most C compilers do.
|
|||
|
`-traditional' also has this effect, among others.
|
|||
|
|
|||
|
* `-2147483648' is positive.
|
|||
|
|
|||
|
This is because 2147483648 cannot fit in the type `int', so
|
|||
|
(following the ANSI C rules) its data type is `unsigned long int'.
|
|||
|
Negating this value yields 2147483648 again.
|
|||
|
|
|||
|
* GNU CC does not substitute macro arguments when they appear inside
|
|||
|
of string constants. For example, the following macro in GNU CC
|
|||
|
|
|||
|
#define foo(a) "a"
|
|||
|
|
|||
|
will produce output `"a"' regardless of what the argument A is.
|
|||
|
|
|||
|
The `-traditional' option directs GNU CC to handle such cases
|
|||
|
(among others) in the old-fashioned (non-ANSI) fashion.
|
|||
|
|
|||
|
* When you use `setjmp' and `longjmp', the only automatic variables
|
|||
|
guaranteed to remain valid are those declared `volatile'. This is
|
|||
|
a consequence of automatic register allocation. Consider this
|
|||
|
function:
|
|||
|
|
|||
|
jmp_buf j;
|
|||
|
|
|||
|
foo ()
|
|||
|
{
|
|||
|
int a, b;
|
|||
|
|
|||
|
a = fun1 ();
|
|||
|
if (setjmp (j))
|
|||
|
return a;
|
|||
|
|
|||
|
a = fun2 ();
|
|||
|
/* `longjmp (j)' may occur in `fun3'. */
|
|||
|
return a + fun3 ();
|
|||
|
}
|
|||
|
|
|||
|
Here `a' may or may not be restored to its first value when the
|
|||
|
`longjmp' occurs. If `a' is allocated in a register, then its
|
|||
|
first value is restored; otherwise, it keeps the last value stored
|
|||
|
in it.
|
|||
|
|
|||
|
If you use the `-W' option with the `-O' option, you will get a
|
|||
|
warning when GNU CC thinks such a problem might be possible.
|
|||
|
|
|||
|
The `-traditional' option directs GNU C to put variables in the
|
|||
|
stack by default, rather than in registers, in functions that call
|
|||
|
`setjmp'. This results in the behavior found in traditional C
|
|||
|
compilers.
|
|||
|
|
|||
|
* Programs that use preprocessing directives in the middle of macro
|
|||
|
arguments do not work with GNU CC. For example, a program like
|
|||
|
this will not work:
|
|||
|
|
|||
|
foobar (
|
|||
|
#define luser
|
|||
|
hack)
|
|||
|
|
|||
|
ANSI C does not permit such a construct. It would make sense to
|
|||
|
support it when `-traditional' is used, but it is too much work to
|
|||
|
implement.
|
|||
|
|
|||
|
* Declarations of external variables and functions within a block
|
|||
|
apply only to the block containing the declaration. In other
|
|||
|
words, they have the same scope as any other declaration in the
|
|||
|
same place.
|
|||
|
|
|||
|
In some other C compilers, a `extern' declaration affects all the
|
|||
|
rest of the file even if it happens within a block.
|
|||
|
|
|||
|
The `-traditional' option directs GNU C to treat all `extern'
|
|||
|
declarations as global, like traditional compilers.
|
|||
|
|
|||
|
* In traditional C, you can combine `long', etc., with a typedef
|
|||
|
name, as shown here:
|
|||
|
|
|||
|
typedef int foo;
|
|||
|
typedef long foo bar;
|
|||
|
|
|||
|
In ANSI C, this is not allowed: `long' and other type modifiers
|
|||
|
require an explicit `int'. Because this criterion is expressed by
|
|||
|
Bison grammar rules rather than C code, the `-traditional' flag
|
|||
|
cannot alter it.
|
|||
|
|
|||
|
* PCC allows typedef names to be used as function parameters. The
|
|||
|
difficulty described immediately above applies here too.
|
|||
|
|
|||
|
* PCC allows whitespace in the middle of compound assignment
|
|||
|
operators such as `+='. GNU CC, following the ANSI standard, does
|
|||
|
not allow this. The difficulty described immediately above
|
|||
|
applies here too.
|
|||
|
|
|||
|
* GNU CC complains about unterminated character constants inside of
|
|||
|
preprocessing conditionals that fail. Some programs have English
|
|||
|
comments enclosed in conditionals that are guaranteed to fail; if
|
|||
|
these comments contain apostrophes, GNU CC will probably report an
|
|||
|
error. For example, this code would produce an error:
|
|||
|
|
|||
|
#if 0
|
|||
|
You can't expect this to work.
|
|||
|
#endif
|
|||
|
|
|||
|
The best solution to such a problem is to put the text into an
|
|||
|
actual C comment delimited by `/*...*/'. However, `-traditional'
|
|||
|
suppresses these error messages.
|
|||
|
|
|||
|
* Many user programs contain the declaration `long time ();'. In the
|
|||
|
past, the system header files on many systems did not actually
|
|||
|
declare `time', so it did not matter what type your program
|
|||
|
declared it to return. But in systems with ANSI C headers, `time'
|
|||
|
is declared to return `time_t', and if that is not the same as
|
|||
|
`long', then `long time ();' is erroneous.
|
|||
|
|
|||
|
The solution is to change your program to use `time_t' as the
|
|||
|
return type of `time'.
|
|||
|
|
|||
|
* When compiling functions that return `float', PCC converts it to a
|
|||
|
double. GNU CC actually returns a `float'. If you are concerned
|
|||
|
with PCC compatibility, you should declare your functions to return
|
|||
|
`double'; you might as well say what you mean.
|
|||
|
|
|||
|
* When compiling functions that return structures or unions, GNU CC
|
|||
|
output code normally uses a method different from that used on most
|
|||
|
versions of Unix. As a result, code compiled with GNU CC cannot
|
|||
|
call a structure-returning function compiled with PCC, and vice
|
|||
|
versa.
|
|||
|
|
|||
|
The method used by GNU CC is as follows: a structure or union
|
|||
|
which is 1, 2, 4 or 8 bytes long is returned like a scalar. A
|
|||
|
structure or union with any other size is stored into an address
|
|||
|
supplied by the caller (usually in a special, fixed register, but
|
|||
|
on some machines it is passed on the stack). The
|
|||
|
machine-description macros `STRUCT_VALUE' and
|
|||
|
`STRUCT_INCOMING_VALUE' tell GNU CC where to pass this address.
|
|||
|
|
|||
|
By contrast, PCC on most target machines returns structures and
|
|||
|
unions of any size by copying the data into an area of static
|
|||
|
storage, and then returning the address of that storage as if it
|
|||
|
were a pointer value. The caller must copy the data from that
|
|||
|
memory area to the place where the value is wanted. GNU CC does
|
|||
|
not use this method because it is slower and nonreentrant.
|
|||
|
|
|||
|
On some newer machines, PCC uses a reentrant convention for all
|
|||
|
structure and union returning. GNU CC on most of these machines
|
|||
|
uses a compatible convention when returning structures and unions
|
|||
|
in memory, but still returns small structures and unions in
|
|||
|
registers.
|
|||
|
|
|||
|
You can tell GNU CC to use a compatible convention for all
|
|||
|
structure and union returning with the option
|
|||
|
`-fpcc-struct-return'.
|
|||
|
|
|||
|
* GNU C complains about program fragments such as `0x74ae-0x4000'
|
|||
|
which appear to be two hexadecimal constants separated by the minus
|
|||
|
operator. Actually, this string is a single "preprocessing token".
|
|||
|
Each such token must correspond to one token in C. Since this
|
|||
|
does not, GNU C prints an error message. Although it may appear
|
|||
|
obvious that what is meant is an operator and two values, the ANSI
|
|||
|
C standard specifically requires that this be treated as erroneous.
|
|||
|
|
|||
|
A "preprocessing token" is a "preprocessing number" if it begins
|
|||
|
with a digit and is followed by letters, underscores, digits,
|
|||
|
periods and `e+', `e-', `E+', or `E-' character sequences.
|
|||
|
|
|||
|
To make the above program fragment valid, place whitespace in
|
|||
|
front of the minus sign. This whitespace will end the
|
|||
|
preprocessing number.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble
|
|||
|
|
|||
|
Fixed Header Files
|
|||
|
==================
|
|||
|
|
|||
|
GNU CC needs to install corrected versions of some system header
|
|||
|
files. This is because most target systems have some header files that
|
|||
|
won't work with GNU CC unless they are changed. Some have bugs, some
|
|||
|
are incompatible with ANSI C, and some depend on special features of
|
|||
|
other compilers.
|
|||
|
|
|||
|
Installing GNU CC automatically creates and installs the fixed header
|
|||
|
files, by running a program called `fixincludes' (or for certain
|
|||
|
targets an alternative such as `fixinc.svr4'). Normally, you don't
|
|||
|
need to pay attention to this. But there are cases where it doesn't do
|
|||
|
the right thing automatically.
|
|||
|
|
|||
|
* If you update the system's header files, such as by installing a
|
|||
|
new system version, the fixed header files of GNU CC are not
|
|||
|
automatically updated. The easiest way to update them is to
|
|||
|
reinstall GNU CC. (If you want to be clever, look in the makefile
|
|||
|
and you can find a shortcut.)
|
|||
|
|
|||
|
* On some systems, in particular SunOS 4, header file directories
|
|||
|
contain machine-specific symbolic links in certain places. This
|
|||
|
makes it possible to share most of the header files among hosts
|
|||
|
running the same version of SunOS 4 on different machine models.
|
|||
|
|
|||
|
The programs that fix the header files do not understand this
|
|||
|
special way of using symbolic links; therefore, the directory of
|
|||
|
fixed header files is good only for the machine model used to
|
|||
|
build it.
|
|||
|
|
|||
|
In SunOS 4, only programs that look inside the kernel will notice
|
|||
|
the difference between machine models. Therefore, for most
|
|||
|
purposes, you need not be concerned about this.
|
|||
|
|
|||
|
It is possible to make separate sets of fixed header files for the
|
|||
|
different machine models, and arrange a structure of symbolic
|
|||
|
links so as to use the proper set, but you'll have to do this by
|
|||
|
hand.
|
|||
|
|
|||
|
* On Lynxos, GNU CC by default does not fix the header files. This
|
|||
|
is because bugs in the shell cause the `fixincludes' script to
|
|||
|
fail.
|
|||
|
|
|||
|
This means you will encounter problems due to bugs in the system
|
|||
|
header files. It may be no comfort that they aren't GNU CC's
|
|||
|
fault, but it does mean that there's nothing for us to do about
|
|||
|
them.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble
|
|||
|
|
|||
|
Standard Libraries
|
|||
|
==================
|
|||
|
|
|||
|
GNU CC by itself attempts to be what the ISO/ANSI C standard calls a
|
|||
|
"conforming freestanding implementation". This means all ANSI C
|
|||
|
language features are available, as well as the contents of `float.h',
|
|||
|
`limits.h', `stdarg.h', and `stddef.h'. The rest of the C library is
|
|||
|
supplied by the vendor of the operating system. If that C library
|
|||
|
doesn't conform to the C standards, then your programs might get
|
|||
|
warnings (especially when using `-Wall') that you don't expect.
|
|||
|
|
|||
|
For example, the `sprintf' function on SunOS 4.1.3 returns `char *'
|
|||
|
while the C standard says that `sprintf' returns an `int'. The
|
|||
|
`fixincludes' program could make the prototype for this function match
|
|||
|
the Standard, but that would be wrong, since the function will still
|
|||
|
return `char *'.
|
|||
|
|
|||
|
If you need a Standard compliant library, then you need to find one,
|
|||
|
as GNU CC does not provide one. The GNU C library (called `glibc') has
|
|||
|
been ported to a number of operating systems, and provides ANSI/ISO,
|
|||
|
POSIX, BSD and SystemV compatibility. You could also ask your operating
|
|||
|
system vendor if newer libraries are available.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Disappointments, Next: C++ Misunderstandings, Prev: Standard Libraries, Up: Trouble
|
|||
|
|
|||
|
Disappointments and Misunderstandings
|
|||
|
=====================================
|
|||
|
|
|||
|
These problems are perhaps regrettable, but we don't know any
|
|||
|
practical way around them.
|
|||
|
|
|||
|
* Certain local variables aren't recognized by debuggers when you
|
|||
|
compile with optimization.
|
|||
|
|
|||
|
This occurs because sometimes GNU CC optimizes the variable out of
|
|||
|
existence. There is no way to tell the debugger how to compute the
|
|||
|
value such a variable "would have had", and it is not clear that
|
|||
|
would be desirable anyway. So GNU CC simply does not mention the
|
|||
|
eliminated variable when it writes debugging information.
|
|||
|
|
|||
|
You have to expect a certain amount of disagreement between the
|
|||
|
executable and your source code, when you use optimization.
|
|||
|
|
|||
|
* Users often think it is a bug when GNU CC reports an error for code
|
|||
|
like this:
|
|||
|
|
|||
|
int foo (struct mumble *);
|
|||
|
|
|||
|
struct mumble { ... };
|
|||
|
|
|||
|
int foo (struct mumble *x)
|
|||
|
{ ... }
|
|||
|
|
|||
|
This code really is erroneous, because the scope of `struct
|
|||
|
mumble' in the prototype is limited to the argument list
|
|||
|
containing it. It does not refer to the `struct mumble' defined
|
|||
|
with file scope immediately below--they are two unrelated types
|
|||
|
with similar names in different scopes.
|
|||
|
|
|||
|
But in the definition of `foo', the file-scope type is used
|
|||
|
because that is available to be inherited. Thus, the definition
|
|||
|
and the prototype do not match, and you get an error.
|
|||
|
|
|||
|
This behavior may seem silly, but it's what the ANSI standard
|
|||
|
specifies. It is easy enough for you to make your code work by
|
|||
|
moving the definition of `struct mumble' above the prototype.
|
|||
|
It's not worth being incompatible with ANSI C just to avoid an
|
|||
|
error for the example shown above.
|
|||
|
|
|||
|
* Accesses to bitfields even in volatile objects works by accessing
|
|||
|
larger objects, such as a byte or a word. You cannot rely on what
|
|||
|
size of object is accessed in order to read or write the bitfield;
|
|||
|
it may even vary for a given bitfield according to the precise
|
|||
|
usage.
|
|||
|
|
|||
|
If you care about controlling the amount of memory that is
|
|||
|
accessed, use volatile but do not use bitfields.
|
|||
|
|
|||
|
* GNU CC comes with shell scripts to fix certain known problems in
|
|||
|
system header files. They install corrected copies of various
|
|||
|
header files in a special directory where only GNU CC will
|
|||
|
normally look for them. The scripts adapt to various systems by
|
|||
|
searching all the system header files for the problem cases that
|
|||
|
we know about.
|
|||
|
|
|||
|
If new system header files are installed, nothing automatically
|
|||
|
arranges to update the corrected header files. You will have to
|
|||
|
reinstall GNU CC to fix the new header files. More specifically,
|
|||
|
go to the build directory and delete the files `stmp-fixinc' and
|
|||
|
`stmp-headers', and the subdirectory `include'; then do `make
|
|||
|
install' again.
|
|||
|
|
|||
|
* On 68000 and x86 systems, for instance, you can get paradoxical
|
|||
|
results if you test the precise values of floating point numbers.
|
|||
|
For example, you can find that a floating point value which is not
|
|||
|
a NaN is not equal to itself. This results from the fact that the
|
|||
|
floating point registers hold a few more bits of precision than
|
|||
|
fit in a `double' in memory. Compiled code moves values between
|
|||
|
memory and floating point registers at its convenience, and moving
|
|||
|
them into memory truncates them.
|
|||
|
|
|||
|
You can partially avoid this problem by using the `-ffloat-store'
|
|||
|
option (*note Optimize Options::.).
|
|||
|
|
|||
|
* On the MIPS, variable argument functions using `varargs.h' cannot
|
|||
|
have a floating point value for the first argument. The reason
|
|||
|
for this is that in the absence of a prototype in scope, if the
|
|||
|
first argument is a floating point, it is passed in a floating
|
|||
|
point register, rather than an integer register.
|
|||
|
|
|||
|
If the code is rewritten to use the ANSI standard `stdarg.h'
|
|||
|
method of variable arguments, and the prototype is in scope at the
|
|||
|
time of the call, everything will work fine.
|
|||
|
|
|||
|
* On the H8/300 and H8/300H, variable argument functions must be
|
|||
|
implemented using the ANSI standard `stdarg.h' method of variable
|
|||
|
arguments. Furthermore, calls to functions using `stdarg.h'
|
|||
|
variable arguments must have a prototype for the called function
|
|||
|
in scope at the time of the call.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: C++ Misunderstandings, Next: Protoize Caveats, Prev: Disappointments, Up: Trouble
|
|||
|
|
|||
|
Common Misunderstandings with GNU C++
|
|||
|
=====================================
|
|||
|
|
|||
|
C++ is a complex language and an evolving one, and its standard
|
|||
|
definition (the ANSI C++ draft standard) is also evolving. As a result,
|
|||
|
your C++ compiler may occasionally surprise you, even when its behavior
|
|||
|
is correct. This section discusses some areas that frequently give
|
|||
|
rise to questions of this sort.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Static Definitions:: Static member declarations are not definitions
|
|||
|
* Temporaries:: Temporaries may vanish before you expect
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Static Definitions, Next: Temporaries, Up: C++ Misunderstandings
|
|||
|
|
|||
|
Declare *and* Define Static Members
|
|||
|
-----------------------------------
|
|||
|
|
|||
|
When a class has static data members, it is not enough to *declare*
|
|||
|
the static member; you must also *define* it. For example:
|
|||
|
|
|||
|
class Foo
|
|||
|
{
|
|||
|
...
|
|||
|
void method();
|
|||
|
static int bar;
|
|||
|
};
|
|||
|
|
|||
|
This declaration only establishes that the class `Foo' has an `int'
|
|||
|
named `Foo::bar', and a member function named `Foo::method'. But you
|
|||
|
still need to define *both* `method' and `bar' elsewhere. According to
|
|||
|
the draft ANSI standard, you must supply an initializer in one (and
|
|||
|
only one) source file, such as:
|
|||
|
|
|||
|
int Foo::bar = 0;
|
|||
|
|
|||
|
Other C++ compilers may not correctly implement the standard
|
|||
|
behavior. As a result, when you switch to `g++' from one of these
|
|||
|
compilers, you may discover that a program that appeared to work
|
|||
|
correctly in fact does not conform to the standard: `g++' reports as
|
|||
|
undefined symbols any static data members that lack definitions.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Temporaries, Prev: Static Definitions, Up: C++ Misunderstandings
|
|||
|
|
|||
|
Temporaries May Vanish Before You Expect
|
|||
|
----------------------------------------
|
|||
|
|
|||
|
It is dangerous to use pointers or references to *portions* of a
|
|||
|
temporary object. The compiler may very well delete the object before
|
|||
|
you expect it to, leaving a pointer to garbage. The most common place
|
|||
|
where this problem crops up is in classes like the libg++ `String'
|
|||
|
class, that define a conversion function to type `char *' or `const
|
|||
|
char *'. However, any class that returns a pointer to some internal
|
|||
|
structure is potentially subject to this problem.
|
|||
|
|
|||
|
For example, a program may use a function `strfunc' that returns
|
|||
|
`String' objects, and another function `charfunc' that operates on
|
|||
|
pointers to `char':
|
|||
|
|
|||
|
String strfunc ();
|
|||
|
void charfunc (const char *);
|
|||
|
|
|||
|
In this situation, it may seem natural to write
|
|||
|
`charfunc (strfunc ());' based on the knowledge that class `String' has
|
|||
|
an explicit conversion to `char' pointers. However, what really
|
|||
|
happens is akin to `charfunc (strfunc ().convert ());', where the
|
|||
|
`convert' method is a function to do the same data conversion normally
|
|||
|
performed by a cast. Since the last use of the temporary `String'
|
|||
|
object is the call to the conversion function, the compiler may delete
|
|||
|
that object before actually calling `charfunc'. The compiler has no
|
|||
|
way of knowing that deleting the `String' object will invalidate the
|
|||
|
pointer. The pointer then points to garbage, so that by the time
|
|||
|
`charfunc' is called, it gets an invalid argument.
|
|||
|
|
|||
|
Code like this may run successfully under some other compilers,
|
|||
|
especially those that delete temporaries relatively late. However, the
|
|||
|
GNU C++ behavior is also standard-conforming, so if your program depends
|
|||
|
on late destruction of temporaries it is not portable.
|
|||
|
|
|||
|
If you think this is surprising, you should be aware that the ANSI
|
|||
|
C++ committee continues to debate the lifetime-of-temporaries problem.
|
|||
|
|
|||
|
For now, at least, the safe way to write such code is to give the
|
|||
|
temporary a name, which forces it to remain until the end of the scope
|
|||
|
of the name. For example:
|
|||
|
|
|||
|
String& tmp = strfunc ();
|
|||
|
charfunc (tmp);
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Protoize Caveats, Next: Non-bugs, Prev: C++ Misunderstandings, Up: Trouble
|
|||
|
|
|||
|
Caveats of using `protoize'
|
|||
|
===========================
|
|||
|
|
|||
|
The conversion programs `protoize' and `unprotoize' can sometimes
|
|||
|
change a source file in a way that won't work unless you rearrange it.
|
|||
|
|
|||
|
* `protoize' can insert references to a type name or type tag before
|
|||
|
the definition, or in a file where they are not defined.
|
|||
|
|
|||
|
If this happens, compiler error messages should show you where the
|
|||
|
new references are, so fixing the file by hand is straightforward.
|
|||
|
|
|||
|
* There are some C constructs which `protoize' cannot figure out.
|
|||
|
For example, it can't determine argument types for declaring a
|
|||
|
pointer-to-function variable; this you must do by hand. `protoize'
|
|||
|
inserts a comment containing `???' each time it finds such a
|
|||
|
variable; so you can find all such variables by searching for this
|
|||
|
string. ANSI C does not require declaring the argument types of
|
|||
|
pointer-to-function types.
|
|||
|
|
|||
|
* Using `unprotoize' can easily introduce bugs. If the program
|
|||
|
relied on prototypes to bring about conversion of arguments, these
|
|||
|
conversions will not take place in the program without prototypes.
|
|||
|
One case in which you can be sure `unprotoize' is safe is when you
|
|||
|
are removing prototypes that were made with `protoize'; if the
|
|||
|
program worked before without any prototypes, it will work again
|
|||
|
without them.
|
|||
|
|
|||
|
You can find all the places where this problem might occur by
|
|||
|
compiling the program with the `-Wconversion' option. It prints a
|
|||
|
warning whenever an argument is converted.
|
|||
|
|
|||
|
* Both conversion programs can be confused if there are macro calls
|
|||
|
in and around the text to be converted. In other words, the
|
|||
|
standard syntax for a declaration or definition must not result
|
|||
|
from expanding a macro. This problem is inherent in the design of
|
|||
|
C and cannot be fixed. If only a few functions have confusing
|
|||
|
macro calls, you can easily convert them manually.
|
|||
|
|
|||
|
* `protoize' cannot get the argument types for a function whose
|
|||
|
definition was not actually compiled due to preprocessing
|
|||
|
conditionals. When this happens, `protoize' changes nothing in
|
|||
|
regard to such a function. `protoize' tries to detect such
|
|||
|
instances and warn about them.
|
|||
|
|
|||
|
You can generally work around this problem by using `protoize' step
|
|||
|
by step, each time specifying a different set of `-D' options for
|
|||
|
compilation, until all of the functions have been converted.
|
|||
|
There is no automatic way to verify that you have got them all,
|
|||
|
however.
|
|||
|
|
|||
|
* Confusion may result if there is an occasion to convert a function
|
|||
|
declaration or definition in a region of source code where there
|
|||
|
is more than one formal parameter list present. Thus, attempts to
|
|||
|
convert code containing multiple (conditionally compiled) versions
|
|||
|
of a single function header (in the same vicinity) may not produce
|
|||
|
the desired (or expected) results.
|
|||
|
|
|||
|
If you plan on converting source files which contain such code, it
|
|||
|
is recommended that you first make sure that each conditionally
|
|||
|
compiled region of source code which contains an alternative
|
|||
|
function header also contains at least one additional follower
|
|||
|
token (past the final right parenthesis of the function header).
|
|||
|
This should circumvent the problem.
|
|||
|
|
|||
|
* `unprotoize' can become confused when trying to convert a function
|
|||
|
definition or declaration which contains a declaration for a
|
|||
|
pointer-to-function formal argument which has the same name as the
|
|||
|
function being defined or declared. We recommand you avoid such
|
|||
|
choices of formal parameter names.
|
|||
|
|
|||
|
* You might also want to correct some of the indentation by hand and
|
|||
|
break long lines. (The conversion programs don't write lines
|
|||
|
longer than eighty characters in any case.)
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Non-bugs, Next: Warnings and Errors, Prev: Protoize Caveats, Up: Trouble
|
|||
|
|
|||
|
Certain Changes We Don't Want to Make
|
|||
|
=====================================
|
|||
|
|
|||
|
This section lists changes that people frequently request, but which
|
|||
|
we do not make because we think GNU CC is better without them.
|
|||
|
|
|||
|
* Checking the number and type of arguments to a function which has
|
|||
|
an old-fashioned definition and no prototype.
|
|||
|
|
|||
|
Such a feature would work only occasionally--only for calls that
|
|||
|
appear in the same file as the called function, following the
|
|||
|
definition. The only way to check all calls reliably is to add a
|
|||
|
prototype for the function. But adding a prototype eliminates the
|
|||
|
motivation for this feature. So the feature is not worthwhile.
|
|||
|
|
|||
|
* Warning about using an expression whose type is signed as a shift
|
|||
|
count.
|
|||
|
|
|||
|
Shift count operands are probably signed more often than unsigned.
|
|||
|
Warning about this would cause far more annoyance than good.
|
|||
|
|
|||
|
* Warning about assigning a signed value to an unsigned variable.
|
|||
|
|
|||
|
Such assignments must be very common; warning about them would
|
|||
|
cause more annoyance than good.
|
|||
|
|
|||
|
* Warning about unreachable code.
|
|||
|
|
|||
|
It's very common to have unreachable code in machine-generated
|
|||
|
programs. For example, this happens normally in some files of GNU
|
|||
|
C itself.
|
|||
|
|
|||
|
* Warning when a non-void function value is ignored.
|
|||
|
|
|||
|
Coming as I do from a Lisp background, I balk at the idea that
|
|||
|
there is something dangerous about discarding a value. There are
|
|||
|
functions that return values which some callers may find useful;
|
|||
|
it makes no sense to clutter the program with a cast to `void'
|
|||
|
whenever the value isn't useful.
|
|||
|
|
|||
|
* Assuming (for optimization) that the address of an external symbol
|
|||
|
is never zero.
|
|||
|
|
|||
|
This assumption is false on certain systems when `#pragma weak' is
|
|||
|
used.
|
|||
|
|
|||
|
* Making `-fshort-enums' the default.
|
|||
|
|
|||
|
This would cause storage layout to be incompatible with most other
|
|||
|
C compilers. And it doesn't seem very important, given that you
|
|||
|
can get the same result in other ways. The case where it matters
|
|||
|
most is when the enumeration-valued object is inside a structure,
|
|||
|
and in that case you can specify a field width explicitly.
|
|||
|
|
|||
|
* Making bitfields unsigned by default on particular machines where
|
|||
|
"the ABI standard" says to do so.
|
|||
|
|
|||
|
The ANSI C standard leaves it up to the implementation whether a
|
|||
|
bitfield declared plain `int' is signed or not. This in effect
|
|||
|
creates two alternative dialects of C.
|
|||
|
|
|||
|
The GNU C compiler supports both dialects; you can specify the
|
|||
|
signed dialect with `-fsigned-bitfields' and the unsigned dialect
|
|||
|
with `-funsigned-bitfields'. However, this leaves open the
|
|||
|
question of which dialect to use by default.
|
|||
|
|
|||
|
Currently, the preferred dialect makes plain bitfields signed,
|
|||
|
because this is simplest. Since `int' is the same as `signed int'
|
|||
|
in every other context, it is cleanest for them to be the same in
|
|||
|
bitfields as well.
|
|||
|
|
|||
|
Some computer manufacturers have published Application Binary
|
|||
|
Interface standards which specify that plain bitfields should be
|
|||
|
unsigned. It is a mistake, however, to say anything about this
|
|||
|
issue in an ABI. This is because the handling of plain bitfields
|
|||
|
distinguishes two dialects of C. Both dialects are meaningful on
|
|||
|
every type of machine. Whether a particular object file was
|
|||
|
compiled using signed bitfields or unsigned is of no concern to
|
|||
|
other object files, even if they access the same bitfields in the
|
|||
|
same data structures.
|
|||
|
|
|||
|
A given program is written in one or the other of these two
|
|||
|
dialects. The program stands a chance to work on most any machine
|
|||
|
if it is compiled with the proper dialect. It is unlikely to work
|
|||
|
at all if compiled with the wrong dialect.
|
|||
|
|
|||
|
Many users appreciate the GNU C compiler because it provides an
|
|||
|
environment that is uniform across machines. These users would be
|
|||
|
inconvenienced if the compiler treated plain bitfields differently
|
|||
|
on certain machines.
|
|||
|
|
|||
|
Occasionally users write programs intended only for a particular
|
|||
|
machine type. On these occasions, the users would benefit if the
|
|||
|
GNU C compiler were to support by default the same dialect as the
|
|||
|
other compilers on that machine. But such applications are rare.
|
|||
|
And users writing a program to run on more than one type of
|
|||
|
machine cannot possibly benefit from this kind of compatibility.
|
|||
|
|
|||
|
This is why GNU CC does and will treat plain bitfields in the same
|
|||
|
fashion on all types of machines (by default).
|
|||
|
|
|||
|
There are some arguments for making bitfields unsigned by default
|
|||
|
on all machines. If, for example, this becomes a universal de
|
|||
|
facto standard, it would make sense for GNU CC to go along with
|
|||
|
it. This is something to be considered in the future.
|
|||
|
|
|||
|
(Of course, users strongly concerned about portability should
|
|||
|
indicate explicitly in each bitfield whether it is signed or not.
|
|||
|
In this way, they write programs which have the same meaning in
|
|||
|
both C dialects.)
|
|||
|
|
|||
|
* Undefining `__STDC__' when `-ansi' is not used.
|
|||
|
|
|||
|
Currently, GNU CC defines `__STDC__' as long as you don't use
|
|||
|
`-traditional'. This provides good results in practice.
|
|||
|
|
|||
|
Programmers normally use conditionals on `__STDC__' to ask whether
|
|||
|
it is safe to use certain features of ANSI C, such as function
|
|||
|
prototypes or ANSI token concatenation. Since plain `gcc' supports
|
|||
|
all the features of ANSI C, the correct answer to these questions
|
|||
|
is "yes".
|
|||
|
|
|||
|
Some users try to use `__STDC__' to check for the availability of
|
|||
|
certain library facilities. This is actually incorrect usage in
|
|||
|
an ANSI C program, because the ANSI C standard says that a
|
|||
|
conforming freestanding implementation should define `__STDC__'
|
|||
|
even though it does not have the library facilities. `gcc -ansi
|
|||
|
-pedantic' is a conforming freestanding implementation, and it is
|
|||
|
therefore required to define `__STDC__', even though it does not
|
|||
|
come with an ANSI C library.
|
|||
|
|
|||
|
Sometimes people say that defining `__STDC__' in a compiler that
|
|||
|
does not completely conform to the ANSI C standard somehow
|
|||
|
violates the standard. This is illogical. The standard is a
|
|||
|
standard for compilers that claim to support ANSI C, such as `gcc
|
|||
|
-ansi'--not for other compilers such as plain `gcc'. Whatever the
|
|||
|
ANSI C standard says is relevant to the design of plain `gcc'
|
|||
|
without `-ansi' only for pragmatic reasons, not as a requirement.
|
|||
|
|
|||
|
GNU CC normally defines `__STDC__' to be 1, and in addition
|
|||
|
defines `__STRICT_ANSI__' if you specify the `-ansi' option. On
|
|||
|
some hosts, system include files use a different convention, where
|
|||
|
`__STDC__' is normally 0, but is 1 if the user specifies strict
|
|||
|
conformance to the C Standard. GNU CC follows the host convention
|
|||
|
when processing system include files, but when processing user
|
|||
|
files it follows the usual GNU C convention.
|
|||
|
|
|||
|
* Undefining `__STDC__' in C++.
|
|||
|
|
|||
|
Programs written to compile with C++-to-C translators get the
|
|||
|
value of `__STDC__' that goes with the C compiler that is
|
|||
|
subsequently used. These programs must test `__STDC__' to
|
|||
|
determine what kind of C preprocessor that compiler uses: whether
|
|||
|
they should concatenate tokens in the ANSI C fashion or in the
|
|||
|
traditional fashion.
|
|||
|
|
|||
|
These programs work properly with GNU C++ if `__STDC__' is defined.
|
|||
|
They would not work otherwise.
|
|||
|
|
|||
|
In addition, many header files are written to provide prototypes
|
|||
|
in ANSI C but not in traditional C. Many of these header files
|
|||
|
can work without change in C++ provided `__STDC__' is defined. If
|
|||
|
`__STDC__' is not defined, they will all fail, and will all need
|
|||
|
to be changed to test explicitly for C++ as well.
|
|||
|
|
|||
|
* Deleting "empty" loops.
|
|||
|
|
|||
|
GNU CC does not delete "empty" loops because the most likely reason
|
|||
|
you would put one in a program is to have a delay. Deleting them
|
|||
|
will not make real programs run any faster, so it would be
|
|||
|
pointless.
|
|||
|
|
|||
|
It would be different if optimization of a nonempty loop could
|
|||
|
produce an empty one. But this generally can't happen.
|
|||
|
|
|||
|
* Making side effects happen in the same order as in some other
|
|||
|
compiler.
|
|||
|
|
|||
|
It is never safe to depend on the order of evaluation of side
|
|||
|
effects. For example, a function call like this may very well
|
|||
|
behave differently from one compiler to another:
|
|||
|
|
|||
|
void func (int, int);
|
|||
|
|
|||
|
int i = 2;
|
|||
|
func (i++, i++);
|
|||
|
|
|||
|
There is no guarantee (in either the C or the C++ standard language
|
|||
|
definitions) that the increments will be evaluated in any
|
|||
|
particular order. Either increment might happen first. `func'
|
|||
|
might get the arguments `2, 3', or it might get `3, 2', or even
|
|||
|
`2, 2'.
|
|||
|
|
|||
|
* Not allowing structures with volatile fields in registers.
|
|||
|
|
|||
|
Strictly speaking, there is no prohibition in the ANSI C standard
|
|||
|
against allowing structures with volatile fields in registers, but
|
|||
|
it does not seem to make any sense and is probably not what you
|
|||
|
wanted to do. So the compiler will give an error message in this
|
|||
|
case.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble
|
|||
|
|
|||
|
Warning Messages and Error Messages
|
|||
|
===================================
|
|||
|
|
|||
|
The GNU compiler can produce two kinds of diagnostics: errors and
|
|||
|
warnings. Each kind has a different purpose:
|
|||
|
|
|||
|
*Errors* report problems that make it impossible to compile your
|
|||
|
program. GNU CC reports errors with the source file name and line
|
|||
|
number where the problem is apparent.
|
|||
|
|
|||
|
*Warnings* report other unusual conditions in your code that *may*
|
|||
|
indicate a problem, although compilation can (and does) proceed.
|
|||
|
Warning messages also report the source file name and line number,
|
|||
|
but include the text `warning:' to distinguish them from error
|
|||
|
messages.
|
|||
|
|
|||
|
Warnings may indicate danger points where you should check to make
|
|||
|
sure that your program really does what you intend; or the use of
|
|||
|
obsolete features; or the use of nonstandard features of GNU C or C++.
|
|||
|
Many warnings are issued only if you ask for them, with one of the `-W'
|
|||
|
options (for instance, `-Wall' requests a variety of useful warnings).
|
|||
|
|
|||
|
GNU CC always tries to compile your program if possible; it never
|
|||
|
gratuitously rejects a program whose meaning is clear merely because
|
|||
|
(for instance) it fails to conform to a standard. In some cases,
|
|||
|
however, the C and C++ standards specify that certain extensions are
|
|||
|
forbidden, and a diagnostic *must* be issued by a conforming compiler.
|
|||
|
The `-pedantic' option tells GNU CC to issue warnings in such cases;
|
|||
|
`-pedantic-errors' says to make them errors instead. This does not
|
|||
|
mean that *all* non-ANSI constructs get warnings or errors.
|
|||
|
|
|||
|
*Note Options to Request or Suppress Warnings: Warning Options, for
|
|||
|
more detail on these and related command-line options.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Bugs, Next: Service, Prev: Trouble, Up: Top
|
|||
|
|
|||
|
Reporting Bugs
|
|||
|
**************
|
|||
|
|
|||
|
Your bug reports play an essential role in making GNU CC reliable.
|
|||
|
|
|||
|
When you encounter a problem, the first thing to do is to see if it
|
|||
|
is already known. *Note Trouble::. If it isn't known, then you should
|
|||
|
report the problem.
|
|||
|
|
|||
|
Reporting a bug may help you by bringing a solution to your problem,
|
|||
|
or it may not. (If it does not, look in the service directory; see
|
|||
|
*Note Service::.) In any case, the principal function of a bug report
|
|||
|
is to help the entire community by making the next version of GNU CC
|
|||
|
work better. Bug reports are your contribution to the maintenance of
|
|||
|
GNU CC.
|
|||
|
|
|||
|
Since the maintainers are very overloaded, we cannot respond to every
|
|||
|
bug report. However, if the bug has not been fixed, we are likely to
|
|||
|
send you a patch and ask you to tell us whether it works.
|
|||
|
|
|||
|
In order for a bug report to serve its purpose, you must include the
|
|||
|
information that makes for fixing the bug.
|
|||
|
|
|||
|
* Menu:
|
|||
|
|
|||
|
* Criteria: Bug Criteria. Have you really found a bug?
|
|||
|
* Where: Bug Lists. Where to send your bug report.
|
|||
|
* Reporting: Bug Reporting. How to report a bug effectively.
|
|||
|
* Patches: Sending Patches. How to send a patch for GNU CC.
|
|||
|
* Known: Trouble. Known problems.
|
|||
|
* Help: Service. Where to ask for help.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Bug Criteria, Next: Bug Lists, Up: Bugs
|
|||
|
|
|||
|
Have You Found a Bug?
|
|||
|
=====================
|
|||
|
|
|||
|
If you are not sure whether you have found a bug, here are some
|
|||
|
guidelines:
|
|||
|
|
|||
|
* If the compiler gets a fatal signal, for any input whatever, that
|
|||
|
is a compiler bug. Reliable compilers never crash.
|
|||
|
|
|||
|
* If the compiler produces invalid assembly code, for any input
|
|||
|
whatever (except an `asm' statement), that is a compiler bug,
|
|||
|
unless the compiler reports errors (not just warnings) which would
|
|||
|
ordinarily prevent the assembler from being run.
|
|||
|
|
|||
|
* If the compiler produces valid assembly code that does not
|
|||
|
correctly execute the input source code, that is a compiler bug.
|
|||
|
|
|||
|
However, you must double-check to make sure, because you may have
|
|||
|
run into an incompatibility between GNU C and traditional C (*note
|
|||
|
Incompatibilities::.). These incompatibilities might be considered
|
|||
|
bugs, but they are inescapable consequences of valuable features.
|
|||
|
|
|||
|
Or you may have a program whose behavior is undefined, which
|
|||
|
happened by chance to give the desired results with another C or
|
|||
|
C++ compiler.
|
|||
|
|
|||
|
For example, in many nonoptimizing compilers, you can write `x;'
|
|||
|
at the end of a function instead of `return x;', with the same
|
|||
|
results. But the value of the function is undefined if `return'
|
|||
|
is omitted; it is not a bug when GNU CC produces different results.
|
|||
|
|
|||
|
Problems often result from expressions with two increment
|
|||
|
operators, as in `f (*p++, *p++)'. Your previous compiler might
|
|||
|
have interpreted that expression the way you intended; GNU CC might
|
|||
|
interpret it another way. Neither compiler is wrong. The bug is
|
|||
|
in your code.
|
|||
|
|
|||
|
After you have localized the error to a single source line, it
|
|||
|
should be easy to check for these things. If your program is
|
|||
|
correct and well defined, you have found a compiler bug.
|
|||
|
|
|||
|
* If the compiler produces an error message for valid input, that is
|
|||
|
a compiler bug.
|
|||
|
|
|||
|
* If the compiler does not produce an error message for invalid
|
|||
|
input, that is a compiler bug. However, you should note that your
|
|||
|
idea of "invalid input" might be my idea of "an extension" or
|
|||
|
"support for traditional practice".
|
|||
|
|
|||
|
* If you are an experienced user of C or C++ compilers, your
|
|||
|
suggestions for improvement of GNU CC or GNU C++ are welcome in
|
|||
|
any case.
|
|||
|
|
|||
|
|
|||
|
File: gcc.info, Node: Bug Lists, Next: Bug Reporting, Prev: Bug Criteria, Up: Bugs
|
|||
|
|
|||
|
Where to Report Bugs
|
|||
|
====================
|
|||
|
|
|||
|
Send bug reports for GNU C to `bug-gcc@prep.ai.mit.edu'.
|
|||
|
|
|||
|
Send bug reports for GNU C++ to `bug-g++@prep.ai.mit.edu'. If your
|
|||
|
bug involves the C++ class library libg++, send mail instead to the
|
|||
|
address `bug-lib-g++@prep.ai.mit.edu'. If you're not sure, you can
|
|||
|
send the bug report to both lists.
|
|||
|
|
|||
|
*Do not send bug reports to `help-gcc@prep.ai.mit.edu' or to the
|
|||
|
newsgroup `gnu.gcc.help'.* Most users of GNU CC do not want to receive
|
|||
|
bug reports. Those that do, have asked to be on `bug-gcc' and/or
|
|||
|
`bug-g++'.
|
|||
|
|
|||
|
The mailing lists `bug-gcc' and `bug-g++' both have newsgroups which
|
|||
|
serve as repeaters: `gnu.gcc.bug' and `gnu.g++.bug'. Each mailing list
|
|||
|
and its newsgroup carry exactly the same messages.
|
|||
|
|
|||
|
Often people think of posting bug reports to the newsgroup instead of
|
|||
|
mailing them. This appears to work, but it has one problem which can be
|
|||
|
crucial: a newsgroup posting does not contain a mail path back to the
|
|||
|
sender. Thus, if maintainers need more information, they may be unable
|
|||
|
to reach you. For this reason, you should always send bug reports by
|
|||
|
mail to the proper mailing list.
|
|||
|
|
|||
|
As a last resort, send bug reports on paper to:
|
|||
|
|
|||
|
GNU Compiler Bugs
|
|||
|
Free Software Foundation
|
|||
|
59 Temple Place - Suite 330
|
|||
|
Boston, MA 02111-1307, USA
|
|||
|
|