Annotation of gcc/cp/reno.texi, revision 1.1

1.1     ! root        1: \input texinfo       @c                    -*- Texinfo -*-
        !             2: @setfilename reno-1.info
        !             3: 
        !             4: @ifinfo
        !             5: @format
        !             6: START-INFO-DIR-ENTRY
        !             7: * Reno 1: (reno-1).             The GNU C++ Renovation Project, Phase 1.
        !             8: END-INFO-DIR-ENTRY
        !             9: @end format
        !            10: @end ifinfo
        !            11: 
        !            12: @ifinfo
        !            13: Copyright @copyright{} 1992, 1993, 1994 Free Software Foundation, Inc.
        !            14: 
        !            15: Permission is granted to make and distribute verbatim copies of
        !            16: this manual provided the copyright notice and this permission notice
        !            17: are preserved on all copies.
        !            18: 
        !            19: @ignore
        !            20: Permission is granted to process this file through TeX and print the
        !            21: results, provided the printed document carries a copying permission
        !            22: notice identical to this one except for the removal of this paragraph
        !            23: (this paragraph not being relevant to the printed manual).
        !            24: 
        !            25: @end ignore
        !            26: 
        !            27: Permission is granted to copy and distribute modified versions of this
        !            28: manual under the conditions for verbatim copying, provided also that
        !            29: the entire resulting derived work is distributed under the terms of a
        !            30: permission notice identical to this one.
        !            31: 
        !            32: Permission is granted to copy and distribute translations of this manual
        !            33: into another language, under the above conditions for modified versions.
        !            34: @end ifinfo
        !            35: 
        !            36: @setchapternewpage odd
        !            37: @settitle GNU C++ Renovation Project
        !            38: @c @smallbook
        !            39: 
        !            40: @titlepage
        !            41: @finalout
        !            42: @title GNU C++ Renovation Project
        !            43: @subtitle Phase 1.3
        !            44: @author Brendan Kehoe, Jason Merrill,
        !            45: @author Mike Stump, Michael Tiemann
        !            46: @page
        !            47: 
        !            48: Edited March, 1994 by Roland Pesch (@code{pesch@@cygnus.com})
        !            49: @vskip 0pt plus 1filll
        !            50: Copyright @copyright{} 1992, 1993, 1994 Free Software Foundation, Inc.
        !            51: 
        !            52: Permission is granted to make and distribute verbatim copies of
        !            53: this manual provided the copyright notice and this permission notice
        !            54: are preserved on all copies.
        !            55: 
        !            56: @ignore
        !            57: Permission is granted to process this file through Tex and print the
        !            58: results, provided the printed document carries copying permission
        !            59: notice identical to this one except for the removal of this paragraph
        !            60: (this paragraph not being relevant to the printed manual).
        !            61: @end ignore
        !            62: 
        !            63: Permission is granted to copy and distribute modified versions of this
        !            64: manual under the conditions for verbatim copying, provided also that
        !            65: the entire resulting derived work is distributed under the terms of a
        !            66: permission notice identical to this one.
        !            67: 
        !            68: Permission is granted to copy and distribute translations of this manual
        !            69: into another language, under the above conditions for modified versions.
        !            70: @end titlepage
        !            71: 
        !            72: @ifinfo
        !            73: @node Top
        !            74: @top @sc{gnu} C++ Renovation Project
        !            75: 
        !            76: This file describes the goals of the @sc{gnu} C++ Renovation Project,
        !            77: and its accomplishments to date (as of Phase 1.3).
        !            78: 
        !            79: It also discusses the remaining divergences from @sc{gnu} C++, and how the
        !            80: name encoding in @sc{gnu} C++ differs from the sample encoding in
        !            81: @cite{The Annotated C++ Reference Manual}.
        !            82: @c This is not a good place to introduce the acronym ARM because it's
        !            83: @c info-only. 
        !            84: 
        !            85: @menu
        !            86: * Introduction::       What is the GNU C++ Renovation Project?
        !            87: * Changes::            Summary of changes since previous GNU C++ releases.
        !            88: * Plans::              Plans for Reno-2.
        !            89: * Templates::          The template implementation.
        !            90: * ANSI::               GNU C++ conformance to ANSI C++.
        !            91: * Encoding::           Name encoding in GNU C++.
        !            92: @end menu
        !            93: 
        !            94: @end ifinfo
        !            95: 
        !            96: @node Introduction
        !            97: @chapter Introduction
        !            98: 
        !            99: As you may remember, @sc{gnu} C++ was the first native-code C++
        !           100: compiler available under Unix (December 1987).  In November 1988, it was
        !           101: judged superior to the AT&T compiler in a Unix World review.  In 1990 it
        !           102: won a Sun Observer ``Best-Of'' award.  But now, with new requirements
        !           103: coming out of the @sc{ansi} C++ committee and a growing backlog of bugs, it's
        !           104: clear that @sc{gnu} C++ needs an overhaul.
        !           105: 
        !           106: The C++ language has been under development since 1982.  It has
        !           107: evolved significantly since its original incarnation (C with Classes),
        !           108: addressing many commercial needs and incorporating many lessons
        !           109: learned as more and more people started using ``object-oriented''
        !           110: programming techniques.  In 1989, the first X3J16 committee meeting
        !           111: was held in Washington DC; in the interest of users, C++ was going to
        !           112: be standardized.
        !           113: 
        !           114: As C++ has become more popular, more demands have been placed on its
        !           115: compilers.  Some compilers are up to the demands, others are not.
        !           116: @sc{gnu} C++ was used to prototype several features which have since
        !           117: been incorporated into the standard, most notably exception handling.
        !           118: While @sc{gnu} C++ has been an excellent experimental vehicle, it did
        !           119: not have the resources that AT&T, Borland, or Microsoft have at their
        !           120: disposal.
        !           121: 
        !           122: We believe that @sc{gnu} C++ is an important compiler, providing users with
        !           123: many of the features that have made @sc{gnu} C so popular: fast compilation,
        !           124: good error messages, innovative features, and full sources that may be
        !           125: freely redistributed.  The purpose of this overhaul, dubbed the @var{@sc{gnu}
        !           126: C++ Renovation Project}, is to take advantage of the functionality that
        !           127: @sc{gnu} C++ offers today, to strengthen its base technology, and put it in a
        !           128: position to remain---as other @sc{gnu} software currently is---the technical
        !           129: leader in the field.
        !           130: 
        !           131: This release represents the latest phase of work in strengthening the
        !           132: compiler on a variety of points.  It includes many months of
        !           133: work concentrated on fixing many of the more egregious bugs that
        !           134: presented themselves in the compiler recently.
        !           135: @ignore
        !           136: @c FIXME-- update?
        !           137: Nearly 85% of all bugs reported in the period of February to September
        !           138: of 1992 were fixed as part of the work in the first phase.
        !           139: @end ignore
        !           140: In the coming months, we hope to continue expanding and enhancing the
        !           141: quality and dependability of the industry's only freely redistributable
        !           142: C++ compiler.
        !           143: 
        !           144: @node Changes
        !           145: @chapter Changes in Behavior in @sc{gnu} C++
        !           146: 
        !           147: The @sc{gnu} C++ compiler continues to improve and change.  A major goal
        !           148: of our work has been to continue to bring the compiler into compliance
        !           149: with the draft @sc{ansi} C++ standard, and with @cite{The Annotated C++
        !           150: Reference Manual} (the @sc{arm}).  This section outlines most of the
        !           151: user-noticeable changes that might be encountered during the normal
        !           152: course of use.
        !           153: 
        !           154: @menu
        !           155: * Summary of Phase 1.3::
        !           156: * Major changes::
        !           157: * New features::
        !           158: * Enhancements and bug fixes::
        !           159: * Problems with debugging::
        !           160: @end menu
        !           161: 
        !           162: @node Summary of Phase 1.3
        !           163: @section Summary of Changes in Phase 1.3
        !           164: 
        !           165: The bulk of this note discusses the cumulative effects of the @sc{gnu} C++
        !           166: Renovation Project to date.  The work during its most recent phase (1.3)
        !           167: had these major effects:
        !           168: 
        !           169: @itemize @bullet
        !           170: @item The standard compiler driver @code{g++} is now the faster compiled
        !           171: version, rather than a shell script.
        !           172: 
        !           173: @item Nested types work much better; notably, nesting is no longer
        !           174: restricted to nine levels.
        !           175: 
        !           176: @item Better @sc{arm} conformance on member access control.
        !           177: 
        !           178: @item The compiler now always generates default assignment operators
        !           179: (@samp{operator =}), copy constructors (@samp{X::X(X&)}), and default
        !           180: constructors (@samp{X::X()}) whenever they are required.
        !           181: 
        !           182: @item The new draft @sc{ansi} standard keyword @code{mutable} is supported.
        !           183: 
        !           184: @item @samp{-fansi-overloading} is the default, to comply better with
        !           185: the @sc{arm} (at some cost in compatibility to earlier versions of @sc{gnu} C++).
        !           186: 
        !           187: @item More informative error messages.
        !           188: 
        !           189: @item System include files are automatically treated as if they were
        !           190: wrapped in @samp{extern "C" @{ @}}.
        !           191: 
        !           192: @item The new option @samp{-falt-external-templates} provides alternate
        !           193: template instantiation semantics.
        !           194: 
        !           195: @item Operator declarations are now checked more strictly.
        !           196: 
        !           197: @item You can now use template type arguments in the template parameter list.
        !           198: 
        !           199: @item You can call the destructor for any type.
        !           200: 
        !           201: @item The compiler source code is better organized.
        !           202: 
        !           203: @item You can specify where to instantiate template definitions explicitly.
        !           204: @end itemize
        !           205: 
        !           206: Much of the work in Phase 1.3 went to elimination of known bugs, as well
        !           207: as the major items above.
        !           208: 
        !           209: During the span of Phase 1.3, there were also two changes associated
        !           210: with the compiler that, while not specifically part of the C++
        !           211: Renovation project, may be of interest:
        !           212: 
        !           213: @itemize @bullet
        !           214: @item @code{gcov}, a code coverage tool for @sc{gnu cc}, is now available
        !           215: from Cygnus Support.  (@code{gcov} is free software, but the @sc{fsf} has not
        !           216: yet accepted it.)  @xref{Gcov,, @code{gcov}: a Test Coverage Program,
        !           217: gcc.info, Using GNU CC}, for more information (in Cygnus releases of
        !           218: that manual).
        !           219: 
        !           220: @item @sc{gnu} C++ now supports @dfn{signatures}, a language extension to
        !           221: provide more flexibility in abstract type definitions.  @xref{C++
        !           222: Signatures,, Type Abstraction using Signatures, gcc.info, Using GNU CC}.
        !           223: @end itemize
        !           224: 
        !           225: @node Major changes
        !           226: @section Major Changes
        !           227: 
        !           228: This release includes four wholesale rewrites of certain areas of
        !           229: compiler functionality:
        !           230: 
        !           231: @enumerate 1
        !           232: @item Argument matching.  @sc{gnu} C++ is more compliant with the rules
        !           233: described in Chapter 13, ``Overloading'', of the @sc{arm}.  This behavior is
        !           234: the default, though you can specify it explicitly with
        !           235: @samp{-fansi-overloading}.   For compatibility with earlier releases of
        !           236: @sc{gnu} C++, specify @samp{-fno-ansi-overloading}; this makes the compiler
        !           237: behave as it used to with respect to argument matching and name overloading.
        !           238: 
        !           239: @item Default constructors/destructors.  Section 12.8 of the @sc{arm}, ``Copying
        !           240: Class Objects'', and Section 12.1, ``Constructors'', state that a
        !           241: compiler must declare such default functions if the user does not
        !           242: specify them.  @sc{gnu} C++ now declares, and generates when necessary,
        !           243: the defaults for constructors and destructors you might omit.  In
        !           244: particular, assignment operators (@samp{operator =}) behave the same way
        !           245: whether you define them, or whether the compiler generates them by
        !           246: default; taking the address of the default @samp{operator =} is now
        !           247: guaranteed to work.  Default copy constructors (@samp{X::X(X&)}) now
        !           248: function correctly, rather than calling the copy assignment operator for
        !           249: the base class.  Finally, constructors (@samp{X::X()}), as well as
        !           250: assignment operators and copy constructors, are now available whenever
        !           251: they are required.
        !           252: 
        !           253: @c XXX This may be taken out eventually...
        !           254: @item Binary incompatibility.  There are no new binary incompatibilities
        !           255: in Phase 1.3, but Phase 1.2 introduced two binary incompatibilities with
        !           256: earlier releases.  First, the functionality of @samp{operator
        !           257: new} and @samp{operator delete} changed.  Name encoding
        !           258: (``mangling'') of virtual table names changed as well.  Libraries
        !           259: built with versions of the compiler earlier than Phase 1.2 must be
        !           260: compiled with the new compiler.  (This includes the Cygnus Q2
        !           261: progressive release and the FSF 2.4.5 release.)
        !           262: 
        !           263: @item New @code{g++} driver.
        !           264: A new binary @code{g++} compiler driver replaces the shell script.
        !           265: The new driver executes faster.
        !           266: @end enumerate
        !           267: 
        !           268: @node New features
        !           269: @section New features
        !           270: 
        !           271: @itemize @bullet
        !           272: @item
        !           273: The compiler warns when a class contains only private constructors
        !           274: or destructors, and has no friends.  At the request of some of our
        !           275: customers, we have added a new option, @samp{-Wctor-dtor-privacy} (on by
        !           276: default), and its negation, @samp{-Wno-ctor-dtor-privacy}, to control
        !           277: the emission of this warning.  If, for example, you are working towards
        !           278: making your code compile warning-free, you can use @w{@samp{-Wall
        !           279: -Wno-ctor-dtor-privacy}} to find the most common warnings.
        !           280: 
        !           281: @item
        !           282: There is now a mechanism which controls exactly when templates are
        !           283: expanded, so that you can reduce memory usage and program size and also
        !           284: instantiate them exactly once.  You can control this mechanism with the
        !           285: option @samp{-fexternal-templates} and its corresponding negation
        !           286: @samp{-fno-external-templates}.  Without this feature, space consumed by
        !           287: template instantiations can grow unacceptably in large-scale projects
        !           288: with many different source files.  The default is
        !           289: @samp{-fno-external-templates}.
        !           290: 
        !           291: You do not need to use the @samp{-fexternal-templates} option when
        !           292: compiling a file that does not define and instantiate templates used in
        !           293: other files, even if those files @emph{are} compiled with
        !           294: @samp{-fexternal-templates}.  The only side effect is an increase in
        !           295: object size for each file that was compiled without
        !           296: @samp{-fexternal-templates}.
        !           297: 
        !           298: When your code is compiled with @samp{-fexternal-templates}, all
        !           299: template instantiations are external; this requires that the templates
        !           300: be under the control of @samp{#pragma interface} and @samp{#pragma
        !           301: implementation}.  All instantiations that will be needed should be in
        !           302: the implementation file; you can do this with a @code{typedef} that
        !           303: references the instantiation needed.  Conversely, when you compile using
        !           304: the option @samp{-fno-external-templates}, all template instantiations are
        !           305: explicitly internal.
        !           306: 
        !           307: @samp{-fexternal-templates} also allows you to finally separate class
        !           308: template function definitions from their declarations, thus speeding up
        !           309: compilation times for every file that includes the template declaration.
        !           310: Now you can have tens or even hundreds of lines in template
        !           311: declarations, and thousands or tens of thousands of lines in template
        !           312: definitions, with the definitions only going through the compiler once
        !           313: instead of once for each source file.  It is important to note that you
        !           314: must remember to externally instantiate @emph{all} templates that are
        !           315: used from template declarations in interface files.  If you forget to do
        !           316: this, unresolved externals will occur.
        !           317: 
        !           318: In the example below, the object file generated (@file{example.o}) will
        !           319: contain the global instantiation for @samp{Stack<int>}.  If other types
        !           320: of @samp{Stack} are needed, they can be added to @file{example.cc} or
        !           321: placed in a new file, in the same spirit as @file{example.cc}.
        !           322: 
        !           323: @code{foo.h}:
        !           324: @smallexample
        !           325: @group
        !           326: #pragma interface "foo.h"
        !           327: template<class T>
        !           328: class Stack @{
        !           329:   static int statc;
        !           330:   static T statc2;
        !           331:   Stack() @{ @}
        !           332:   virtual ~Stack() @{ @}
        !           333:   int bar();
        !           334: @};
        !           335: @end group
        !           336: @end smallexample
        !           337: 
        !           338: @code{example.cc}:
        !           339: @smallexample
        !           340: @group
        !           341: #pragma implementation "foo.h"
        !           342: #include "foo.h"
        !           343: 
        !           344: typedef Stack<int> t;
        !           345: int Stack<int>::statc;
        !           346: int Stack<int>::statc2;
        !           347: int Stack<int>::bar() @{ @}
        !           348: @end group
        !           349: @end smallexample
        !           350: 
        !           351: Note that using @samp{-fexternal-templates} does not reduce memory usage
        !           352: from completely different instantiations (@samp{Stack<Name>} vs.
        !           353: @samp{Stack<Net_Connection>}), but only collapses different occurrences
        !           354: of @samp{Stack<Name>} so that only one @samp{Stack<Name>} is generated.
        !           355: 
        !           356: @samp{-falt-external-templates} selects a slight variation in the
        !           357: semantics described above (incidentally, you need not specify both
        !           358: options; @samp{-falt-external-templates} implies
        !           359: @samp{-fexternal-templates}).  
        !           360: 
        !           361: With @samp{-fexternal-templates}, the compiler emits a definition in the
        !           362: implementation file that includes the header definition, @emph{even if}
        !           363: instantiation is triggered from a @emph{different} implementation file
        !           364: (e.g. with a template that uses another template).
        !           365: 
        !           366: With @samp{-falt-external-templates}, the definition always goes in the
        !           367: implementation file that triggers instantiation.
        !           368: 
        !           369: For instance, with these two header files---
        !           370: 
        !           371: @example
        !           372: @exdent @file{a.h}:
        !           373: #pragma interface
        !           374: template <class T> class A @{ @dots{} @};
        !           375: 
        !           376: @exdent @file{b.h}:
        !           377: #pragma interface
        !           378: class B @{ @dots{} @};
        !           379: void f (A<B>);
        !           380: @end example
        !           381: 
        !           382: Under @samp{-fexternal-templates}, the definition of @samp{A<B>} ends up
        !           383: in the implementation file that includes @file{a.h}.  Under
        !           384: @samp{-falt-external-templates}, the same definition ends up in the
        !           385: implementation file that includes @file{b.h}.
        !           386: 
        !           387: @item
        !           388: You can control explicitly where a template is instantiated, without
        !           389: having to @emph{use} the template to get an instantiation.  
        !           390: 
        !           391: To instantiate a class template explicitly, write @samp{template
        !           392: class @var{name}<paramvals>}, where @var{paramvals} is a list of values
        !           393: for the template parameters.  For example, you might write
        !           394: 
        !           395: @example
        !           396: template class A<int>
        !           397: @end example
        !           398: 
        !           399: Similarly, to instantiate a function template explicitly, write
        !           400: @samp{template @var{fnsign}} where @var{fnsign} is the particular
        !           401: function signature you need.  For example, you might write
        !           402: 
        !           403: @example
        !           404: template void foo (int, int)
        !           405: @end example
        !           406: 
        !           407: This syntax for explicit template instantiation agrees with recent
        !           408: extensions to the draft @sc{ansi} standard.
        !           409: 
        !           410: @item
        !           411: The compiler's actions on @sc{ansi}-related warnings and errors have
        !           412: been further enhanced.  The @samp{-pedantic-errors} option produces
        !           413: error messages in a number of new situations: using @code{return} in a
        !           414: non-@code{void} function (one returning a value); declaring a local
        !           415: variable that shadows a parameter (e.g., the function takes an argument
        !           416: @samp{a}, and has a local variable @samp{a}); and use of the @samp{asm}
        !           417: keyword.  Finally, the compiler by default now issues a warning when
        !           418: converting from an @code{int} to an enumerated type.  This is likely to
        !           419: cause many new warnings in code that hadn't triggered them before.  For
        !           420: example, when you compile this code,
        !           421: 
        !           422: @smallexample
        !           423: @group
        !           424: enum boolean @{ false, true @};
        !           425: void
        !           426: f ()
        !           427: @{
        !           428:   boolean x;
        !           429: 
        !           430:   x = 1; //@i{assigning an @code{int} to an @code{enum} now triggers a warning}
        !           431: @}
        !           432: @end group
        !           433: @end smallexample
        !           434: 
        !           435: @noindent
        !           436: you should see the warning ``@code{anachronistic conversion from integer
        !           437: type to enumeral type `boolean'}''.  Instead of assigning the value 1,
        !           438: assign the original enumerated value @samp{true}.
        !           439: @end itemize
        !           440: 
        !           441: @node Enhancements and bug fixes
        !           442: @section Enhancements and bug fixes
        !           443: 
        !           444: @itemize @bullet
        !           445: @cindex nested types in template parameters
        !           446: @item
        !           447: You can now use nested types in a template parameter list, even if the nested
        !           448: type is defined within the same class that attempts to use the template.
        !           449: For example, given a template @code{list}, the following now works:
        !           450: 
        !           451: @smallexample
        !           452: struct glyph @{
        !           453:   @dots{}
        !           454:   struct stroke @{ @dots{} @};
        !           455:   list<stroke> l;
        !           456:   @dots{}
        !           457: @}
        !           458: @end smallexample
        !           459: 
        !           460: @cindex function pointers vs template parameters
        !           461: @item
        !           462: Function pointers now work in template parameter lists.  For
        !           463: example, you might want to instantiate a parameterized @code{list} class
        !           464: in terms of a pointer to a function like this:
        !           465: 
        !           466: @smallexample
        !           467: list<int (*)(int, void *)> fnlist;
        !           468: @end smallexample
        !           469: 
        !           470: @item
        !           471: @c FIXME!  Really no limit?  Jason said "deeper than 9" now OK...
        !           472: Nested types are now handled correctly.  In particular, there is no
        !           473: longer a limit to how deeply you can nest type definitions.
        !           474: 
        !           475: @item
        !           476: @sc{gnu} C++ now conforms to the specifications in Chapter 11 of the
        !           477: @sc{arm}, ``Member Access Control''.
        !           478: 
        !           479: @item
        !           480: The @sc{ansi} C++ committee has introduced a new keyword @code{mutable}.
        !           481: @sc{gnu} C++ supports it.  Use @code{mutable} to specify that some
        !           482: particular members of a @code{const} class are @emph{not} constant.  For
        !           483: example, you can use this to include a cache in a data structure that
        !           484: otherwise represents a read-only database.
        !           485: 
        !           486: @item
        !           487: Error messages now explicitly specify the declaration, type, or
        !           488: expression that contains an error.
        !           489: 
        !           490: @item
        !           491: To avoid copying and editing all system include files during @sc{gnu}
        !           492: C++ installation, the compiler now automatically recognizes system
        !           493: include files as C language definitions, as if they were wrapped in
        !           494: @samp{extern "C" @{ @dots{} @}}.
        !           495: 
        !           496: @item
        !           497: The compiler checks operator declarations more strictly.  For example,
        !           498: you may no longer declare an @samp{operator +} with three arguments.
        !           499: 
        !           500: @item
        !           501: You can now use template type arguments in the same template
        !           502: parameter list where the type argument is specified (as well as in the
        !           503: template body).  For example, you may write
        !           504: 
        !           505: @example
        !           506: template <class T, T t> class A @{ @dots{} @};
        !           507: @end example
        !           508: 
        !           509: @item
        !           510: Destructors are now available for all types, even built-in ones; for
        !           511: example, you can call @samp{int::~int}.  (Destructors for types like
        !           512: @code{int} do not actually do anything, but their existence provides a
        !           513: level of generality that permits smooth template expansion in more
        !           514: cases.)
        !           515: 
        !           516: @item
        !           517: Enumerated types declared inside a class are now handled correctly.
        !           518: 
        !           519: @item
        !           520: An argument list for a function may not use an initializer list for its default
        !           521: value.  For example, @w{@samp{void foo ( T x = @{ 1, 2 @} )}} is not permitted.
        !           522: 
        !           523: @item
        !           524: A significant amount of work went into improving the ability of the
        !           525: compiler to act accurately on multiple inheritance and virtual
        !           526: functions.  Virtual function dispatch has been enhanced as well.
        !           527: 
        !           528: @item
        !           529: The warning concerning a virtual inheritance environment with a
        !           530: non-virtual destructor has been disabled, since it is not clear that
        !           531: such a warning is warranted.
        !           532: 
        !           533: @item
        !           534: Until exception handling is fully implemented in the Reno-2 release, use
        !           535: of the identifiers @samp{catch}, @samp{throw}, or @samp{try} results
        !           536: in the warning:
        !           537: 
        !           538: @smallexample
        !           539: t.C:1: warning: `catch', `throw', and `try' 
        !           540:        are all C++ reserved words
        !           541: @end smallexample
        !           542: 
        !           543: @item
        !           544: When giving a warning or error concerning initialization of a member in a
        !           545: class, the compiler gives the name of the member if it has one.
        !           546: 
        !           547: @item
        !           548: Detecting friendship between classes is more accurately checked.
        !           549: 
        !           550: @item
        !           551: The syntaxes of @w{@samp{#pragma implementation "file.h"}} and
        !           552: @samp{#pragma interface} are now more strictly controlled.  The compiler
        !           553: notices (and warns) when any text follows @file{file.h} in the
        !           554: implementation pragma, or follows the word @samp{interface}.  Any such
        !           555: text is otherwise ignored.
        !           556: 
        !           557: @item
        !           558: Trying to declare a template on a variable or type is now considered an
        !           559: error, not an unimplemented feature.
        !           560: 
        !           561: @item
        !           562: When an error occurs involving a template, the compiler attempts to
        !           563: tell you at which point of instantiation the error occurred, in
        !           564: addition to noting the line in the template declaration which had the
        !           565: actual error.
        !           566: 
        !           567: @item
        !           568: The symbol names for function templates in the resulting assembly file
        !           569: are now encoded according to the arguments, rather than just being
        !           570: emitted as, for example, two definitions of a function @samp{foo}.
        !           571: 
        !           572: @item
        !           573: Template member functions that are declared @code{static} no longer
        !           574: receive a @code{this} pointer.
        !           575: 
        !           576: @item
        !           577: Case labels are no longer allowed to have commas to make up their
        !           578: expressions.
        !           579: 
        !           580: @item
        !           581: Warnings concerning the shift count of a left or right shift now tell
        !           582: you if it was a @samp{left} or @samp{right} shift.
        !           583: 
        !           584: @item
        !           585: The compiler now warns when a decimal constant is so large that it
        !           586: becomes @code{unsigned}.
        !           587: 
        !           588: @item
        !           589: Union initializers which are raw constructors are now handled properly.
        !           590: 
        !           591: @item
        !           592: The compiler no longer gives incorrect errors when initializing a
        !           593: union with an empty initializer list.
        !           594: 
        !           595: @item
        !           596: Anonymous unions are now correctly used when nested inside a class.
        !           597: 
        !           598: @item
        !           599: Anonymous unions declared as static class members are now handled
        !           600: properly.
        !           601: 
        !           602: @item
        !           603: The compiler now notices when a field in a class is declared both as
        !           604: a type and a non-type.
        !           605: 
        !           606: @item
        !           607: The compiler now warns when a user-defined function shadows a
        !           608: built-in function, rather than emitting an error.
        !           609: 
        !           610: @item
        !           611: A conflict between two function declarations now produces an error
        !           612: regardless of their language context.
        !           613: 
        !           614: @item
        !           615: Duplicate definitions of variables with @samp{extern "C"} linkage are no
        !           616: longer considered in error.  (Note in C++ linkage---the default---you may
        !           617: not have more than one definition of a variable.)
        !           618: 
        !           619: @item
        !           620: Referencing a label that is not defined in any function is now an error.
        !           621: 
        !           622: @item
        !           623: The syntax for pointers to methods has been improved; there are still
        !           624: some minor bugs, but a number of cases should now be accepted by the
        !           625: compiler.
        !           626: 
        !           627: @item
        !           628: In error messages, arguments are now numbered starting at 1, instead of
        !           629: 0.  Therefore, in the function @samp{void foo (int a, int b)}, the
        !           630: argument @samp{a} is argument 1, and @samp{b} is argument 2.  There is
        !           631: no longer an argument 0.
        !           632: 
        !           633: @item
        !           634: The tag for an enumerator, rather than its value, used as a default
        !           635: argument is now shown in all error messages.  For example, @w{@samp{void
        !           636: foo (enum x (= true))}} is shown instead of @w{@samp{void foo (enum x (=
        !           637: 1))}}.
        !           638: 
        !           639: @item
        !           640: The @samp{__asm__} keyword is now accepted by the C++ front-end.
        !           641: 
        !           642: @item
        !           643: Expressions of the form @samp{foo->~Class()} are now handled properly.
        !           644: 
        !           645: @item
        !           646: The compiler now gives better warnings for situations which result in
        !           647: integer overflows (e.g., in storage sizes, enumerators, unary
        !           648: expressions, etc).
        !           649: 
        !           650: @item
        !           651: @code{unsigned} bitfields are now promoted to @code{signed int} if the
        !           652: field isn't as wide as an @code{int}.
        !           653: 
        !           654: @item
        !           655: Declaration and usage of prefix and postfix @samp{operator ++} and
        !           656: @samp{operator --} are now handled correctly.  For example,
        !           657: 
        !           658: @smallexample
        !           659: @group
        !           660: class foo
        !           661: @{
        !           662: public:
        !           663:   operator ++ ();
        !           664:   operator ++ (int);
        !           665:   operator -- ();
        !           666:   operator -- (int);
        !           667: @};
        !           668: 
        !           669: void
        !           670: f (foo *f)
        !           671: @{
        !           672:   f++;          // @i{call @code{f->operator++(int)}}
        !           673:   ++f;          // @i{call @code{f->operator++()}}
        !           674:   f--;          // @i{call @code{f->operator++(int)}}
        !           675:   --f;          // @i{call @code{f->operator++()}}
        !           676: @}
        !           677: @end group
        !           678: @end smallexample
        !           679: 
        !           680: @item
        !           681: In accordance with @sc{arm} section 10.1.1, ambiguities and dominance are now
        !           682: handled properly.  The rules described in section 10.1.1 are now fully
        !           683: implemented. 
        !           684: 
        !           685: @end itemize
        !           686: 
        !           687: @node Problems with debugging
        !           688: @section Problems with debugging
        !           689: 
        !           690: Two problems remain with regard to debugging:
        !           691: 
        !           692: @itemize @bullet
        !           693: @item
        !           694: Debugging of anonymous structures on the IBM RS/6000 host is incorrect.
        !           695: 
        !           696: @item
        !           697: Symbol table size is overly large due to redundant symbol information;
        !           698: this can make @code{gdb} coredump under certain circumstances.  This
        !           699: problem is not host-specific.
        !           700: @end itemize
        !           701: 
        !           702: @node Plans
        !           703: @chapter Plans for Reno-2
        !           704: 
        !           705: The overall goal for the second phase of the @sc{gnu} C++ Renovation
        !           706: Project is to bring @sc{gnu} C++ to a new level of reliability, quality,
        !           707: and competitiveness.  As particular elements of this strategy, we intend
        !           708: to:
        !           709: 
        !           710: @enumerate 0
        !           711: @item
        !           712: Fully implement @sc{ansi} exception handling.
        !           713: 
        !           714: @item
        !           715: With the exception handling, add Runtime Type Identification
        !           716: (@sc{rtti}), if the @sc{ansi} committee adopts it into the standard.
        !           717: 
        !           718: @item
        !           719: Bring the compiler into closer compliance with the @sc{arm} and the draft
        !           720: @sc{ansi} standard, and document what points in the @sc{arm} we do not yet comply,
        !           721: or agree, with.
        !           722: 
        !           723: @item
        !           724: Add further support for the @sc{dwarf} debugging format.
        !           725: 
        !           726: @item
        !           727: Finish the work to make the compiler compliant with @sc{arm} Section 12.6.2,
        !           728: initializing base classes in declaration order, rather than in the order
        !           729: that you specify them in a @var{mem-initializer} list.
        !           730: 
        !           731: @item
        !           732: Perform a full coverage analysis on the compiler, and weed out unused
        !           733: code, for a gain in performance and a reduction in the size of the compiler.
        !           734: 
        !           735: @item
        !           736: Further improve the multiple inheritance implementation in the
        !           737: compiler to make it cleaner and more complete.
        !           738: @end enumerate
        !           739: 
        !           740: @noindent
        !           741: As always, we encourage you to make suggestions and ask questions about
        !           742: @sc{gnu} C++ as a whole, so we can be sure that the end of this project
        !           743: will bring a compiler that everyone will find essential for C++ and will
        !           744: meet the needs of the world's C++ community.
        !           745: 
        !           746: @include templates.texi
        !           747: 
        !           748: @include gpcompare.texi
        !           749: 
        !           750: @contents
        !           751: 
        !           752: @bye

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.