@c Copyright (C) 1988-2021 Free Software Foundation, Inc.
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.

@node Trouble
@chapter Known Causes of Trouble with GCC
@cindex bugs, known
@cindex installation trouble
@cindex known causes of trouble

This section describes known problems that affect users of GCC@.  Most
of these are not GCC bugs per se---if they were, we would fix them.
But the result for a user may be like the result of a bug.

Some of these problems are due to bugs in other software, some are
missing features that are too much work to add, and some are places
where people's opinions differ as to what is best.

@menu
* Actual Bugs::         Bugs we will fix later.
* Interoperation::      Problems using GCC with other compilers,
                        and with certain linkers, assemblers and debuggers.
* Incompatibilities::   GCC is incompatible with traditional C.
* Fixed Headers::       GCC uses corrected versions of system header files.
                        This is necessary, but doesn't always work smoothly.
* Standard Libraries::  GCC uses the system C library, which might not be
                        compliant with the ISO C standard.
* Disappointments::     Regrettable things we cannot change, but not quite bugs.
* C++ Misunderstandings:: Common misunderstandings with GNU C++.
* Non-bugs::            Things we think are right, but some others disagree.
* Warnings and Errors:: Which problems in your code get warnings,
                        and which get errors.
@end menu

@node Actual Bugs
@section Actual Bugs We Haven't Fixed Yet

@itemize @bullet
@item
The @code{fixincludes} script interacts badly with automounters; if the
directory of system header files is automounted, it tends to be
unmounted while @code{fixincludes} is running.  This would seem to be a
bug in the automounter.  We don't know any good way to work around it.
@end itemize

@node Interoperation
@section Interoperation

This section lists various difficulties encountered in using GCC
together with other compilers or with the assemblers, linkers,
libraries and debuggers on certain systems.

@itemize @bullet
@item
On many platforms, GCC supports a different ABI for C++ than do other
compilers, so the object files compiled by GCC cannot be used with object
files generated by another C++ compiler.

An area where the difference is most apparent is name mangling.  The use
of different name mangling is intentional, to protect you from more subtle
problems.
Compilers differ as to many internal details of C++ implementation,
including: how class instances are laid out, how multiple inheritance is
implemented, and how virtual function calls are handled.  If the name
encoding were made the same, your programs would link against libraries
provided from other compilers---but the programs would then crash when
run.  Incompatible libraries are then detected at link time, rather than
at run time.

@item
On some BSD systems, including some versions of Ultrix, use of profiling
causes static variable destructors (currently used only in C++) not to
be run.

@item
On a SPARC, GCC aligns all values of type @code{double} on an 8-byte
boundary, and it expects every @code{double} to be so aligned.  The Sun
compiler usually gives @code{double} values 8-byte alignment, with one
exception: function arguments of type @code{double} may not be aligned.

As a result, if a function compiled with Sun CC takes the address of an
argument of type @code{double} and passes this pointer of type
@code{double *} to a function compiled with GCC, dereferencing the
pointer may cause a fatal signal.

One way to solve this problem is to compile your entire program with GCC@.
Another solution is to modify the function that is compiled with
Sun CC to copy the argument into a local variable; local variables
are always properly aligned.  A third solution is to modify the function
that uses the pointer to dereference it via the following function
@code{access_double} instead of directly with @samp{*}:

@smallexample
inline double
access_double (double *unaligned_ptr)
@{
  union d2i @{ double d; int i[2]; @};

  union d2i *p = (union d2i *) unaligned_ptr;
  union d2i u;

  u.i[0] = p->i[0];
  u.i[1] = p->i[1];

  return u.d;
@}
@end smallexample

@noindent
Storing into the pointer can be done likewise with the same union.

@item
On Solaris, the @code{malloc} function in the @file{libmalloc.a} library
may allocate memory that is only 4 byte aligned.  Since GCC on the
SPARC assumes that doubles are 8 byte aligned, this may result in a
fatal signal if doubles are stored in memory allocated by the
@file{libmalloc.a} library.

The solution is to not use the @file{libmalloc.a} library.  Use instead
@code{malloc} and related functions from @file{libc.a}; they do not have
this problem.

@item
On the HP PA machine, ADB sometimes fails to work on functions compiled
with GCC@.  Specifically, it fails to work on functions that use
@code{alloca} or variable-size arrays.  This is because GCC doesn't
generate HP-UX unwind descriptors for such functions.  It may even be
impossible to generate them.

@item
Debugging (@option{-g}) is not supported on the HP PA machine, unless you use
the preliminary GNU tools.

@item
Taking the address of a label may generate errors from the HP-UX
PA assembler.  GAS for the PA does not have this problem.

@item
Using floating point parameters for indirect calls to static functions
will not work when using the HP assembler.  There simply is no way for GCC
to specify what registers hold arguments for static functions when using
the HP assembler.  GAS for the PA does not have this problem.

@item
In extremely rare cases involving some very large functions you may
receive errors from the HP linker complaining about an out of bounds
unconditional branch offset.  This used to occur more often in previous
versions of GCC, but is now exceptionally rare.  If you should run
into it, you can work around by making your function smaller.

@item
GCC compiled code sometimes emits warnings from the HP-UX assembler of
the form:

@smallexample
(warning) Use of GR3 when
  frame >= 8192 may cause conflict.
@end smallexample

These warnings are harmless and can be safely ignored.

@item
In extremely rare cases involving some very large functions you may
receive errors from the AIX Assembler complaining about a displacement
that is too large.  If you should run into it, you can work around by
making your function smaller.

@item
The @file{libstdc++.a} library in GCC relies on the SVR4 dynamic
linker semantics which merges global symbols between libraries and
applications, especially necessary for C++ streams functionality.
This is not the default behavior of AIX shared libraries and dynamic
linking.  @file{libstdc++.a} is built on AIX with ``runtime-linking''
enabled so that symbol merging can occur.  To utilize this feature,
the application linked with @file{libstdc++.a} must include the
@option{-Wl,-brtl} flag on the link line.  G++ cannot impose this
because this option may interfere with the semantics of the user
program and users may not always use @samp{g++} to link his or her
application.  Applications are not required to use the
@option{-Wl,-brtl} flag on the link line---the rest of the
@file{libstdc++.a} library which is not dependent on the symbol
merging semantics will continue to function correctly.

@item
An application can interpose its own definition of functions for
functions invoked by @file{libstdc++.a} with ``runtime-linking''
enabled on AIX@.  To accomplish this the application must be linked
with ``runtime-linking'' option and the functions explicitly must be
exported by the application (@option{-Wl,-brtl,-bE:exportfile}).

@item
AIX on the RS/6000 provides support (NLS) for environments outside of
the United States.  Compilers and assemblers use NLS to support
locale-specific representations of various objects including
floating-point numbers (@samp{.} vs @samp{,} for separating decimal
fractions).  There have been problems reported where the library linked
with GCC does not produce the same floating-point formats that the
assembler accepts.  If you have this problem, set the @env{LANG}
environment variable to @samp{C} or @samp{En_US}.

@item
@opindex fdollars-in-identifiers
Even if you specify @option{-fdollars-in-identifiers},
you cannot successfully use @samp{$} in identifiers on the RS/6000 due
to a restriction in the IBM assembler.  GAS supports these
identifiers.

@end itemize

@node Incompatibilities
@section Incompatibilities of GCC
@cindex incompatibilities of GCC
@opindex traditional

There are several noteworthy incompatibilities between GNU C and K&R
(non-ISO) versions of C@.

@itemize @bullet
@cindex string constants
@cindex read-only strings
@cindex shared strings
@item
GCC normally makes string constants read-only.  If several
identical-looking string constants are used, GCC stores only one
copy of the string.

@cindex @code{mktemp}, and constant strings
One consequence is that you cannot call @code{mktemp} with a string
constant argument.  The function @code{mktemp} always alters the
string its argument points to.

@cindex @code{sscanf}, and constant strings
@cindex @code{fscanf}, and constant strings
@cindex @code{scanf}, and constant strings
Another consequence is that @code{sscanf} does not work on some very
old systems when passed a string constant as its format control string
or input.  This is because @code{sscanf} incorrectly tries to write
into the string constant.  Likewise @code{fscanf} and @code{scanf}.

The solution to these problems is to change the program to use
@code{char}-array variables with initialization strings for these
purposes instead of string constants.

@item
@code{-2147483648} is positive.

This is because 2147483648 cannot fit in the type @code{int}, so
(following the ISO C rules) its data type is @code{unsigned long int}.
Negating this value yields 2147483648 again.

@item
GCC does not substitute macro arguments when they appear inside of
string constants.  For example, the following macro in GCC

@smallexample
#define foo(a) "a"
@end smallexample

@noindent
will produce output @code{"a"} regardless of what the argument @var{a} is.

@cindex @code{setjmp} incompatibilities
@cindex @code{longjmp} incompatibilities
@item
When you use @code{setjmp} and @code{longjmp}, the only automatic
variables guaranteed to remain valid are those declared
@code{volatile}.  This is a consequence of automatic register
allocation.  Consider this function:

@smallexample
jmp_buf j;

foo ()
@{
  int a, b;

  a = fun1 ();
  if (setjmp (j))
    return a;

  a = fun2 ();
  /* @r{@code{longjmp (j)} may occur in @code{fun3}.} */
  return a + fun3 ();
@}
@end smallexample

Here @code{a} may or may not be restored to its first value when the
@code{longjmp} occurs.  If @code{a} is allocated in a register, then
its first value is restored; otherwise, it keeps the last value stored
in it.

@opindex W
If you use the @option{-W} option with the @option{-O} option, you will
get a warning when GCC thinks such a problem might be possible.

@item
Programs that use preprocessing directives in the middle of macro
arguments do not work with GCC@.  For example, a program like this
will not work:

@smallexample
@group
foobar (
#define luser
        hack)
@end group
@end smallexample

ISO C does not permit such a construct.

@item
K&R compilers allow comments to cross over an inclusion boundary
(i.e.@: started in an include file and ended in the including file).

@cindex external declaration scope
@cindex scope of external declarations
@cindex declaration scope
@item
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, an @code{extern} declaration affects all the
rest of the file even if it happens within a block.

@item
In traditional C, you can combine @code{long}, etc., with a typedef name,
as shown here:

@smallexample
typedef int foo;
typedef long foo bar;
@end smallexample

In ISO C, this is not allowed: @code{long} and other type modifiers
require an explicit @code{int}.

@cindex typedef names as function parameters
@item
PCC allows typedef names to be used as function parameters.

@item
Traditional C allows the following erroneous pair of declarations to
appear together in a given scope:

@smallexample
typedef int foo;
typedef foo foo;
@end smallexample

@item
GCC treats all characters of identifiers as significant.  According to
K&R-1 (2.2), ``No more than the first eight characters are significant,
although more may be used.''.  Also according to K&R-1 (2.2), ``An
identifier is a sequence of letters and digits; the first character must
be a letter.  The underscore _ counts as a letter.'', but GCC also
allows dollar signs in identifiers.

@cindex whitespace
@item
PCC allows whitespace in the middle of compound assignment operators
such as @samp{+=}.  GCC, following the ISO standard, does not
allow this.

@cindex apostrophes
@cindex @code{'}
@item
GCC 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, GCC will probably report an error.  For
example, this code would produce an error:

@smallexample
#if 0
You can't expect this to work.
#endif
@end smallexample

The best solution to such a problem is to put the text into an actual
C comment delimited by @samp{/*@dots{}*/}.

@item
Many user programs contain the declaration @samp{long time ();}.  In the
past, the system header files on many systems did not actually declare
@code{time}, so it did not matter what type your program declared it to
return.  But in systems with ISO C headers, @code{time} is declared to
return @code{time_t}, and if that is not the same as @code{long}, then
@samp{long time ();} is erroneous.

The solution is to change your program to use appropriate system headers
(@code{<time.h>} on systems with ISO C headers) and not to declare
@code{time} if the system header files declare it, or failing that to
use @code{time_t} as the return type of @code{time}.

@cindex @code{float} as function value type
@item
When compiling functions that return @code{float}, PCC converts it to
a double.  GCC actually returns a @code{float}.  If you are concerned
with PCC compatibility, you should declare your functions to return
@code{double}; you might as well say what you mean.

@cindex structures
@cindex unions
@item
When compiling functions that return structures or unions, GCC
output code normally uses a method different from that used on most
versions of Unix.  As a result, code compiled with GCC cannot call
a structure-returning function compiled with PCC, and vice versa.

The method used by GCC 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 target hook @code{TARGET_STRUCT_VALUE_RTX}
tells GCC 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.  GCC 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.  GCC 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.

@opindex fpcc-struct-return
You can tell GCC to use a compatible convention for all structure and
union returning with the option @option{-fpcc-struct-return}.

@cindex preprocessing tokens
@cindex preprocessing numbers
@item
GCC complains about program fragments such as @samp{0x74ae-0x4000}
which appear to be two hexadecimal constants separated by the minus
operator.  Actually, this string is a single @dfn{preprocessing token}.
Each such token must correspond to one token in C@.  Since this does not,
GCC prints an error message.  Although it may appear obvious that what
is meant is an operator and two values, the ISO C standard specifically
requires that this be treated as erroneous.

A @dfn{preprocessing token} is a @dfn{preprocessing number} if it
begins with a digit and is followed by letters, underscores, digits,
periods and @samp{e+}, @samp{e-}, @samp{E+}, @samp{E-}, @samp{p+},
@samp{p-}, @samp{P+}, or @samp{P-} character sequences.  (In strict C90
mode, the sequences @samp{p+}, @samp{p-}, @samp{P+} and @samp{P-} cannot
appear in preprocessing numbers.)

To make the above program fragment valid, place whitespace in front of
the minus sign.  This whitespace will end the preprocessing number.
@end itemize

@node Fixed Headers
@section Fixed Header Files

GCC 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 GCC unless they are changed.  Some have bugs, some are
incompatible with ISO C, and some depend on special features of other
compilers.

Installing GCC automatically creates and installs the fixed header
files, by running a program called @code{fixincludes}.  Normally, you
don't need to pay attention to this.  But there are cases where it
doesn't do the right thing automatically.

@itemize @bullet
@item
If you update the system's header files, such as by installing a new
system version, the fixed header files of GCC are not automatically
updated.  They can be updated using the @command{mkheaders} script
installed in
@file{@var{libexecdir}/gcc/@var{target}/@var{version}/install-tools/}.

@item
On some systems, 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 the system 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.

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.
@end itemize

@node Standard Libraries
@section Standard Libraries

@opindex Wall
GCC by itself attempts to be a conforming freestanding implementation.
@xref{Standards,,Language Standards Supported by GCC}, for details of
what this means.  Beyond the library facilities required of such an
implementation, 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
@option{-Wall}) that you don't expect.

For example, the @code{sprintf} function on SunOS 4.1.3 returns
@code{char *} while the C standard says that @code{sprintf} returns an
@code{int}.  The @code{fixincludes} program could make the prototype for
this function match the Standard, but that would be wrong, since the
function will still return @code{char *}.

If you need a Standard compliant library, then you need to find one, as
GCC does not provide one.  The GNU C library (called @code{glibc})
provides ISO C, POSIX, BSD, SystemV and X/Open compatibility for
GNU/Linux and HURD-based GNU systems; no recent version of it supports
other systems, though some very old versions did.  Version 2.2 of the
GNU C library includes nearly complete C99 support.  You could also ask
your operating system vendor if newer libraries are available.

@node Disappointments
@section Disappointments and Misunderstandings

These problems are perhaps regrettable, but we don't know any practical
way around them.

@itemize @bullet
@item
Certain local variables aren't recognized by debuggers when you compile
with optimization.

This occurs because sometimes GCC 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 GCC 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.

@cindex conflicting types
@cindex scope of declaration
@item
Users often think it is a bug when GCC reports an error for code
like this:

@smallexample
int foo (struct mumble *);

struct mumble @{ @dots{} @};

int foo (struct mumble *x)
@{ @dots{} @}
@end smallexample

This code really is erroneous, because the scope of @code{struct
mumble} in the prototype is limited to the argument list containing it.
It does not refer to the @code{struct mumble} defined with file scope
immediately below---they are two unrelated types with similar names in
different scopes.

But in the definition of @code{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 ISO standard specifies.
It is easy enough for you to make your code work by moving the
definition of @code{struct mumble} above the prototype.  It's not worth
being incompatible with ISO C just to avoid an error for the example
shown above.

@item
Accesses to bit-fields 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 bit-field; it may even
vary for a given bit-field according to the precise usage.

If you care about controlling the amount of memory that is accessed, use
volatile but do not use bit-fields.

@item
GCC 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 GCC 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.  They can be updated using the
@command{mkheaders} script installed in
@file{@var{libexecdir}/gcc/@var{target}/@var{version}/install-tools/}.

@item
@cindex floating point precision
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 @code{double} in memory.
Compiled code moves values between memory and floating point registers
at its convenience, and moving them into memory truncates them.

@opindex ffloat-store
You can partially avoid this problem by using the @option{-ffloat-store}
option (@pxref{Optimize Options}).

@item
On AIX and other platforms without weak symbol support, templates
need to be instantiated explicitly and symbols for static members
of templates will not be generated.

@item
On AIX, GCC scans object files and library archives for static
constructors and destructors when linking an application before the
linker prunes unreferenced symbols.  This is necessary to prevent the
AIX linker from mistakenly assuming that static constructor or
destructor are unused and removing them before the scanning can occur.
All static constructors and destructors found will be referenced even
though the modules in which they occur may not be used by the program.
This may lead to both increased executable size and unexpected symbol
references.
@end itemize

@node C++ Misunderstandings
@section Common Misunderstandings with GNU C++

@cindex misunderstandings in C++
@cindex surprises in C++
@cindex C++ misunderstandings
C++ is a complex language and an evolving one, and its standard
definition (the ISO C++ standard) was only recently completed.  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
* Name lookup::         Name lookup, templates, and accessing members of base classes
* Temporaries::         Temporaries may vanish before you expect
* Copy Assignment::     Copy Assignment operators copy virtual bases twice
@end menu

@node Static Definitions
@subsection Declare @emph{and} Define Static Members

@cindex C++ static data, declaring and defining
@cindex static data in C++, declaring and defining
@cindex declaring static data in C++
@cindex defining static data in C++
When a class has static data members, it is not enough to @emph{declare}
the static member; you must also @emph{define} it.  For example:

@smallexample
class Foo
@{
  @dots{}
  void method();
  static int bar;
@};
@end smallexample

This declaration only establishes that the class @code{Foo} has an
@code{int} named @code{Foo::bar}, and a member function named
@code{Foo::method}.  But you still need to define @emph{both}
@code{method} and @code{bar} elsewhere.  According to the ISO
standard, you must supply an initializer in one (and only one) source
file, such as:

@smallexample
int Foo::bar = 0;
@end smallexample

Other C++ compilers may not correctly implement the standard behavior.
As a result, when you switch to @command{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: @command{g++} reports as undefined
symbols any static data members that lack definitions.


@node Name lookup
@subsection Name Lookup, Templates, and Accessing Members of Base Classes

@cindex base class members
@cindex two-stage name lookup
@cindex dependent name lookup

The C++ standard prescribes that all names that are not dependent on
template parameters are bound to their present definitions when parsing
a template function or class.@footnote{The C++ standard just uses the
term ``dependent'' for names that depend on the type or value of
template parameters.  This shorter term will also be used in the rest of
this section.}  Only names that are dependent are looked up at the point
of instantiation.  For example, consider

@smallexample
  void foo(double);

  struct A @{
    template <typename T>
    void f () @{
      foo (1);        // @r{1}
      int i = N;      // @r{2}
      T t;
      t.bar();        // @r{3}
      foo (t);        // @r{4}
    @}

    static const int N;
  @};
@end smallexample

Here, the names @code{foo} and @code{N} appear in a context that does
not depend on the type of @code{T}.  The compiler will thus require that
they are defined in the context of use in the template, not only before
the point of instantiation, and will here use @code{::foo(double)} and
@code{A::N}, respectively.  In particular, it will convert the integer
value to a @code{double} when passing it to @code{::foo(double)}.

Conversely, @code{bar} and the call to @code{foo} in the fourth marked
line are used in contexts that do depend on the type of @code{T}, so
they are only looked up at the point of instantiation, and you can
provide declarations for them after declaring the template, but before
instantiating it.  In particular, if you instantiate @code{A::f<int>},
the last line will call an overloaded @code{::foo(int)} if one was
provided, even if after the declaration of @code{struct A}.

This distinction between lookup of dependent and non-dependent names is
called two-stage (or dependent) name lookup.  G++ implements it
since version 3.4.

Two-stage name lookup sometimes leads to situations with behavior
different from non-template codes.  The most common is probably this:

@smallexample
  template <typename T> struct Base @{
    int i;
  @};

  template <typename T> struct Derived : public Base<T> @{
    int get_i() @{ return i; @}
  @};
@end smallexample

In @code{get_i()}, @code{i} is not used in a dependent context, so the
compiler will look for a name declared at the enclosing namespace scope
(which is the global scope here).  It will not look into the base class,
since that is dependent and you may declare specializations of
@code{Base} even after declaring @code{Derived}, so the compiler cannot
really know what @code{i} would refer to.  If there is no global
variable @code{i}, then you will get an error message.

In order to make it clear that you want the member of the base class,
you need to defer lookup until instantiation time, at which the base
class is known.  For this, you need to access @code{i} in a dependent
context, by either using @code{this->i} (remember that @code{this} is of
type @code{Derived<T>*}, so is obviously dependent), or using
@code{Base<T>::i}.  Alternatively, @code{Base<T>::i} might be brought
into scope by a @code{using}-declaration.

Another, similar example involves calling member functions of a base
class:

@smallexample
  template <typename T> struct Base @{
      int f();
  @};

  template <typename T> struct Derived : Base<T> @{
      int g() @{ return f(); @};
  @};
@end smallexample

Again, the call to @code{f()} is not dependent on template arguments
(there are no arguments that depend on the type @code{T}, and it is also
not otherwise specified that the call should be in a dependent context).
Thus a global declaration of such a function must be available, since
the one in the base class is not visible until instantiation time.  The
compiler will consequently produce the following error message:

@smallexample
  x.cc: In member function `int Derived<T>::g()':
  x.cc:6: error: there are no arguments to `f' that depend on a template
     parameter, so a declaration of `f' must be available
  x.cc:6: error: (if you use `-fpermissive', G++ will accept your code, but
     allowing the use of an undeclared name is deprecated)
@end smallexample

To make the code valid either use @code{this->f()}, or
@code{Base<T>::f()}.  Using the @option{-fpermissive} flag will also let
the compiler accept the code, by marking all function calls for which no
declaration is visible at the time of definition of the template for
later lookup at instantiation time, as if it were a dependent call.
We do not recommend using @option{-fpermissive} to work around invalid
code, and it will also only catch cases where functions in base classes
are called, not where variables in base classes are used (as in the
example above).

Note that some compilers (including G++ versions prior to 3.4) get these
examples wrong and accept above code without an error.  Those compilers
do not implement two-stage name lookup correctly.


@node Temporaries
@subsection Temporaries May Vanish Before You Expect

@cindex temporaries, lifetime of
@cindex portions of temporary objects, pointers to
It is dangerous to use pointers or references to @emph{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 string classes,
especially ones that define a conversion function to type @code{char *}
or @code{const char *}---which is one reason why the standard
@code{string} class requires you to call the @code{c_str} member
function.  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 @code{strfunc} that returns
@code{string} objects, and another function @code{charfunc} that
operates on pointers to @code{char}:

@smallexample
string strfunc ();
void charfunc (const char *);

void
f ()
@{
  const char *p = strfunc().c_str();
  @dots{}
  charfunc (p);
  @dots{}
  charfunc (p);
@}
@end smallexample

@noindent
In this situation, it may seem reasonable to save a pointer to the C
string returned by the @code{c_str} member function and use that rather
than call @code{c_str} repeatedly.  However, the temporary string
created by the call to @code{strfunc} is destroyed after @code{p} is
initialized, at which point @code{p} is left pointing to freed memory.

Code like this may run successfully under some other compilers,
particularly obsolete cfront-based compilers that delete temporaries
along with normal local variables.  However, the GNU C++ behavior is
standard-conforming, so if your program depends on late destruction of
temporaries it is not portable.

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:

@smallexample
const string& tmp = strfunc ();
charfunc (tmp.c_str ());
@end smallexample

@node Copy Assignment
@subsection Implicit Copy-Assignment for Virtual Bases

When a base class is virtual, only one subobject of the base class
belongs to each full object.  Also, the constructors and destructors are
invoked only once, and called from the most-derived class.  However, such
objects behave unspecified when being assigned.  For example:

@smallexample
struct Base@{
  char *name;
  Base(const char *n) : name(strdup(n))@{@}
  Base& operator= (const Base& other)@{
   free (name);
   name = strdup (other.name);
   return *this;
  @}
@};

struct A:virtual Base@{
  int val;
  A():Base("A")@{@}
@};

struct B:virtual Base@{
  int bval;
  B():Base("B")@{@}
@};

struct Derived:public A, public B@{
  Derived():Base("Derived")@{@}
@};

void func(Derived &d1, Derived &d2)
@{
  d1 = d2;
@}
@end smallexample

The C++ standard specifies that @samp{Base::Base} is only called once
when constructing or copy-constructing a Derived object.  It is
unspecified whether @samp{Base::operator=} is called more than once when
the implicit copy-assignment for Derived objects is invoked (as it is
inside @samp{func} in the example).

G++ implements the ``intuitive'' algorithm for copy-assignment: assign all
direct bases, then assign all members.  In that algorithm, the virtual
base subobject can be encountered more than once.  In the example, copying
proceeds in the following order: @samp{name} (via @code{strdup}),
@samp{val}, @samp{name} again, and @samp{bval}.

If application code relies on copy-assignment, a user-defined
copy-assignment operator removes any uncertainties.  With such an
operator, the application can define whether and how the virtual base
subobject is assigned.

@node Non-bugs
@section 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 GCC is better without them.

@itemize @bullet
@item
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.

@item
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.

@item
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.

@item
Warning when a non-void function value is ignored.

C contains many standard functions that return a value that most
programs choose to ignore.  One obvious example is @code{printf}.
Warning about this practice only leads the defensive programmer to
clutter programs with dozens of casts to @code{void}.  Such casts are
required so frequently that they become visual noise.  Writing those
casts becomes so automatic that they no longer convey useful
information about the intentions of the programmer.  For functions
where the return value should never be ignored, use the
@code{warn_unused_result} function attribute (@pxref{Function
Attributes}).

@item
@opindex fshort-enums
Making @option{-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.

@item
Making bit-fields unsigned by default on particular machines where ``the
ABI standard'' says to do so.

The ISO C standard leaves it up to the implementation whether a bit-field
declared plain @code{int} is signed or not.  This in effect creates two
alternative dialects of C@.

@opindex fsigned-bitfields
@opindex funsigned-bitfields
The GNU C compiler supports both dialects; you can specify the signed
dialect with @option{-fsigned-bitfields} and the unsigned dialect with
@option{-funsigned-bitfields}.  However, this leaves open the question of
which dialect to use by default.

Currently, the preferred dialect makes plain bit-fields signed, because
this is simplest.  Since @code{int} is the same as @code{signed int} in
every other context, it is cleanest for them to be the same in bit-fields
as well.

Some computer manufacturers have published Application Binary Interface
standards which specify that plain bit-fields should be unsigned.  It is
a mistake, however, to say anything about this issue in an ABI@.  This is
because the handling of plain bit-fields distinguishes two dialects of C@.
Both dialects are meaningful on every type of machine.  Whether a
particular object file was compiled using signed bit-fields or unsigned
is of no concern to other object files, even if they access the same
bit-fields 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 bit-fields 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 GCC does and will treat plain bit-fields in the same
fashion on all types of machines (by default).

There are some arguments for making bit-fields unsigned by default on all
machines.  If, for example, this becomes a universal de facto standard,
it would make sense for GCC 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 bit-field whether it is signed or not.  In this way,
they write programs which have the same meaning in both C dialects.)

@item
@opindex ansi
@opindex std
Undefining @code{__STDC__} when @option{-ansi} is not used.

Currently, GCC defines @code{__STDC__} unconditionally.  This provides
good results in practice.

Programmers normally use conditionals on @code{__STDC__} to ask whether
it is safe to use certain features of ISO C, such as function
prototypes or ISO token concatenation.  Since plain @command{gcc} supports
all the features of ISO C, the correct answer to these questions is
``yes''.

Some users try to use @code{__STDC__} to check for the availability of
certain library facilities.  This is actually incorrect usage in an ISO
C program, because the ISO C standard says that a conforming
freestanding implementation should define @code{__STDC__} even though it
does not have the library facilities.  @samp{gcc -ansi -pedantic} is a
conforming freestanding implementation, and it is therefore required to
define @code{__STDC__}, even though it does not come with an ISO C
library.

Sometimes people say that defining @code{__STDC__} in a compiler that
does not completely conform to the ISO C standard somehow violates the
standard.  This is illogical.  The standard is a standard for compilers
that claim to support ISO C, such as @samp{gcc -ansi}---not for other
compilers such as plain @command{gcc}.  Whatever the ISO C standard says
is relevant to the design of plain @command{gcc} without @option{-ansi} only
for pragmatic reasons, not as a requirement.

GCC normally defines @code{__STDC__} to be 1, and in addition
defines @code{__STRICT_ANSI__} if you specify the @option{-ansi} option,
or a @option{-std} option for strict conformance to some version of ISO C@.
On some hosts, system include files use a different convention, where
@code{__STDC__} is normally 0, but is 1 if the user specifies strict
conformance to the C Standard.  GCC follows the host convention when
processing system include files, but when processing user files it follows
the usual GNU C convention.

@item
Undefining @code{__STDC__} in C++.

Programs written to compile with C++-to-C translators get the
value of @code{__STDC__} that goes with the C compiler that is
subsequently used.  These programs must test @code{__STDC__}
to determine what kind of C preprocessor that compiler uses:
whether they should concatenate tokens in the ISO C fashion
or in the traditional fashion.

These programs work properly with GNU C++ if @code{__STDC__} is defined.
They would not work otherwise.

In addition, many header files are written to provide prototypes in ISO
C but not in traditional C@.  Many of these header files can work without
change in C++ provided @code{__STDC__} is defined.  If @code{__STDC__}
is not defined, they will all fail, and will all need to be changed to
test explicitly for C++ as well.

@item
Deleting ``empty'' loops.

Historically, GCC has not deleted ``empty'' loops under the
assumption that the most likely reason you would put one in a program is
to have a delay, so deleting them will not make real programs run any
faster.

However, the rationale here is that optimization of a nonempty loop
cannot produce an empty one. This held for carefully written C compiled
with less powerful optimizers but is not always the case for carefully
written C++ or with more powerful optimizers.
Thus GCC will remove operations from loops whenever it can determine
those operations are not externally visible (apart from the time taken
to execute them, of course).  In case the loop can be proved to be finite,
GCC will also remove the loop itself.

Be aware of this when performing timing tests, for instance the
following loop can be completely removed, provided
@code{some_expression} can provably not change any global state.

@smallexample
@{
   int sum = 0;
   int ix;

   for (ix = 0; ix != 10000; ix++)
      sum += some_expression;
@}
@end smallexample

Even though @code{sum} is accumulated in the loop, no use is made of
that summation, so the accumulation can be removed.

@item
Making side effects happen in the same order as in some other compiler.

@cindex side effects, order of evaluation
@cindex order of evaluation, side effects
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:

@smallexample
void func (int, int);

int i = 2;
func (i++, i++);
@end smallexample

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.  @code{func} might get the
arguments @samp{2, 3}, or it might get @samp{3, 2}, or even @samp{2, 2}.

@item
Making certain warnings into errors by default.

Some ISO C testsuites report failure when the compiler does not produce
an error message for a certain program.

@opindex pedantic-errors
ISO C requires a ``diagnostic'' message for certain kinds of invalid
programs, but a warning is defined by GCC to count as a diagnostic.  If
GCC produces a warning but not an error, that is correct ISO C support.
If testsuites call this ``failure'', they should be run with the GCC
option @option{-pedantic-errors}, which will turn these warnings into
errors.

@end itemize

@node Warnings and Errors
@section Warning Messages and Error Messages

@cindex error messages
@cindex warnings vs errors
@cindex messages, warning and error
The GNU compiler can produce two kinds of diagnostics: errors and
warnings.  Each kind has a different purpose:

@itemize @w{}
@item
@dfn{Errors} report problems that make it impossible to compile your
program.  GCC reports errors with the source file name and line
number where the problem is apparent.

@item
@dfn{Warnings} report other unusual conditions in your code that
@emph{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 @samp{warning:} to distinguish them
from error messages.
@end itemize

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 @option{-W}
options (for instance, @option{-Wall} requests a variety of useful
warnings).

@opindex pedantic
@opindex pedantic-errors
GCC 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 @emph{must} be issued by a conforming
compiler.  The @option{-pedantic} option tells GCC to issue warnings in
such cases; @option{-pedantic-errors} says to make them errors instead.
This does not mean that @emph{all} non-ISO constructs get warnings
or errors.

@xref{Warning Options,,Options to Request or Suppress Warnings}, for
more detail on these and related command-line options.
