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