*** Changes in GCC 3.4:

* Changes in GCC 3.4 are described in 'gcc-3.4/changes.html'

*** Changes in GCC 3.3:

* The "new X = 3" extension has been removed; you must now use "new X(3)".

* G++ no longer allows in-class initializations of static data members
  that do not have arithmetic or enumeration type.  For example:

    struct S { 
      static const char* const p = "abc";
    };

  is no longer accepted.  

  Use the standards-conformant form:

    struct S { 
      static const char* const p;
    };

    const char* const S::p = "abc";

  instead.

  (ISO C++ is even stricter; it does not allow in-class
  initializations of floating-point types.)

*** Changes in GCC 3.1:

* -fhonor-std and -fno-honor-std have been removed. -fno-honor-std was
  a workaround to allow std compliant code to work with the non-std
  compliant libstdc++-v2. libstdc++-v3 is std compliant.

* The C++ ABI has been fixed so that `void (A::*)() const' is mangled as
  "M1AKFvvE", rather than "MK1AFvvE" as before.  This change only affects
  pointer to cv-qualified member function types.

* The C++ ABI has been changed to correctly handle this code:
	
    struct A {
      void operator delete[] (void *, size_t);
    };

    struct B : public A { 
    };

    new B[10];

  The amount of storage allocated for the array will be greater than
  it was in 3.0, in order to store the number of elements in the
  array, so that the correct size can be passed to `operator delete[]'
  when the array is deleted.  Previously, the value passed to 
  `operator delete[]' was unpredictable.

  This change will only affect code that declares a two-argument
  `operator delete[]' with a second parameter of type `size_t'
  in a base class, and does not override that definition in a 
  derived class.

* The C++ ABI has been changed so that:

    struct A { 
      void operator delete[] (void *, size_t);
      void operator delete[] (void *);
    };

  does not cause unnecessary storage to be allocated when an array of
  `A' objects is allocated.

  This change will only affect code that declares both of these
  forms of `operator delete[]', and declared the two-argument form
  before the one-argument form.

* The C++ ABI has been changed so that when a parameter is passed by value,
  any cleanup for that parameter is performed in the caller, as specified
  by the ia64 C++ ABI, rather than the called function as before.  As a
  result, classes with a non-trivial destructor but a trivial copy
  constructor will be passed and returned by invisible reference, rather
  than by bitwise copy as before.

* G++ now supports the "named return value optimization":  for code like

    A f () {
      A a;
      ...
      return a;
    }

  G++ will allocate 'a' in the return value slot, so that the return
  becomes a no-op.  For this to work, all return statements in the function
  must return the same variable.

*** Changes in GCC 3.0:

* Support for guiding declarations has been removed.

* G++ now supports importing member functions from base classes with a
  using-declaration.

* G++ now enforces access control for nested types.

* In some obscure cases, functions with the same type could have the
  same mangled name.  This bug caused compiler crashes, link-time clashes,
  and debugger crashes.  Fixing this bug required breaking ABI
  compatibility for the functions involved.  The functions in questions
  are those whose types involve non-type template arguments whose
  mangled representations require more than one digit.

* Support for assignment to `this' has been removed.  This idiom 
  was used in the very early days of C++, before users were allowed
  to overload `operator new'; it is no longer allowed by the C++
  standard.

* Support for signatures, a G++ extension, have been removed.

* Certain invalid conversions that were previously accepted will now
  be rejected.  For example, assigning function pointers of one type
  to function pointers of another type now requires a cast, whereas
  previously g++ would sometimes accept the code even without the
  cast.

* G++ previously allowed `sizeof (X::Y)' where Y was a non-static
  member of X, even if the `sizeof' expression occurred outside
  of a non-static member function of X (or one of its derived classes, 
  or a member-initializer for X or one of its derived classes.)   This
  extension has been removed.

* G++ no longer allows you to overload the conditional operator (i.e., 
  the `?:' operator.)

* The "named return value" extension:
	
    int f () return r { r = 3; }

  has been deprecated, and will be removed in a future version of G++.

*** Changes in GCC 2.95:

* Messages about non-conformant code that we can still handle ("pedwarns")
  are now errors by default, rather than warnings.  This can be reverted
  with -fpermissive, and is overridden by -pedantic or -pedantic-errors.

* String constants are now of type `const char[n]', rather than `char[n]'.
  This can be reverted with -fno-const-strings.

* References to functions are now supported.

* Lookup of class members during class definition now works in all cases.

* In overload resolution, type conversion operators are now properly
  treated as always coming from the most derived class.

* C9x-style restricted pointers are supported, using the `__restrict'
  keyword.

* You can now use -fno-implicit-inline-templates to suppress writing out
  implicit instantiations of inline templates.  Normally we do write them
  out, even with -fno-implicit-templates, so that optimization doesn't
  affect which instantiations are needed.

* -fstrict-prototype now also suppresses implicit declarations.

* Many obsolete options have been removed: -fall-virtual, -fmemoize-lookups,
  -fsave-memoized, +e?, -fenum-int-equivalence, -fno-nonnull-objects.

* Unused virtual functions can be discarded on some targets by specifying
  -ffunction-sections -fvtable-gc to the compiler and --gc-sections to the
  linker.  Unfortunately, this only works on Linux if you're linking
  statically.

* Lots of bugs stomped.

*** Changes in EGCS 1.1:

* Namespaces are fully supported.  The library has not yet been converted 
  to use namespace std, however, and the old std-faking code is still on by
  default.  To turn it off, you can use -fhonor-std.

* Massive template improvements:
  + member template classes are supported.
  + template friends are supported.
  + template template parameters are supported.
  + local classes in templates are supported.
  + lots of bugs fixed.

* operator new now throws bad_alloc where appropriate.

* Exception handling is now thread safe, and supports nested exceptions and
  placement delete.  Exception handling overhead on x86 is much lower with
  GNU as 2.9.

* protected virtual inheritance is now supported.

* Loops are optimized better; we now move the test to the end in most
  cases, like the C frontend does.

* For class D derived from B which has a member 'int i', &D::i is now of
  type 'int B::*' instead of 'int D::*'.

* An _experimental_ new ABI for g++ can be turned on with -fnew-abi.  The
  current features of this are more efficient allocation of base classes
  (including the empty base optimization), and more compact mangling of C++
  symbol names (which can be turned on separately with -fsquangle).  This
  ABI is subject to change without notice, so don't use it for anything
  that you don't want to rebuild with every release of the compiler.

  As with all ABI-changing flags, this flag is for experts only, as all
  code (including the library code in libgcc and libstdc++) must be
  compiled with the same ABI.

*** Changes in EGCS 1.0:

* A public review copy of the December 1996 Draft of the ISO/ANSI C++
  standard is now available. See

	http://www.cygnus.com/misc/wp/

  for more information.

* g++ now uses a new implementation of templates. The basic idea is that
  now templates are minimally parsed when seen and then expanded later.
  This allows conformant early name binding and instantiation controls,
  since instantiations no longer have to go through the parser.

  What you get:

     + Inlining of template functions works without any extra effort or
       modifications.
     + Instantiations of class templates and methods defined in the class
       body are deferred until they are actually needed (unless
       -fexternal-templates is specified).
     + Nested types in class templates work.
     + Static data member templates work.
     + Member function templates are now supported.
     + Partial specialization of class templates is now supported.
     + Explicit specification of template parameters to function templates
       is now supported.

  Things you may need to fix in your code:

     + Syntax errors in templates that are never instantiated will now be
       diagnosed.
     + Types and class templates used in templates must be declared
       first, or the compiler will assume they are not types, and fail.
     + Similarly, nested types of template type parameters must be tagged
       with the 'typename' keyword, except in base lists.  In many cases,
       but not all, the compiler will tell you where you need to add
       'typename'.  For more information, see

            http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res

     + Guiding declarations are no longer supported.  Function declarations, 
       including friend declarations, do not refer to template instantiations.
       You can restore the old behavior with -fguiding-decls until you fix
       your code.

  Other features:

     + Default function arguments in templates will not be evaluated (or
       checked for semantic validity) unless they are needed.  Default
       arguments in class bodies will not be parsed until the class
       definition is complete.
     + The -ftemplate-depth-NN flag can be used to increase the maximum
       recursive template instantiation depth, which defaults to 17. If you
       need to use this flag, the compiler will tell you.
     + Explicit instantiation of template constructors and destructors is
       now supported.  For instance:

            template A<int>::A(const A&);

  Still not supported:

     + Member class templates.
     + Template friends.

* Exception handling support has been significantly improved and is on by
  default.  The compiler supports two mechanisms for walking back up the
  call stack; one relies on static information about how registers are
  saved, and causes no runtime overhead for code that does not throw
  exceptions.  The other mechanism uses setjmp and longjmp equivalents, and
  can result in quite a bit of runtime overhead.  You can determine which
  mechanism is the default for your target by compiling a testcase that
  uses exceptions and doing an 'nm' on the object file; if it uses __throw,
  it's using the first mechanism.  If it uses __sjthrow, it's using the
  second.

  You can turn EH support off with -fno-exceptions.

* RTTI support has been rewritten to work properly and is now on by default.
  This means code that uses virtual functions will have a modest space
  overhead.  You can use the -fno-rtti flag to disable RTTI support.

* On ELF systems, duplicate copies of symbols with 'initialized common'
  linkage (such as template instantiations, vtables, and extern inlines)
  will now be discarded by the GNU linker, so you don't need to use -frepo.
  This support requires GNU ld from binutils 2.8 or later.

* The overload resolution code has been rewritten to conform to the latest
  C++ Working Paper.  Built-in operators are now considered as candidates
  in operator overload resolution.  Function template overloading chooses
  the more specialized template, and handles base classes in type deduction
  and guiding declarations properly.  In this release the old code can
  still be selected with -fno-ansi-overloading, although this is not
  supported and will be removed in a future release.

* Standard usage syntax for the std namespace is supported; std is treated
  as an alias for global scope.  General namespaces are still not supported.

* New flags:

     + New warning -Wno-pmf-conversion (don't warn about
       converting from a bound member function pointer to function
       pointer).

     + A flag -Weffc++ has been added for violations of some of the style 
       guidelines in Scott Meyers' _Effective C++_ books.

     + -Woverloaded-virtual now warns if a virtual function in a base
       class is hidden in a derived class, rather than warning about
       virtual functions being overloaded (even if all of the inherited
       signatures are overridden) as it did before.

     + -Wall no longer implies -W.  The new warning flag, -Wsign-compare,
        included in -Wall, warns about dangerous comparisons of signed and
        unsigned values. Only the flag is new; it was previously part of
        -W.

     + The new flag, -fno-weak, disables the use of weak symbols.

* Synthesized methods are now emitted in any translation units that need
  an out-of-line copy. They are no longer affected by #pragma interface
  or #pragma implementation.

* __FUNCTION__ and __PRETTY_FUNCTION__ are now treated as variables by the
  parser; previously they were treated as string constants.  So code like
  `printf (__FUNCTION__ ": foo")' must be rewritten to 
  `printf ("%s: foo", __FUNCTION__)'.  This is necessary for templates.

* local static variables in extern inline functions will be shared between
  translation units.

* -fvtable-thunks is supported for all targets, and is the default for 
  Linux with glibc 2.x (also called libc 6.x).

* bool is now always the same size as another built-in type. Previously,
  a 64-bit RISC target using a 32-bit ABI would have 32-bit pointers and a
  64-bit bool. This should only affect Irix 6, which was not supported in
  2.7.2.

* new (nothrow) is now supported.

* Synthesized destructors are no longer made virtual just because the class
  already has virtual functions, only if they override a virtual destructor
  in a base class.  The compiler will warn if this affects your code.

* The g++ driver now only links against libstdc++, not libg++; it is
  functionally identical to the c++ driver.

* (void *)0 is no longer considered a null pointer constant; NULL in
  <stddef.h> is now defined as __null, a magic constant of type (void *)
  normally, or (size_t) with -ansi.

* The name of a class is now implicitly declared in its own scope; A::A
  refers to A.

* Local classes are now supported.

* __attribute__ can now be attached to types as well as declarations.

* The compiler no longer emits a warning if an ellipsis is used as a
  function's argument list.

* Definition of nested types outside of their containing class is now
  supported.  For instance:

       struct A {
              struct B;
              B* bp;
       };

       struct A::B {
              int member;
       };

* On the HPPA, some classes that do not define a copy constructor
  will be passed and returned in memory again so that functions
  returning those types can be inlined.

*** The g++ team thanks everyone that contributed to this release,
    but especially:

* Joe Buck <jbuck@synopsys.com>, the maintainer of the g++ FAQ.
* Brendan Kehoe <brendan@cygnus.com>, who coordinates testing of g++.
* Jason Merrill <jason@cygnus.com>, the g++ maintainer.
* Mark Mitchell <mmitchell@usa.net>, who implemented member function 
  templates and explicit qualification of function templates.
* Mike Stump <mrs@wrs.com>, the previous g++ maintainer, who did most of
  the exception handling work.
