Commit 405a745b by Jason Merrill Committed by Jason Merrill

parse.y (member_init): Also imply typename here.

	* parse.y (member_init): Also imply typename here.  Remove ancient
	extension for initializing base members.

From-SVN: r15720
parent 1e60a96e
Fri Sep 26 00:22:56 1997 Jason Merrill <jason@yorick.cygnus.com>
* parse.y (member_init): Also imply typename here. Remove ancient
extension for initializing base members.
Thu Sep 25 11:11:13 1997 Jason Merrill <jason@yorick.cygnus.com> Thu Sep 25 11:11:13 1997 Jason Merrill <jason@yorick.cygnus.com>
Handle multi-level typenames and implicit typename in base list. Handle multi-level typenames and implicit typename in base list.
......
...@@ -16,38 +16,32 @@ ...@@ -16,38 +16,32 @@
+ Inlining of template functions works without any extra effort or + Inlining of template functions works without any extra effort or
modifications. modifications.
+ Instantiations of class templates and methods defined in the class + Instantiations of class templates and methods defined in the class
body are deferred until they are actually needed (unless body are deferred until they are actually needed (unless
-fexternal-templates is specified). -fexternal-templates is specified).
+ Nested types in class templates work. + Nested types in class templates work.
+ Static data member templates work. + Static data member templates work.
+ Member function templates are now supported. + Member function templates are now supported.
+ Partial specialization of class templates is now supported. + Partial specialization of class templates is now supported.
+ The new 'template <>' specialization syntax is now accepted and + The new 'template <>' specialization syntax is now accepted and
ignored. ignored.
+ Explicit instantiation of template constructors and destructors is + Explicit instantiation of template constructors and destructors is
now supported. Use the following source code, as an example. now supported. For instance:
template A<int>::A(const A&); template A<int>::A(const A&);
Possible problems (caused by complying with the ANSI/ISO draft): 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 + Types and class templates used in templates must be declared
first, or the compiler will assume they are not types, and fail. first, or the compiler will assume they are not types, and fail.
+ Similarly, nested types of template type parameters must be tagged + Similarly, nested types of template type parameters must be tagged
with the 'typename' keyword. In many cases, the compiler will tell with the 'typename' keyword, except in base lists. In many cases,
you where you need to add 'typename'. but not all, the compiler will tell you where you need to add
'typename'. For more information, see
+ Syntax errors in templates that are never instantiated will now be http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res
diagnosed.
Other features: Other features:
...@@ -55,32 +49,40 @@ ...@@ -55,32 +49,40 @@
checked for semantic validity) unless they are needed. Default checked for semantic validity) unless they are needed. Default
arguments in class bodies will not be parsed until the class arguments in class bodies will not be parsed until the class
definition is complete. definition is complete.
+ The -ftemplate-depth-NN flag can be used to increase the maximum + The -ftemplate-depth-NN flag can be used to increase the maximum
recursive template instantiation depth, defaulting to 17. If you need recursive template instantiation depth, which defaults to 17. If you
to use this flag, the compiler will tell you. need to use this flag, the compiler will tell you.
Still not supported: Still not supported:
+ Member class templates.
+ Template template parameters. + Template template parameters.
+ Template friends.
+ Explicit qualification of function templates.
* Exception handling support has been significantly improved and is on by * Exception handling support has been significantly improved and is on by
default. This can result in significant runtime overhead. You can turn default. This can result in significant runtime overhead. You can turn
it off with -fno-exceptions. it off with -fno-exceptions.
* Synthesized methods are now emitted in any translation units that need * RTTI support has been rewritten to work properly and is now on by default.
an out-of-line copy. They are no longer affected by #pragma interface This means code that uses virtual functions will have a modest space
or #pragma implementation. overhead. You can use the -fno-rtti flag to disable RTTI support.
* On ELF systems, duplicate copies of symbols with 'initialized common' * On ELF systems, duplicate copies of symbols with 'initialized common'
linkage (such as template instantiations, vtables, and extern inlines) 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. 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. This support requires GNU ld from binutils 2.8 or later.
* __FUNCTION__ and __PRETTY_FUNCTION__ are now treated as variables by the * The overload resolution code has been rewritten to conform to the latest
parser; previously they were treated as string constants. So code like C++ Working Paper. Built-in operators are now considered as candidates
`printf (__FUNCTION__ ": foo")' must be rewritten to in operator overload resolution. Function template overloading chooses
`printf ("%s: foo", __FUNCTION__)'. This is necessary for templates. 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 flags:
...@@ -103,25 +105,21 @@ ...@@ -103,25 +105,21 @@
+ The new flag, -fno-weak, disables the use of weak symbols. + 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 * local static variables in extern inline functions will be shared between
translation units. translation units.
* Standard usage syntax for the std namespace is supported; std is treated
as an alias for global scope. General namespaces are still not supported.
* -fvtable-thunks is supported for all targets, and is the default for * -fvtable-thunks is supported for all targets, and is the default for
Linux with glibc 2.x (also called libc 6.x). Linux with glibc 2.x (also called libc 6.x).
* 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.
* The internal interface between RTTI-using code and the RTTI support
library has changed, so code that uses dynamic_cast should be
recompiled. The RTTI support library has moved from libstdc++ to
libgcc, so you no longer need to link against libstdc++ for a program
that doesn't use the "hosted" library.
* bool is now always the same size as another built-in type. Previously, * 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 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 64-bit bool. This should only affect Irix 6, which was not supported in
...@@ -129,14 +127,6 @@ ...@@ -129,14 +127,6 @@
* new (nothrow) is now supported. * new (nothrow) is now supported.
* 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.
* Synthesized destructors are no longer made virtual just because the class * Synthesized destructors are no longer made virtual just because the class
already has virtual functions, only if they override a virtual destructor already has virtual functions, only if they override a virtual destructor
in a base class. The compiler will warn if this affects your code. in a base class. The compiler will warn if this affects your code.
...@@ -159,7 +149,7 @@ ...@@ -159,7 +149,7 @@
function's argument list. function's argument list.
* Definition of nested types outside of their containing class is now * Definition of nested types outside of their containing class is now
supported. Use the following source code, as an example. supported. For instance:
struct A { struct A {
struct B; struct B;
......
...@@ -794,19 +794,16 @@ member_init: ...@@ -794,19 +794,16 @@ member_init:
{ expand_member_init (current_class_ref, $1, $3); } { expand_member_init (current_class_ref, $1, $3); }
| notype_identifier LEFT_RIGHT | notype_identifier LEFT_RIGHT
{ expand_member_init (current_class_ref, $1, void_type_node); } { expand_member_init (current_class_ref, $1, void_type_node); }
| complete_type_name '(' nonnull_exprlist ')' | nonnested_type '(' nonnull_exprlist ')'
{ expand_member_init (current_class_ref, $1, $3); } { expand_member_init (current_class_ref, $1, $3); }
| complete_type_name LEFT_RIGHT | nonnested_type LEFT_RIGHT
{ expand_member_init (current_class_ref, $1, void_type_node); } { expand_member_init (current_class_ref, $1, void_type_node); }
/* GNU extension */ | typename_sub '(' nonnull_exprlist ')'
| notype_qualified_id '(' nonnull_exprlist ')' { expand_member_init (current_class_ref, TYPE_MAIN_DECL ($1),
{ $3); }
do_member_init (OP0 ($1), OP1 ($1), $3); | typename_sub LEFT_RIGHT
} { expand_member_init (current_class_ref, TYPE_MAIN_DECL ($1),
| notype_qualified_id LEFT_RIGHT void_type_node); }
{
do_member_init (OP0 ($1), OP1 ($1), void_type_node);
}
; ;
identifier: identifier:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment