|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.