+Mon Feb 2 11:24:22 1998 Mark Mitchell <mmitchell@usa.net>
+
+ * cp-tree.h (DECL_NONSTATIC_MEMBER_FUNCTION_P): New macro.
+ (revert_static_member_fn): Declare.
+ * decl.c (revert_static_member_fn): Remove declaration. Change
+ linkage from internal to external.
+ (cp_finish_decl): Deal with virtual functions in classes local to
+ template functions.
+ * decl2.c (finish_file): Don't forget to emit increment/decrement
+ expressions in initializers for file-scope variables.
+ * parse.y (typename_sub2): If the typename doesn't names a
+ template, rather than a type, issue an error message.
+ * pt.c (check_explicit_specialization): Handle specializations of
+ static member functions.
+ (coerce_template_parms): Handle offset references to lists of
+ member functions.
+ * search.c (note_debug_info_needed): Don't crash when handed a
+ type which is being defined.
+ * typeck.c (complete_type): Don't crash when handed NULL_TREE;
+ that can happen with some illegal code.
+
Mon Feb 2 00:57:38 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* call.c (user_harshness): Initialize `code' to 0.
(TREE_CODE (NODE) == VAR_DECL || TREE_CODE (NODE) == TYPE_DECL \
|| TREE_CODE (NODE) == CONST_DECL)
+/* Nonzero for FUNCTION_DECL means that this decl is a non-static
+ member function. */
+#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
+ (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
+
/* Nonzero for FUNCTION_DECL means that this decl is a member function
(static or non-static). */
#define DECL_FUNCTION_MEMBER_P(NODE) \
- (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE || DECL_STATIC_FUNCTION_P (NODE))
+ (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
/* Nonzero for FUNCTION_DECL means that this member function
has `this' as const X *const. */
extern void replace_defarg PROTO((tree, tree));
extern void print_other_binding_stack PROTO((struct binding_level *));
extern tree strip_attrs PROTO((tree));
+extern void revert_static_member_fn PROTO((tree*, tree*, tree*));
/* in decl2.c */
extern int flag_assume_nonnull_objects;
static tree grokparms PROTO((tree, int));
static tree lookup_nested_type PROTO((tree, tree));
static char *redeclaration_error_message PROTO((tree, tree));
-static void revert_static_member_fn PROTO((tree *, tree *, tree *));
static tree push_overloaded_decl PROTO((tree, int));
static void push_overloaded_decl_top_level PROTO((tree, int));
{
tree stmt = DECL_VINDEX (decl);
/* If the decl is declaring a member of a local class (in a
- template function), there will be no associated stmt. */
- if (stmt != NULL_TREE)
+ template function), the DECL_VINDEX will either be NULL,
+ or it will be an actual virtual function index, not a
+ DECL_STMT. */
+ if (stmt != NULL_TREE && TREE_CODE (stmt) == DECL_STMT)
{
DECL_VINDEX (decl) = NULL_TREE;
TREE_OPERAND (stmt, 2) = copy_to_permanent (init);
(TREE_TYPE (decl)) to ARGTYPES, as doing so will corrupt the types of
other decls. Either pass the addresses of local variables or NULL. */
-static void
+void
revert_static_member_fn (decl, fn, argtypes)
tree *decl, *fn, *argtypes;
{
}
else
expand_assignment (decl, init, 0, 0);
+
+ /* The expression might have involved increments and
+ decrements. */
+ emit_queue ();
/* Cleanup any temporaries needed for the initial value. */
expand_end_target_temps ();
@setfilename g++FAQ.info
@settitle Frequently asked questions about the GNU C++ compiler
@setchapternewpage off
-@c version: @(#)g++FAQ.texi 1.57 12/14/97
+@c version: @(#)g++FAQ.texi 1.60 01/31/98
@c %**end of header
@iftex
@titlepage
@title G++ FAQ
@subtitle Frequently asked questions about the GNU C++ compiler
-@subtitle December 14, 1997
+@subtitle January 31, 1998
@sp 1
@author Joe Buck
@page
for doing the index. A hypertext version is available on the World Wide
Web at @file{http://www.cygnus.com/misc/g++FAQ_toc.html}.
-@strong{News flash}: egcs has been released, and the 2.8.0 release is
-expected very soon!
+@strong{News flash}: gcc 2.8.0 has finally been released!
+This FAQ still has much material that refers to older releases; it will
+take some time before it is completely "modernized".
Please send updates and corrections to the FAQ to
@code{jbuck@@synopsys.com}. Please do @emph{not} use me as a resource
or in HTML form at @file{http://www.cerfnet.com/~mpcline/On-Line-C++-FAQs/}.
@menu
-* basics:: What is g++? How do I get it?
-* egcs and 2.8.0:: The next generation(s) of g++
-* installation:: How to install, installation problems
-* evolution:: The Evolution of g++
-* User Problems:: Commonly reported problems and bugs
-* legalities:: Lawyer stuff, GPL, LGPL, etc.
-* index:: Index of terms
+* basics:: What is g++? How do I get it?
+* egcs and 2.8.0:: The next generation(s) of g++
+* installation:: How to install, installation problems
+* evolution:: The Evolution of g++
+* User Problems:: Commonly reported problems and bugs
+* legalities:: Lawyer stuff, GPL, LGPL, etc.
+* index:: Index of terms
--- The Detailed Node Listing ---
The basics: what is g++?
-* latest versions::
-* g++ for Unix::
-* g++ for HP::
-* g++ for Solaris 2.x::
-* g++ for other platforms::
-* 1.x vs 2.x versions::
+* latest versions::
+* g++ for Unix::
+* g++ for HP::
+* g++ for Solaris 2.x::
+* g++ for other platforms::
+* 1.x vs 2.x versions::
The Next Generation(s) of g++
-* egcs-intro:: What is egcs?
-* egcs-whats-new:: What's new in egcs vs 2.7.2?
-* egcs-run-both:: How can I run both egcs and an FSF release?
-* egcs-vs-2.8.0:: How will egcs affect 2.8.0?
-* egcs-robustness:: How robust is egcs-1.0?
+* new-in-2.8.0:: What's new in gcc 2.8.0?
+* egcs-intro:: What is egcs?
+* egcs-whats-new:: What's new in egcs vs 2.7.2?
+* egcs-bug-fixes:: What was fixed in egcs-1.0.1?
+* egcs-linux:: If I install on Linux, will it overwrite my libraries?
+* egcs-run-both:: How can I run both egcs and an FSF release?
+* egcs-vs-2.8.0:: How will egcs affect 2.8.0?
+* egcs-robustness:: How robust is egcs?
Installation Issues and Problems
-* gcc-2 + g++-1::
-* what else do I need?::
-* use GNU linker?::
-* Use GNU assembler?::
-* shared libraries::
-* repository::
-* repo bugs::
-* Use GNU C library?::
+* gcc-2 + g++-1::
+* what else do I need?::
+* use GNU linker?::
+* Use GNU assembler?::
+* shared libraries::
+* repository::
+* repo bugs::
+* Use GNU C library?::
* Global constructor problems::
-* Strange assembler errors::
+* Strange assembler errors::
* Other problems building libg++::
-* More size_t problems::
-* Rebuild libg++?::
-* co-existing versions::
-* Installing on Linux::
-* Linux Slackware 3.0::
+* More size_t problems::
+* Rebuild libg++?::
+* co-existing versions::
+* Installing on Linux::
+* Linux Slackware 3.0::
The Evolution of g++
-* version 2.7.x:: What's changed in 2.7.x from earlier versions
-* libstdc++::
+* version 2.7.x:: What's changed in 2.7.x from earlier versions
+* libstdc++::
User Problems
-* missing virtual table::
-* for scope::
-* const constructor::
-* unused parameter warnings::
+* missing virtual table::
+* for scope::
+* const constructor::
+* unused parameter warnings::
* jump crosses initialization::
-* Demangler::
-* static data members::
-* internal compiler error::
-* bug reports::
-* porting to g++::
-* name mangling::
+* Demangler::
+* static data members::
+* internal compiler error::
+* bug reports::
+* porting to g++::
+* name mangling::
* problems linking with other libraries::
-* documentation::
-* templates::
-* undefined templates::
-* redundant templates::
-* Standard Template Library::
-* STL and string::
-* exceptions::
-* namespaces::
-* agreement with standards::
+* documentation::
+* templates::
+* undefined templates::
+* redundant templates::
+* Standard Template Library::
+* STL and string::
+* exceptions::
+* namespaces::
+* agreement with standards::
* compiling standard libraries::
-* debugging on SVR4 systems::
+* debugging on SVR4 systems::
* debugging problems on Solaris::
-* X11 conflicts with libg++::
-* assignment to streams::
+* X11 conflicts with libg++::
+* assignment to streams::
@end menu
@node basics, egcs and 2.8.0, Top, Top
or GPL (@pxref{legalities}).
@menu
-* latest versions::
-* g++ for Unix::
-* g++ for HP::
-* g++ for Solaris 2.x::
-* g++ for other platforms::
-* 1.x vs 2.x versions::
+* latest versions::
+* g++ for Unix::
+* g++ for HP::
+* g++ for Solaris 2.x::
+* g++ for other platforms::
+* 1.x vs 2.x versions::
@end menu
@node latest versions, g++ for Unix, basics, basics
@cindex egcs release
The egcs project (on the Web: @file{http://www.cygnus.com/egcs/}) has
-now released egcs-1.0 as of December 3, 1997.
+released a bug-fix version, egcs-1.0.1, on January 6, 1998. Folks
+using egcs-1.0 should upgrade, as it has some important bug fixes.
@cindex gcc/g++, version date
-The current version of gcc/g++ is 2.7.2.3, released August 20, 1997.
-Although that looks very recent, the only change is a minor patch to
-resolve a problem with Linux and the GNU C library; users not interested
-in that functionality have no reason to upgrade.
+The current version of gcc/g++ is 2.8.0 (!), released January 14, 1998.
+It is a huge improvement over the 2.7.x releases, and thanks to
+extensive testing in the egcs framework, is perhaps the least buggy .0
+gcc release anyone can remember (though there are definitely a few).
-The current version of libg++ is 2.7.2, released July 4, 1996.
-The last release of gcc/g++ with improvements to the C++ front end was
-2.7.2, released Nov. 25, 1995, nearly two years ago.
+The current version of libg++ is 2.8.0, released January 19, 1998.
+However, libg++ is being deprecated; libstdc++-2.8.0 contains just the
+standard C++ classes and is a subset of libg++ 2.8.0. The libstdc++
+library is identical to the one included in egcs-1.0.1.
I would strongly recommend that anyone using a g++ version earlier
than 2.7.2 should upgrade if at all possible (@pxref{version 2.7.x}).
+Folks who need modern C++ features should upgrade to 2.8.0 or egcs.
For some non-Unix platforms, the latest port of gcc may be an earlier
version (2.6.3, say). You'll need to use a version of libg++ that
Eberhard Mattes did the EMX port. His address is
mattes@@azu.informatik.uni-stuttgart.de.
-Read the FAQ file included with the distribution before harassing the author.
+Read the FAQ file included with the distribution before harrassing the author.
@cindex Apple support
@cindex Macintosh support
@node 1.x vs 2.x versions, , g++ for other platforms, basics
@section But I can only find g++-1.42!
-``I keep hearing people talking about g++ 2.7.2 (or some other number
+``I keep hearing people talking about g++ 2.8.0 (or some other number
starting with 2), but the latest version I can find is g++ 1.42.
Where is it?''
@chapter The Next Generation(s) of g++
@menu
-* egcs-intro:: What is egcs?
-* egcs-whats-new:: What's new in egcs vs 2.7.2?
-* egcs-run-both:: How can I run both egcs and an FSF release?
-* egcs-vs-2.8.0:: How will egcs affect 2.8.0?
-* egcs-robustness:: How robust is egcs-1.0?
+* new-in-2.8.0:: What's new in gcc 2.8.0?
+* egcs-intro:: What is egcs?
+* egcs-whats-new:: What's new in egcs vs 2.7.2?
+* egcs-bug-fixes:: What was fixed in egcs-1.0.1?
+* egcs-linux:: If I install on Linux, will it overwrite my libraries?
+* egcs-run-both:: How can I run both egcs and an FSF release?
+* egcs-vs-2.8.0:: How will egcs affect 2.8.0?
+* egcs-robustness:: How robust is egcs?
@end menu
-@node egcs-intro, egcs-whats-new, egcs and 2.8.0, egcs and 2.8.0
+@node new-in-2.8.0, egcs-intro, egcs and 2.8.0, egcs and 2.8.0
+@section What's new in gcc/g++ 2.8.0?
+
+After a two-year wait, gcc 2.8.0 was released in January 1998, along
+with libstdc++-2.8.0 and libg++-2.8.0. Note that the latter (libg++)
+contains the former (libstdc++) so there is no reason to install both
+library packages, but libstdc++ is required.
+
+For those familiar with egcs, the most obvious difference between
+gcc-2.8.0 and egcs-1.0 or 1.0.1 is the packaging: egcs is bundled with
+libstdc++, and gcc-2.8.0 does not contain the class library. Otherwise,
+except for the lack of the @code{-frepo} option and some bug fixes
+that have not yet made it into gcc-2.8.0, C++ users will find the
+two compilers to be almost the same at this stage, other than that 2.8.0
+users may get more bogus warnings with -Wall and optimization because
+some fixes to flow analysis in the presence of exceptions that egcs made
+are not yet present in gcc 2.8.0.
+
+Because the new feature lists for egcs and gcc 2.8 are almost the same,
+please see @xref{egcs-whats-new} for a list of new features. It is a
+fairly long list.
+
+@node egcs-intro, egcs-whats-new, new-in-2.8.0, egcs and 2.8.0
@section What is egcs?
egcs is the Experimental GNU compiler system (see
development model than gcc has traditionally used.
The first egcs release, egcs-1.0, came out on December 3, 1997.
+The current release is egcs-1.0.1, released January 6, 1998.
Questions not addressed here may be answered in the egcs FAQ
(@file{http://www.cygnus.com/egcs/faq.html}).
-@node egcs-whats-new, egcs-run-both, egcs-intro, egcs and 2.8.0
+@node egcs-whats-new, egcs-bug-fixes, egcs-intro, egcs and 2.8.0
@section What new C++ features are in egcs?
-@strong{Note}: unless indicated otherwise, these features are expected
-to be present in g++ 2.8.0 when released.
+@strong{Note}: unless indicated otherwise, these features are also
+present in g++ 2.8.0.
@itemize @bullet
@item
@cindex integrated libstdc++
-The standard C++ classes are integrated with the egcs release (this is
-@emph{not} expected to be true of gcc-2.8.0). libg++ is not being
-supported, though a version that will work with egcs has been
-contributed (FIXME: pointer?). The compiler and library are configured
-and built in one step.
+The standard C++ classes are integrated with the egcs release (but
+@strong{not} for gcc-2.8.0, which does not include the class libraries).
+libg++ is not being
+supported, though an add-on version that will work with egcs can be found at
+@file{ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.0b6.6.tar.gz},
+thanks to H.J. Lu. The compiler and library are configured and built
+in one step.
@item
@cindex new template implementation
A completely new template implementation, much closer to the draft
standard. Limitations in 2.7.2.x concerning inlining template functions
-will be eliminated. Static template data members, template class member
-functions, partial specification, and default template arguments will be
+are eliminated. Static template data members, template class member
+functions, partial specification, and default template arguments are
supported. An instantiation method resembling that used in Borland C++
(instantiating functions possibly in multiple .o files and using weak
symbols to link correctly) is provided, in addition to other
-options. The SGI version of STL is shipped verbatim with libstdc++.
+options. The SGI version of STL is shipped verbatim with libstdc++
+(libstdc++ is included with egcs, separate with gcc-2.8.0).
@item
@cindex redundant template elimination
@item
@cindex repository
@cindex -frepo
-The @code{-frepo} flag is supported in egcs (it will not be in 2.8.0).
+The @code{-frepo} flag is supported in egcs (it is not in 2.8.0).
However, because of the previous item, I don't recommend its use on ELF
-systems.
+systems, as the default method is better.
@item
@cindex new exception implementation
Features that are still missing include namespaces and templates as
template arguments.
-@node egcs-run-both, egcs-vs-2.8.0, egcs-whats-new, egcs and 2.8.0
+@node egcs-bug-fixes, egcs-linux, egcs-whats-new, egcs and 2.8.0
+@section What was fixed in egcs-1.0.1?
+
+@itemize @bullet
+
+@item
+Add support for Red Hat 5.0 Linux and better support for Linux
+systems using glibc2.
+
+@item
+Compatibility with both egcs-1.0 and gcc-2.8 libgcc exception handling
+interfaces (see below).
+
+@item
+Various bugfixes in the x86, hppa, mips, and rs6000/ppc backends.
+
+@item
+A few machine independent bugfixes, mostly to fix code generation bugs
+when building Linux kernels or glibc.
+
+@item
+Fix a few critical exception handling and template bugs in the C++
+compiler.
+
+@item
+Fix build problems on x86-solaris systems.
+@end itemize
+
+To avoid future compatibility problems, we strongly urge anyone who is
+planning on distributing shared libraries that contain C++ code to
+upgrade to egcs-1.0.1 first. See
+@file{http://www.cygnus.com/egcs/egcs-1.0.1.html} for details about the
+compatibility issues as well as additional information about the
+bugfixes since the egcs-1.0 release.
+
+@node egcs-linux, egcs-run-both, egcs-bug-fixes, egcs and 2.8.0
+@section If I install egcs on Linux, will it overwrite my libraries?
+
+No. If you build from sources, by default, egcs installs executables in
+@code{/usr/local/bin} and libraries in @code{/usr/local/lib}, and you
+can change this default if desired (see next section).
+
+If, however, you install a package (e.g. Debian or Red Hat) that wants
+to put egcs in @code{/usr/bin} and @code{/usr/lib}, then yes, you are
+replacing your system compiler and C++ library (I don't know if anyone
+has provided such packages yet -- proceed with caution).
+
+@node egcs-run-both, egcs-vs-2.8.0, egcs-linux, egcs and 2.8.0
@section How can I run both egcs and an FSF release of g++ on the same machine?
The recommended approach is to provide a different argument to the
@node egcs-vs-2.8.0, egcs-robustness, egcs-run-both, egcs and 2.8.0
@section What about 2.8.0? How does egcs affect the 2.8.x development?
-2.8.0 is expected Real Soon Now (I would guess by the end of 1997, but that
-is only a guess). The C++ front end should be essentially the same.
+2.8.0 has now been released, with essentially the same C++ front end as
+egcs.
Bug fixes generated in egcs will be passed to the 2.8.x releases for
inclusion; the reverse is also taking place, though a bug fix may
-appear in one before it does in the other.
+appear in one before it does in the other. egcs development is expected
+to proceed more quickly.
@node egcs-robustness, , egcs-vs-2.8.0, egcs and 2.8.0
-@section How solid is egcs-1.0?
+@section How robust is egcs?
While the 'e' stands for 'experimental', egcs has been tested thoroughly
-and should be of high quality. There are a few glitches which should be
-fixed shortly (in a 1.0.1 release, probably in early January):
+and should be of high quality. A few glitches in the initial release
+were fixed in 1.0.1. egcs-1.0 users should upgrade.
-@itemize @bullet
-@item
-Deeply nested templates sometimes lead to a very large memory requirement
-if the @code{-Wreturn-type} option is on (note: this flag is implicitly
-turned on by @code{-W} or @code{-Wall}. A workaround is to give the
-flag @code{-Wno-return-type} if you use @code{-Wall}.
-
-@item
-On Red Hat 5.0, it may be necessary to link all C++ programs with
-@code{-lpthread} to work around an undefined symbol problem.
-
-@item
-A patch is needed to fix egcs on Solaris/X86. It is in the egcs FAQ
-(see above).
-@end itemize
+Some memory bloat problems with deeply nested templates were fixed in
+1.0.1 (though it appears that there are still a few cases where
+excessive memory requirements occur).
@node installation, evolution, egcs and 2.8.0, Top
@chapter Installation Issues and Problems
@menu
-* gcc-2 + g++-1::
-* what else do I need?::
-* use GNU linker?::
-* Use GNU assembler?::
-* shared libraries::
-* repository::
-* repo bugs::
-* Use GNU C library?::
+* gcc-2 + g++-1::
+* what else do I need?::
+* use GNU linker?::
+* Use GNU assembler?::
+* shared libraries::
+* repository::
+* repo bugs::
+* Use GNU C library?::
* Global constructor problems::
-* Strange assembler errors::
+* Strange assembler errors::
* Other problems building libg++::
-* More size_t problems::
-* Rebuild libg++?::
-* co-existing versions::
-* Installing on Linux::
-* Linux Slackware 3.0::
+* More size_t problems::
+* Rebuild libg++?::
+* co-existing versions::
+* Installing on Linux::
+* Linux Slackware 3.0::
@end menu
@node gcc-2 + g++-1, what else do I need?, installation, installation
the debug symbol table considerably. The 2.7 version adds some symbol
table compression for ELF and Solaris targets.
-Users of egcs or 2.8.0 (when released) on ELF systems should definitely
+Users of egcs or 2.8.0 on ELF systems should definitely
use GNU ld (2.8 or later), as it will automatically remove duplicate
instantiations of templates, virtual function tables, or ``outlined''
copies of inline functions.
in the future.
@menu
-* version 2.7.x:: What's changed in 2.7.x from earlier versions
-* libstdc++::
+* version 2.7.x:: What's changed in 2.7.x from earlier versions
+* libstdc++::
@end menu
@node version 2.7.x, libstdc++, evolution, evolution
@section What's new in version 2.7.x of gcc/g++
-The current version of gcc/g++ is 2.7.2.2, released February 10, 1997.
-The only change between 2.7.2.1 and 2.7.2.2 is that support was added
-for using the GNU C library, version 2, on Linux; users not interested
-in that functionality have no reason to upgrade.
-The previous version of gcc/g++ is 2.7.2.1, released August 14, 1996.
-The current version of libg++ is 2.7.2, released July 4, 1996.
+[ This section is old now, since 2.8.0/egcs is the new stuff ] The
+latest 2.7.x version was 2.7.2.2, released February 10, 1997. The only
+change between 2.7.2.1 and 2.7.2.2 is that support was added for using
+the GNU C library, version 2, on Linux; users not interested in that
+functionality have no reason to upgrade. The previous version of
+gcc/g++ was 2.7.2.1, released August 14, 1996. The libg++ version that
+should be used with any 2.7.x gcc/g++ is 2.7.2, released July 4, 1996.
Note that gcc 2.7.2.1 just consists of several small patches to
gcc-2.7.2. The release is mainly
@chapter User Problems
@menu
-* missing virtual table::
-* for scope::
-* const constructor::
-* unused parameter warnings::
+* missing virtual table::
+* for scope::
+* const constructor::
+* unused parameter warnings::
* jump crosses initialization::
-* Demangler::
-* static data members::
-* internal compiler error::
-* bug reports::
-* porting to g++::
-* name mangling::
+* Demangler::
+* static data members::
+* internal compiler error::
+* bug reports::
+* porting to g++::
+* name mangling::
* problems linking with other libraries::
-* documentation::
-* templates::
-* undefined templates::
-* redundant templates::
-* Standard Template Library::
-* STL and string::
-* exceptions::
-* namespaces::
-* agreement with standards::
+* documentation::
+* templates::
+* undefined templates::
+* redundant templates::
+* Standard Template Library::
+* STL and string::
+* exceptions::
+* namespaces::
+* agreement with standards::
* compiling standard libraries::
-* debugging on SVR4 systems::
+* debugging on SVR4 systems::
* debugging problems on Solaris::
-* X11 conflicts with libg++::
-* assignment to streams::
+* X11 conflicts with libg++::
+* assignment to streams::
@end menu
@node missing virtual table, for scope, User Problems, User Problems
implementation, SGI's web site, at
@file{http://www.sgi.com/Technology/STL/}, is an excellent resource.
Note that the SGI version of STL is the one that is included with the
-egcs and 2.8.0 (when it occurs) releases of g++.
+egcs and 2.8.0 releases of g++/libstdc++.
@end itemize
@end example
@cindex template limitations
-As of version 2.6.3, there are still a few limitations in the template
+As of version 2.7.2, there are still a few limitations in the template
implementation besides the above (thanks to Jason Merrill for this info):
-These are still present in version 2.7.2, but a new implementation of
-templates planned for version 2.8 will eliminate them.
+
+@strong{Note}: these problems are eliminated in egcs and in gcc-2.8.0.
@enumerate 1
@item
@}
@end example
-A workaround that works in version 2.6.1 and later is to specify
+A workaround that works in version 2.6.1 through 2.7.2.x is to specify
@example
extern template int min (int, int);
before @code{f()}; this will force it to be instantiated (though not
emitted).
+@strong{Note:} this kind of ``guiding declaration'' is not standard and
+isn't supported by egcs or gcc-2.8.0, as the standard says that this
+declares a ``normal'' @code{min} function which has no relation to
+the template function @code{min<int>(int,int)}. But then the new
+compilers have no problem inlining template functions.
+
@item
Member function templates are always instantiated when their containing
-class is. This is wrong.
+class is. This is wrong (fixed in egcs/2.8).
@end enumerate
@node undefined templates, redundant templates, templates, User Problems
@node Standard Template Library, STL and string, redundant templates, User Problems
@section Does g++ support the Standard Template Library?
-@cindex STL
-@cindex Standard Template Library
-The Standard Template Library (STL) uses many of the extensions that the
-ANSI/ISO committee has made to templates, and g++ doesn't support
-some of these yet. So if you grab HP's free implementation of STL it
-isn't going to work. However, starting with libg++-2.6.2 libg++ contains a
-hacked version of STL, based on work by Carsten Bormann, which permits
-g++ to compile at least the containers (thanks to Per Bothner for this
-text).
-
-Actually, as of libg++ version 2.7.2 most of this works quite well, most
-of the time;
-I've succeeded
-in making significant use of it.
-Almost all of the ObjectSpace examples (a set of
-over 200 simple examples of STL usage) now work.
-
-When version 2.8.0 is out (with its complete redesign of the template
-implementation) a much more complete implementation of the
-STL (based on a newer free implementation from SGI) will be included.
-In the meantime, a group at the Moscow Center for Sparc Technology has
+If you want to use the Standard Template Library, do not pass go,
+upgrade immediately to gcc-2.8.0 or to egcs. The new C++ front end
+handles STL very well, and the high-quality implementation of STL
+from SGI is included verbatim as part of the libstdc++ class library.
+
+If for some reason you must use 2.7.2, you can probably get by with
+the hacked-up version of the old implementation from HP that is
+included with libg++-2.7.2, but it is definitely inferior and has more
+problems. Alternatively, g++ 2.7.2.x users might try the following:
+a group at the Moscow Center for Sparc Technology has
a port of the SGI STL implementation that mostly works with gcc-2.7.2.
See
@file{http://www.ipmce.su/people/fbp/stl/stlport.html}.
-In addition, there are several commercial suppliers of STL implementations;
-ObjectSpace's version supports gcc-2.7.x.
-
Mumit Khan has produced an ``STL newbie guide'' with lots of information
on using STL with gcc. See
@node STL and string, exceptions, Standard Template Library, User Problems
@section I'm having problems mixing STL and the standard string class
+[ This section is for g++ 2.7.2.x users only ]
+
This is due to a bug in g++ version 2.7.2 and 2.7.2.1; the compiler
is confused by the operator declarations. There is an easy workaround,
however; just make sure that the @code{<string>} header is included
As of version 2.7.2, g++ recognizes the keywords @code{namespace} and
@code{using}, and there is some rudimentary code present, but almost
-nothing connected with namespaces works yet. It appears that this will
-still be true when 2.8.0 is released.
+nothing connected with namespaces works yet.
+The new versions (2.8.0/egcs) still lack namespace support, but to help
+compile standard programs they make
+
+@example
+using namespace std;
+@end example
+
+a no-op.
@node agreement with standards, compiling standard libraries, namespaces, User Problems
@section What are the differences between g++ and the ARM specification of C++?
@cindex ARM [Annotated C++ Ref Manual]
@cindex exceptions
-As of version 2.7.0, g++ has exception support on most but not all
-platforms
-(no support on MIPS-based platforms yet), but
-it doesn't work right if optimization is enabled, which means the
-exception
-implementation is still
-not really ready for production use.
+Up until recently, there was no really usable exception support. If you
+need exceptions, you want gcc-2.8.0 or egcs. The implementation works
+fairly well. The 2.7.x version was strictly alpha quality and quite
+fragile.
@cindex mutable
Some features that the ANSI/ISO standardization committee has voted in
that don't appear in the ARM are supported, notably the @code{mutable}
-keyword, in version 2.5.x. 2.6.x adds support for the built-in boolean
-type @code{bool}, with constants @code{true} and @code{false}. The
-beginnings of run-time type identification are present, so there are
+keyword, in version 2.5.x. 2.6.x added support for the built-in boolean
+type @code{bool}, with constants @code{true} and @code{false}. Run-time
+type identification was rudimentary in 2.7.x but is fully supported in
+2.8.0, so there are
more reserved words: @code{typeid}, @code{static_cast},
@code{reinterpret_cast}, @code{const_cast}, and @code{dynamic_cast}.
As with any beta-test compiler, there are bugs. You can help improve
the compiler by submitting detailed bug reports.
+[ This paragraph obsoleted by 2.8.0/egcs: ]
One of the weakest areas of g++ other than templates is the resolution
of overloaded functions and operators in complex cases. The usual
symptom is that in a case where the ARM says that it is ambiguous which
Although the GNU C compiler already knows how to write out symbolic debugging
information in the DWARF format, the GNU C++ compiler does not yet have this
feature yet. However, work is in progress for DWARF 2 debug support for
-gcc and g++ and will be available in a future release (probably 2.8.0).
+gcc and g++ and it works fairly well in 2.8.0 and egcs, though we'll
+have to wait for gdb 4.17 to be released to take full advantage.
@cindex stabs
@cindex --with-stabs
step with @code{c++} instead of @code{g++} to search only the
@file{-lstdc++} library and avoid the LGPL'ed code in @file{-lg++}.
+Note that in egcs and in gcc-2.8.0, if you do not
+specify any libraries the @code{g++} command will only link in
+@file{-lstdc++}, so your executable will not be affected by the LGPL.
+
If you wish to discuss legal issues connected with GNU software on the
net, please use @file{gnu.misc.discuss}, not the technical newsgroups.
3126, 3130, 3133, 3136, 3138, 3140, 3142, 3146, 3149, 3152,
3154, 3156, 3158, 3165, 3176, 3180, 3185, 3189, 3194, 3196,
3200, 3203, 3205, 3209, 3211, 3212, 3215, 3217, 3223, 3238,
- 3244, 3250, 3264, 3266, 3270, 3286, 3292, 3307, 3314, 3320,
- 3322, 3323, 3324, 3332, 3341, 3342, 3346, 3349, 3355, 3361,
- 3364, 3366, 3368, 3370, 3374, 3378, 3382, 3385, 3390, 3393,
- 3395, 3397, 3399, 3401, 3403, 3405, 3407, 3411, 3415, 3419,
- 3423, 3424, 3426, 3428, 3430, 3432, 3434, 3436, 3438, 3440,
- 3448, 3450, 3451, 3452, 3455, 3463, 3468, 3475, 3477, 3482,
- 3484, 3487, 3501, 3504, 3507, 3516, 3528, 3539, 3559, 3569,
- 3572, 3580, 3592, 3595, 3598, 3601, 3617, 3620, 3631, 3632,
- 3636, 3651, 3670, 3682, 3696, 3710, 3723, 3742, 3760, 3779,
- 3787, 3808, 3826, 3839, 3840, 3843, 3843, 3846, 3846, 3849,
- 3849, 3855, 3861, 3864, 3869, 3876, 3885, 3894, 3903, 3911,
- 3924, 3926, 3930, 3932, 3935, 3942, 3945, 3953, 3969, 3980,
- 3992, 3994, 3997, 4007, 4017, 4028, 4030, 4032, 4035, 4052,
- 4058, 4066, 4068, 4070, 4074, 4077, 4078, 4086, 4090, 4094,
- 4097, 4098, 4104, 4107, 4110, 4112, 4116, 4121, 4124, 4134,
- 4139, 4140, 4148, 4154, 4159, 4163, 4168, 4172, 4176, 4180,
- 4185, 4196, 4210, 4214, 4217, 4219, 4223, 4227, 4230, 4233,
- 4235, 4239, 4241, 4248, 4255, 4258, 4261, 4265, 4269, 4275,
- 4279, 4284, 4286, 4289, 4294, 4300, 4311, 4314, 4316, 4320,
- 4325, 4327, 4334, 4337, 4339, 4341, 4347, 4352, 4355, 4357,
- 4359, 4361, 4363, 4365, 4367, 4369, 4371, 4373, 4375, 4377,
- 4379, 4381, 4383, 4385, 4387, 4389, 4391, 4393, 4395, 4397,
- 4399, 4401, 4403, 4405, 4407, 4409, 4411, 4413, 4415, 4417,
- 4420, 4422
+ 3244, 3250, 3264, 3266, 3270, 3286, 3292, 3307, 3318, 3324,
+ 3326, 3327, 3328, 3336, 3345, 3346, 3350, 3353, 3359, 3365,
+ 3368, 3370, 3372, 3374, 3378, 3382, 3386, 3389, 3394, 3397,
+ 3399, 3401, 3403, 3405, 3407, 3409, 3411, 3415, 3419, 3423,
+ 3427, 3428, 3430, 3432, 3434, 3436, 3438, 3440, 3442, 3444,
+ 3452, 3454, 3455, 3456, 3459, 3467, 3472, 3479, 3481, 3486,
+ 3488, 3491, 3505, 3508, 3511, 3520, 3532, 3543, 3563, 3573,
+ 3576, 3584, 3596, 3599, 3602, 3605, 3621, 3624, 3635, 3636,
+ 3640, 3655, 3674, 3686, 3700, 3714, 3727, 3746, 3764, 3783,
+ 3791, 3812, 3830, 3843, 3844, 3847, 3847, 3850, 3850, 3853,
+ 3853, 3859, 3865, 3868, 3873, 3880, 3889, 3898, 3907, 3915,
+ 3928, 3930, 3934, 3936, 3939, 3946, 3949, 3957, 3973, 3984,
+ 3996, 3998, 4001, 4011, 4021, 4032, 4034, 4036, 4039, 4056,
+ 4062, 4070, 4072, 4074, 4078, 4081, 4082, 4090, 4094, 4098,
+ 4101, 4102, 4108, 4111, 4114, 4116, 4120, 4125, 4128, 4138,
+ 4143, 4144, 4152, 4158, 4163, 4167, 4172, 4176, 4180, 4184,
+ 4189, 4200, 4214, 4218, 4221, 4223, 4227, 4231, 4234, 4237,
+ 4239, 4243, 4245, 4252, 4259, 4262, 4265, 4269, 4273, 4279,
+ 4283, 4288, 4290, 4293, 4298, 4304, 4315, 4318, 4320, 4324,
+ 4329, 4331, 4338, 4341, 4343, 4345, 4351, 4356, 4359, 4361,
+ 4363, 4365, 4367, 4369, 4371, 4373, 4375, 4377, 4379, 4381,
+ 4383, 4385, 4387, 4389, 4391, 4393, 4395, 4397, 4399, 4401,
+ 4403, 4405, 4407, 4409, 4411, 4413, 4415, 4417, 4419, 4421,
+ 4424, 4426
};
#endif
#line 3309 "parse.y"
{
if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE)
- yyval.ttype = lastiddecl;
- got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype));
+ yyvsp[-1].ttype = lastiddecl;
+
+ got_scope = yyval.ttype = complete_type (TREE_TYPE (yyvsp[-1].ttype));
+
+ if (yyval.ttype == error_mark_node)
+ cp_error ("`%T' is not a class or namespace", yyvsp[-1].ttype);
;
break;}
case 619:
-#line 3315 "parse.y"
+#line 3319 "parse.y"
{
if (TREE_CODE (yyvsp[-1].ttype) != IDENTIFIER_NODE)
yyval.ttype = lastiddecl;
;
break;}
case 620:
-#line 3321 "parse.y"
+#line 3325 "parse.y"
{ got_scope = yyval.ttype = complete_type (TREE_TYPE (yyval.ttype)); ;
break;}
case 623:
-#line 3325 "parse.y"
+#line 3329 "parse.y"
{
if (TREE_CODE (yyval.ttype) == IDENTIFIER_NODE)
yyval.ttype = lastiddecl;
;
break;}
case 624:
-#line 3334 "parse.y"
+#line 3338 "parse.y"
{
if (TREE_CODE (yyvsp[0].ttype) == IDENTIFIER_NODE)
yyval.ttype = IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype);
;
break;}
case 626:
-#line 3343 "parse.y"
+#line 3347 "parse.y"
{ yyval.ttype = yyvsp[0].ttype; ;
break;}
case 627:
-#line 3348 "parse.y"
+#line 3352 "parse.y"
{ got_scope = NULL_TREE; ;
break;}
case 628:
-#line 3350 "parse.y"
+#line 3354 "parse.y"
{ yyval.ttype = yyvsp[-1].ttype; got_scope = NULL_TREE; ;
break;}
case 629:
-#line 3357 "parse.y"
+#line 3361 "parse.y"
{ got_scope = void_type_node; ;
break;}
case 630:
-#line 3363 "parse.y"
+#line 3367 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 631:
-#line 3365 "parse.y"
+#line 3369 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ;
break;}
case 632:
-#line 3367 "parse.y"
+#line 3371 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 633:
-#line 3369 "parse.y"
+#line 3373 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[0].ttype, NULL_TREE); ;
break;}
case 634:
-#line 3371 "parse.y"
+#line 3375 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg);
;
break;}
case 635:
-#line 3375 "parse.y"
+#line 3379 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg);
;
break;}
case 637:
-#line 3384 "parse.y"
+#line 3388 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
break;}
case 638:
-#line 3386 "parse.y"
+#line 3390 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
break;}
case 639:
-#line 3392 "parse.y"
+#line 3396 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
break;}
case 640:
-#line 3394 "parse.y"
+#line 3398 "parse.y"
{ yyval.ttype = make_pointer_declarator (NULL_TREE, yyvsp[0].ttype); ;
break;}
case 641:
-#line 3396 "parse.y"
+#line 3400 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[0].ftype.t, NULL_TREE); ;
break;}
case 642:
-#line 3398 "parse.y"
+#line 3402 "parse.y"
{ yyval.ttype = make_pointer_declarator (NULL_TREE, NULL_TREE); ;
break;}
case 643:
-#line 3400 "parse.y"
+#line 3404 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
break;}
case 644:
-#line 3402 "parse.y"
+#line 3406 "parse.y"
{ yyval.ttype = make_reference_declarator (NULL_TREE, yyvsp[0].ttype); ;
break;}
case 645:
-#line 3404 "parse.y"
+#line 3408 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[0].ftype.t, NULL_TREE); ;
break;}
case 646:
-#line 3406 "parse.y"
+#line 3410 "parse.y"
{ yyval.ttype = make_reference_declarator (NULL_TREE, NULL_TREE); ;
break;}
case 647:
-#line 3408 "parse.y"
+#line 3412 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-1].ttype, arg);
;
break;}
case 648:
-#line 3412 "parse.y"
+#line 3416 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg);
;
break;}
case 650:
-#line 3421 "parse.y"
+#line 3425 "parse.y"
{ yyval.ttype = yyvsp[-1].ttype; ;
break;}
case 652:
-#line 3425 "parse.y"
+#line 3429 "parse.y"
{ yyval.ttype = make_call_declarator (yyval.ttype, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 653:
-#line 3427 "parse.y"
+#line 3431 "parse.y"
{ yyval.ttype = make_call_declarator (yyval.ttype, empty_parms (), yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 654:
-#line 3429 "parse.y"
+#line 3433 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, yyvsp[-1].ttype); ;
break;}
case 655:
-#line 3431 "parse.y"
+#line 3435 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, yyval.ttype, NULL_TREE); ;
break;}
case 656:
-#line 3433 "parse.y"
+#line 3437 "parse.y"
{ yyval.ttype = make_call_declarator (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 657:
-#line 3435 "parse.y"
+#line 3439 "parse.y"
{ set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 658:
-#line 3437 "parse.y"
+#line 3441 "parse.y"
{ set_quals_and_spec (yyval.ttype, yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 659:
-#line 3439 "parse.y"
+#line 3443 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
break;}
case 660:
-#line 3441 "parse.y"
+#line 3445 "parse.y"
{ yyval.ttype = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); ;
break;}
case 666:
-#line 3465 "parse.y"
+#line 3469 "parse.y"
{ do_pushlevel (); ;
break;}
case 667:
-#line 3470 "parse.y"
+#line 3474 "parse.y"
{ yyval.ttype = do_poplevel (); ;
break;}
case 669:
-#line 3478 "parse.y"
+#line 3482 "parse.y"
{ if (pedantic)
pedwarn ("ANSI C++ forbids label declarations"); ;
break;}
case 672:
-#line 3489 "parse.y"
+#line 3493 "parse.y"
{ tree link;
for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link))
{
;
break;}
case 673:
-#line 3503 "parse.y"
+#line 3507 "parse.y"
{;
break;}
case 675:
-#line 3509 "parse.y"
+#line 3513 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 676:
-#line 3517 "parse.y"
+#line 3521 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 677:
-#line 3530 "parse.y"
+#line 3534 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 678:
-#line 3540 "parse.y"
+#line 3544 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 679:
-#line 3559 "parse.y"
+#line 3563 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 680:
-#line 3571 "parse.y"
+#line 3575 "parse.y"
{ finish_stmt (); ;
break;}
case 681:
-#line 3573 "parse.y"
+#line 3577 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 682:
-#line 3581 "parse.y"
+#line 3585 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 683:
-#line 3594 "parse.y"
+#line 3598 "parse.y"
{ finish_stmt (); ;
break;}
case 685:
-#line 3600 "parse.y"
+#line 3604 "parse.y"
{ finish_stmt (); ;
break;}
case 686:
-#line 3602 "parse.y"
+#line 3606 "parse.y"
{
tree expr = yyvsp[-1].ttype;
if (! processing_template_decl)
finish_stmt (); ;
break;}
case 687:
-#line 3618 "parse.y"
+#line 3622 "parse.y"
{ if (! processing_template_decl) expand_start_else (); ;
break;}
case 688:
-#line 3620 "parse.y"
+#line 3624 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 689:
-#line 3631 "parse.y"
+#line 3635 "parse.y"
{ finish_stmt (); ;
break;}
case 690:
-#line 3633 "parse.y"
+#line 3637 "parse.y"
{ if (! processing_template_decl) expand_end_cond ();
do_poplevel ();
finish_stmt (); ;
break;}
case 691:
-#line 3637 "parse.y"
+#line 3641 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 692:
-#line 3652 "parse.y"
+#line 3656 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 693:
-#line 3671 "parse.y"
+#line 3675 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 694:
-#line 3683 "parse.y"
+#line 3687 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 695:
-#line 3697 "parse.y"
+#line 3701 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 696:
-#line 3711 "parse.y"
+#line 3715 "parse.y"
{
if (processing_template_decl)
TREE_OPERAND (yyvsp[-5].ttype, 1) = yyvsp[-1].ttype;
;
break;}
case 697:
-#line 3724 "parse.y"
+#line 3728 "parse.y"
{ if (processing_template_decl)
{
yyval.ttype = build_min_nt (FOR_STMT, NULL_TREE, NULL_TREE,
;
break;}
case 698:
-#line 3743 "parse.y"
+#line 3747 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 699:
-#line 3761 "parse.y"
+#line 3765 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 700:
-#line 3782 "parse.y"
+#line 3786 "parse.y"
{
if (processing_template_decl)
TREE_OPERAND (yyvsp[-9].ttype, 2) = yyvsp[-1].ttype;
;
break;}
case 701:
-#line 3788 "parse.y"
+#line 3792 "parse.y"
{
if (processing_template_decl)
{
finish_stmt (); ;
break;}
case 702:
-#line 3809 "parse.y"
+#line 3813 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 703:
-#line 3826 "parse.y"
+#line 3830 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 704:
-#line 3839 "parse.y"
+#line 3843 "parse.y"
{ finish_stmt (); ;
break;}
case 705:
-#line 3841 "parse.y"
+#line 3845 "parse.y"
{ do_case (yyvsp[-1].ttype, NULL_TREE); ;
break;}
case 707:
-#line 3844 "parse.y"
+#line 3848 "parse.y"
{ do_case (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
break;}
case 709:
-#line 3847 "parse.y"
+#line 3851 "parse.y"
{ do_case (NULL_TREE, NULL_TREE); ;
break;}
case 711:
-#line 3850 "parse.y"
+#line 3854 "parse.y"
{ emit_line_note (input_filename, lineno);
if (processing_template_decl)
add_tree (build_min_nt (BREAK_STMT));
error ("break statement not within loop or switch"); ;
break;}
case 712:
-#line 3856 "parse.y"
+#line 3860 "parse.y"
{ emit_line_note (input_filename, lineno);
if (processing_template_decl)
add_tree (build_min_nt (CONTINUE_STMT));
error ("continue statement not within a loop"); ;
break;}
case 713:
-#line 3862 "parse.y"
+#line 3866 "parse.y"
{ emit_line_note (input_filename, lineno);
c_expand_return (NULL_TREE); ;
break;}
case 714:
-#line 3865 "parse.y"
+#line 3869 "parse.y"
{ emit_line_note (input_filename, lineno);
c_expand_return (yyvsp[-1].ttype);
finish_stmt ();
;
break;}
case 715:
-#line 3870 "parse.y"
+#line 3874 "parse.y"
{ if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype);
emit_line_note (input_filename, lineno);
expand_asm (yyvsp[-2].ttype);
;
break;}
case 716:
-#line 3877 "parse.y"
+#line 3881 "parse.y"
{ if (TREE_CHAIN (yyvsp[-4].ttype)) yyvsp[-4].ttype = combine_strings (yyvsp[-4].ttype);
emit_line_note (input_filename, lineno);
c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE,
;
break;}
case 717:
-#line 3886 "parse.y"
+#line 3890 "parse.y"
{ if (TREE_CHAIN (yyvsp[-6].ttype)) yyvsp[-6].ttype = combine_strings (yyvsp[-6].ttype);
emit_line_note (input_filename, lineno);
c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE,
;
break;}
case 718:
-#line 3896 "parse.y"
+#line 3900 "parse.y"
{ if (TREE_CHAIN (yyvsp[-8].ttype)) yyvsp[-8].ttype = combine_strings (yyvsp[-8].ttype);
emit_line_note (input_filename, lineno);
c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype,
;
break;}
case 719:
-#line 3904 "parse.y"
+#line 3908 "parse.y"
{
if (processing_template_decl)
add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype));
;
break;}
case 720:
-#line 3912 "parse.y"
+#line 3916 "parse.y"
{
if (processing_template_decl)
add_tree (build_min_nt (GOTO_STMT, yyvsp[-1].ttype));
;
break;}
case 721:
-#line 3925 "parse.y"
+#line 3929 "parse.y"
{ finish_stmt (); ;
break;}
case 722:
-#line 3927 "parse.y"
+#line 3931 "parse.y"
{ error ("label must be followed by statement");
yyungetc ('}', 0);
finish_stmt (); ;
break;}
case 723:
-#line 3931 "parse.y"
+#line 3935 "parse.y"
{ finish_stmt (); ;
break;}
case 725:
-#line 3937 "parse.y"
+#line 3941 "parse.y"
{
if (! current_function_parms_stored)
store_parm_decls ();
;
break;}
case 726:
-#line 3943 "parse.y"
+#line 3947 "parse.y"
{ expand_start_all_catch (); ;
break;}
case 727:
-#line 3945 "parse.y"
+#line 3949 "parse.y"
{
int nested = (hack_decl_function_context
(current_function_decl) != NULL_TREE);
;
break;}
case 728:
-#line 3955 "parse.y"
+#line 3959 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 729:
-#line 3969 "parse.y"
+#line 3973 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 730:
-#line 3980 "parse.y"
+#line 3984 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 733:
-#line 3999 "parse.y"
+#line 4003 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 734:
-#line 4008 "parse.y"
+#line 4012 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 735:
-#line 4017 "parse.y"
+#line 4021 "parse.y"
{
if (processing_template_decl)
{
;
break;}
case 739:
-#line 4037 "parse.y"
+#line 4041 "parse.y"
{ expand_start_catch_block (NULL_TREE, NULL_TREE); ;
break;}
case 740:
-#line 4053 "parse.y"
+#line 4057 "parse.y"
{ check_for_new_type ("inside exception declarations", yyvsp[-1].ftype);
expand_start_catch_block (TREE_PURPOSE (yyvsp[-1].ftype.t),
TREE_VALUE (yyvsp[-1].ftype.t)); ;
break;}
case 741:
-#line 4060 "parse.y"
+#line 4064 "parse.y"
{ tree label;
do_label:
label = define_label (input_filename, lineno, yyvsp[-1].ttype);
;
break;}
case 742:
-#line 4067 "parse.y"
+#line 4071 "parse.y"
{ goto do_label; ;
break;}
case 743:
-#line 4069 "parse.y"
+#line 4073 "parse.y"
{ goto do_label; ;
break;}
case 744:
-#line 4071 "parse.y"
+#line 4075 "parse.y"
{ goto do_label; ;
break;}
case 745:
-#line 4076 "parse.y"
+#line 4080 "parse.y"
{ if (yyvsp[-1].ttype) cplus_expand_expr_stmt (yyvsp[-1].ttype); ;
break;}
case 747:
-#line 4079 "parse.y"
+#line 4083 "parse.y"
{ if (pedantic)
pedwarn ("ANSI C++ forbids compound statements inside for initializations");
;
break;}
case 748:
-#line 4088 "parse.y"
+#line 4092 "parse.y"
{ emit_line_note (input_filename, lineno);
yyval.ttype = NULL_TREE; ;
break;}
case 749:
-#line 4091 "parse.y"
+#line 4095 "parse.y"
{ emit_line_note (input_filename, lineno); ;
break;}
case 750:
-#line 4096 "parse.y"
+#line 4100 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 752:
-#line 4099 "parse.y"
+#line 4103 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 753:
-#line 4106 "parse.y"
+#line 4110 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 756:
-#line 4113 "parse.y"
+#line 4117 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, yyvsp[0].ttype); ;
break;}
case 757:
-#line 4118 "parse.y"
+#line 4122 "parse.y"
{ yyval.ttype = build_tree_list (yyval.ttype, yyvsp[-1].ttype); ;
break;}
case 758:
-#line 4123 "parse.y"
+#line 4127 "parse.y"
{ yyval.ttype = tree_cons (NULL_TREE, yyval.ttype, NULL_TREE); ;
break;}
case 759:
-#line 4125 "parse.y"
+#line 4129 "parse.y"
{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyval.ttype); ;
break;}
case 760:
-#line 4136 "parse.y"
+#line 4140 "parse.y"
{
yyval.ttype = empty_parms();
;
break;}
case 762:
-#line 4141 "parse.y"
+#line 4145 "parse.y"
{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ftype.t, void_list_node);
TREE_PARMLIST (yyval.ttype) = 1;
check_for_new_type ("inside parameter list", yyvsp[0].ftype); ;
break;}
case 763:
-#line 4150 "parse.y"
+#line 4154 "parse.y"
{
yyval.ttype = chainon (yyval.ttype, void_list_node);
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 764:
-#line 4155 "parse.y"
+#line 4159 "parse.y"
{
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 765:
-#line 4160 "parse.y"
+#line 4164 "parse.y"
{
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 766:
-#line 4164 "parse.y"
+#line 4168 "parse.y"
{
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t);
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 767:
-#line 4169 "parse.y"
+#line 4173 "parse.y"
{
yyval.ttype = NULL_TREE;
;
break;}
case 768:
-#line 4173 "parse.y"
+#line 4177 "parse.y"
{
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 769:
-#line 4177 "parse.y"
+#line 4181 "parse.y"
{
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 770:
-#line 4181 "parse.y"
+#line 4185 "parse.y"
{
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t);
TREE_PARMLIST (yyval.ttype) = 1;
;
break;}
case 771:
-#line 4186 "parse.y"
+#line 4190 "parse.y"
{
/* This helps us recover from really nasty
parse errors, for example, a missing right
;
break;}
case 772:
-#line 4197 "parse.y"
+#line 4201 "parse.y"
{
/* This helps us recover from really nasty
parse errors, for example, a missing right
;
break;}
case 773:
-#line 4212 "parse.y"
+#line 4216 "parse.y"
{ maybe_snarf_defarg (); ;
break;}
case 774:
-#line 4214 "parse.y"
+#line 4218 "parse.y"
{ yyval.ttype = yyvsp[0].ttype; ;
break;}
case 777:
-#line 4225 "parse.y"
+#line 4229 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[0].ftype);
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ftype.t); ;
break;}
case 778:
-#line 4228 "parse.y"
+#line 4232 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
yyval.ttype = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t); ;
break;}
case 779:
-#line 4231 "parse.y"
+#line 4235 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[0].ftype);
yyval.ttype = chainon (yyval.ttype, yyvsp[0].ftype.t); ;
break;}
case 780:
-#line 4234 "parse.y"
+#line 4238 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
break;}
case 781:
-#line 4236 "parse.y"
+#line 4240 "parse.y"
{ yyval.ttype = chainon (yyval.ttype, build_tree_list (yyvsp[0].ttype, yyvsp[-2].ttype)); ;
break;}
case 783:
-#line 4242 "parse.y"
+#line 4246 "parse.y"
{ check_for_new_type ("in a parameter list", yyvsp[-1].ftype);
yyval.ttype = build_tree_list (NULL_TREE, yyvsp[-1].ftype.t); ;
break;}
case 784:
-#line 4252 "parse.y"
+#line 4256 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ftype.t);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag;
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype); ;
break;}
case 785:
-#line 4256 "parse.y"
+#line 4260 "parse.y"
{ yyval.ftype.t = build_tree_list (yyvsp[-1].ftype.t, yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 786:
-#line 4259 "parse.y"
+#line 4263 "parse.y"
{ yyval.ftype.t = build_tree_list (get_decl_list (yyvsp[-1].ftype.t), yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 787:
-#line 4262 "parse.y"
+#line 4266 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ftype.t);
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 788:
-#line 4266 "parse.y"
+#line 4270 "parse.y"
{ tree specs = strip_attrs (yyvsp[0].ftype.t);
yyval.ftype.t = build_tree_list (specs, NULL_TREE);
yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ;
break;}
case 789:
-#line 4270 "parse.y"
+#line 4274 "parse.y"
{ tree specs = strip_attrs (yyvsp[-1].ttype);
yyval.ftype.t = build_tree_list (specs, yyvsp[0].ttype);
yyval.ftype.new_type_flag = 0; ;
break;}
case 790:
-#line 4277 "parse.y"
+#line 4281 "parse.y"
{ yyval.ftype.t = build_tree_list (NULL_TREE, yyvsp[0].ftype.t);
yyval.ftype.new_type_flag = yyvsp[0].ftype.new_type_flag; ;
break;}
case 791:
-#line 4280 "parse.y"
+#line 4284 "parse.y"
{ yyval.ftype.t = build_tree_list (yyvsp[0].ttype, yyvsp[-1].ftype.t);
yyval.ftype.new_type_flag = yyvsp[-1].ftype.new_type_flag; ;
break;}
case 794:
-#line 4291 "parse.y"
+#line 4295 "parse.y"
{ see_typename (); ;
break;}
case 795:
-#line 4296 "parse.y"
+#line 4300 "parse.y"
{
error ("type specifier omitted for parameter");
yyval.ttype = build_tree_list (integer_type_node, NULL_TREE);
;
break;}
case 796:
-#line 4301 "parse.y"
+#line 4305 "parse.y"
{
error ("type specifier omitted for parameter");
if (TREE_CODE (yyval.ttype) == SCOPE_REF
;
break;}
case 797:
-#line 4313 "parse.y"
+#line 4317 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 798:
-#line 4315 "parse.y"
+#line 4319 "parse.y"
{ yyval.ttype = yyvsp[-1].ttype; ;
break;}
case 799:
-#line 4317 "parse.y"
+#line 4321 "parse.y"
{ yyval.ttype = build_decl_list (NULL_TREE, NULL_TREE); ;
break;}
case 800:
-#line 4322 "parse.y"
+#line 4326 "parse.y"
{ yyval.ttype = build_decl_list (NULL_TREE, groktypename(yyvsp[0].ftype.t)); ;
break;}
case 802:
-#line 4328 "parse.y"
+#line 4332 "parse.y"
{
TREE_CHAIN (yyvsp[0].ttype) = yyval.ttype;
yyval.ttype = yyvsp[0].ttype;
;
break;}
case 803:
-#line 4336 "parse.y"
+#line 4340 "parse.y"
{ yyval.ttype = NULL_TREE; ;
break;}
case 804:
-#line 4338 "parse.y"
+#line 4342 "parse.y"
{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 805:
-#line 4340 "parse.y"
+#line 4344 "parse.y"
{ yyval.ttype = make_reference_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
break;}
case 806:
-#line 4342 "parse.y"
+#line 4346 "parse.y"
{ tree arg = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype);
yyval.ttype = build_parse_node (SCOPE_REF, yyvsp[-2].ttype, arg);
;
break;}
case 807:
-#line 4349 "parse.y"
+#line 4353 "parse.y"
{ got_scope = NULL_TREE; ;
break;}
case 808:
-#line 4354 "parse.y"
+#line 4358 "parse.y"
{ yyval.ttype = ansi_opname[MULT_EXPR]; ;
break;}
case 809:
-#line 4356 "parse.y"
+#line 4360 "parse.y"
{ yyval.ttype = ansi_opname[TRUNC_DIV_EXPR]; ;
break;}
case 810:
-#line 4358 "parse.y"
+#line 4362 "parse.y"
{ yyval.ttype = ansi_opname[TRUNC_MOD_EXPR]; ;
break;}
case 811:
-#line 4360 "parse.y"
+#line 4364 "parse.y"
{ yyval.ttype = ansi_opname[PLUS_EXPR]; ;
break;}
case 812:
-#line 4362 "parse.y"
+#line 4366 "parse.y"
{ yyval.ttype = ansi_opname[MINUS_EXPR]; ;
break;}
case 813:
-#line 4364 "parse.y"
+#line 4368 "parse.y"
{ yyval.ttype = ansi_opname[BIT_AND_EXPR]; ;
break;}
case 814:
-#line 4366 "parse.y"
+#line 4370 "parse.y"
{ yyval.ttype = ansi_opname[BIT_IOR_EXPR]; ;
break;}
case 815:
-#line 4368 "parse.y"
+#line 4372 "parse.y"
{ yyval.ttype = ansi_opname[BIT_XOR_EXPR]; ;
break;}
case 816:
-#line 4370 "parse.y"
+#line 4374 "parse.y"
{ yyval.ttype = ansi_opname[BIT_NOT_EXPR]; ;
break;}
case 817:
-#line 4372 "parse.y"
+#line 4376 "parse.y"
{ yyval.ttype = ansi_opname[COMPOUND_EXPR]; ;
break;}
case 818:
-#line 4374 "parse.y"
+#line 4378 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 819:
-#line 4376 "parse.y"
+#line 4380 "parse.y"
{ yyval.ttype = ansi_opname[LT_EXPR]; ;
break;}
case 820:
-#line 4378 "parse.y"
+#line 4382 "parse.y"
{ yyval.ttype = ansi_opname[GT_EXPR]; ;
break;}
case 821:
-#line 4380 "parse.y"
+#line 4384 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 822:
-#line 4382 "parse.y"
+#line 4386 "parse.y"
{ yyval.ttype = ansi_assopname[yyvsp[0].code]; ;
break;}
case 823:
-#line 4384 "parse.y"
+#line 4388 "parse.y"
{ yyval.ttype = ansi_opname [MODIFY_EXPR]; ;
break;}
case 824:
-#line 4386 "parse.y"
+#line 4390 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 825:
-#line 4388 "parse.y"
+#line 4392 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 826:
-#line 4390 "parse.y"
+#line 4394 "parse.y"
{ yyval.ttype = ansi_opname[POSTINCREMENT_EXPR]; ;
break;}
case 827:
-#line 4392 "parse.y"
+#line 4396 "parse.y"
{ yyval.ttype = ansi_opname[PREDECREMENT_EXPR]; ;
break;}
case 828:
-#line 4394 "parse.y"
+#line 4398 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_ANDIF_EXPR]; ;
break;}
case 829:
-#line 4396 "parse.y"
+#line 4400 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_ORIF_EXPR]; ;
break;}
case 830:
-#line 4398 "parse.y"
+#line 4402 "parse.y"
{ yyval.ttype = ansi_opname[TRUTH_NOT_EXPR]; ;
break;}
case 831:
-#line 4400 "parse.y"
+#line 4404 "parse.y"
{ yyval.ttype = ansi_opname[COND_EXPR]; ;
break;}
case 832:
-#line 4402 "parse.y"
+#line 4406 "parse.y"
{ yyval.ttype = ansi_opname[yyvsp[0].code]; ;
break;}
case 833:
-#line 4404 "parse.y"
+#line 4408 "parse.y"
{ yyval.ttype = ansi_opname[COMPONENT_REF]; ;
break;}
case 834:
-#line 4406 "parse.y"
+#line 4410 "parse.y"
{ yyval.ttype = ansi_opname[MEMBER_REF]; ;
break;}
case 835:
-#line 4408 "parse.y"
+#line 4412 "parse.y"
{ yyval.ttype = ansi_opname[CALL_EXPR]; ;
break;}
case 836:
-#line 4410 "parse.y"
+#line 4414 "parse.y"
{ yyval.ttype = ansi_opname[ARRAY_REF]; ;
break;}
case 837:
-#line 4412 "parse.y"
+#line 4416 "parse.y"
{ yyval.ttype = ansi_opname[NEW_EXPR]; ;
break;}
case 838:
-#line 4414 "parse.y"
+#line 4418 "parse.y"
{ yyval.ttype = ansi_opname[DELETE_EXPR]; ;
break;}
case 839:
-#line 4416 "parse.y"
+#line 4420 "parse.y"
{ yyval.ttype = ansi_opname[VEC_NEW_EXPR]; ;
break;}
case 840:
-#line 4418 "parse.y"
+#line 4422 "parse.y"
{ yyval.ttype = ansi_opname[VEC_DELETE_EXPR]; ;
break;}
case 841:
-#line 4421 "parse.y"
+#line 4425 "parse.y"
{ yyval.ttype = grokoptypename (yyvsp[-1].ftype.t, yyvsp[0].ttype); ;
break;}
case 842:
-#line 4423 "parse.y"
+#line 4427 "parse.y"
{ yyval.ttype = ansi_opname[ERROR_MARK]; ;
break;}
}
yystate = yyn;
goto yynewstate;
}
-#line 4426 "parse.y"
+#line 4430 "parse.y"
#ifdef SPEW_DEBUG
TYPENAME SCOPE
{
if (TREE_CODE ($1) != IDENTIFIER_NODE)
- $$ = lastiddecl;
- got_scope = $$ = complete_type (TREE_TYPE ($$));
+ $1 = lastiddecl;
+
+ got_scope = $$ = complete_type (TREE_TYPE ($1));
+
+ if ($$ == error_mark_node)
+ cp_error ("`%T' is not a class or namespace", $1);
}
| SELFNAME SCOPE
{
SET_DECL_EXPLICIT_INSTANTIATION (decl);
return decl;
}
+ else if (DECL_STATIC_FUNCTION_P (tmpl)
+ && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
+ revert_static_member_fn (&decl, 0, 0);
/* Mangle the function name appropriately. Note that we do
not mangle specializations of non-template member
continue;
}
- /* In case we are checking arguments inside a template template
- parameter, ARG that does not come from default argument is
- also a TREE_LIST node */
- if (TREE_CODE (arg) == TREE_LIST && ! is_overloaded_fn (arg))
+ if (TREE_CODE (arg) == TREE_LIST
+ && TREE_TYPE (arg) != NULL_TREE
+ && TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE)
+ {
+ /* The template argument was the name of some
+ member function. That's usually
+ illegal, but static members are OK. In any
+ case, grab the underlying fields/functions
+ and issue an error later if required. */
+ arg = TREE_VALUE (arg);
+ TREE_TYPE (arg) = unknown_type_node;
+ }
+ else if (TREE_CODE (arg) == TREE_LIST && ! is_overloaded_fn (arg))
{
+ /* In case we are checking arguments inside a template template
+ parameter, ARG that does not come from default argument is
+ also a TREE_LIST node */
is_tmpl_parm = 1;
arg = TREE_VALUE (arg);
}
if (current_template_parms)
return;
+
+ if (TYPE_BEING_DEFINED (type))
+ /* We can't go looking for the base types and fields just yet. */
+ return;
/* We can't do the TYPE_DECL_SUPPRESS_DEBUG thing with DWARF, which
does not support name references between translation units. Well, we
complete_type (type)
tree type;
{
+ if (type == NULL_TREE)
+ /* Rather than crash, we return something sure to cause an error
+ at some point. */
+ return error_mark_node;
+
if (type == error_mark_node || TYPE_SIZE (type) != NULL_TREE)
;
else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))