mirror of git://gcc.gnu.org/git/gcc.git
class.c (finish_struct): Remove unused variable.
* class.c (finish_struct): Remove unused variable. (pushclass): Likewise. (invalidate_class_lookup_cache): Likewise. * cp-tree.def (TYPENAME_TYPE): Improve documentation. * decl.c (build_typename_type): Make sure TYPENAME_TYPE_FULLNAME doesn't get obliterated. (make_typename_type): Handle template classes correctly. From-SVN: r26507
This commit is contained in:
parent
4d1bb6125f
commit
78638e240e
|
|
@ -1,5 +1,13 @@
|
||||||
1999-04-16 Mark Mitchell <mark@codesourcery.com>
|
1999-04-16 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* class.c (finish_struct): Remove unused variable.
|
||||||
|
(pushclass): Likewise.
|
||||||
|
(invalidate_class_lookup_cache): Likewise.
|
||||||
|
* cp-tree.def (TYPENAME_TYPE): Improve documentation.
|
||||||
|
* decl.c (build_typename_type): Make sure TYPENAME_TYPE_FULLNAME
|
||||||
|
doesn't get obliterated.
|
||||||
|
(make_typename_type): Handle template classes correctly.
|
||||||
|
|
||||||
* cp-tree.h (TREE_NONLOCAL_FLAG): Remove.
|
* cp-tree.h (TREE_NONLOCAL_FLAG): Remove.
|
||||||
(storetags): Declare.
|
(storetags): Declare.
|
||||||
* class.c (finish_struct): Don't use TREE_NONLOCAL_FLAG.
|
* class.c (finish_struct): Don't use TREE_NONLOCAL_FLAG.
|
||||||
|
|
|
||||||
|
|
@ -4160,7 +4160,6 @@ finish_struct (t, attributes, warn_anon)
|
||||||
int warn_anon;
|
int warn_anon;
|
||||||
{
|
{
|
||||||
tree name = TYPE_NAME (t);
|
tree name = TYPE_NAME (t);
|
||||||
tree x;
|
|
||||||
|
|
||||||
if (TREE_CODE (name) == TYPE_DECL)
|
if (TREE_CODE (name) == TYPE_DECL)
|
||||||
{
|
{
|
||||||
|
|
@ -4481,8 +4480,6 @@ pushclass (type, modify)
|
||||||
|
|
||||||
if (modify)
|
if (modify)
|
||||||
{
|
{
|
||||||
tree tags;
|
|
||||||
|
|
||||||
if (type != previous_class_type || current_class_depth > 1)
|
if (type != previous_class_type || current_class_depth > 1)
|
||||||
push_class_decls (type);
|
push_class_decls (type);
|
||||||
else
|
else
|
||||||
|
|
@ -4519,7 +4516,6 @@ pushclass (type, modify)
|
||||||
void
|
void
|
||||||
invalidate_class_lookup_cache ()
|
invalidate_class_lookup_cache ()
|
||||||
{
|
{
|
||||||
tree tags = CLASSTYPE_TAGS (previous_class_type);
|
|
||||||
tree t;
|
tree t;
|
||||||
|
|
||||||
/* This code can be seen as a cache miss. When we've cached a
|
/* This code can be seen as a cache miss. When we've cached a
|
||||||
|
|
|
||||||
|
|
@ -144,9 +144,11 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
|
||||||
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
|
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
|
||||||
|
|
||||||
/* A type designated by `typename T::t'. TYPE_CONTEXT is `T',
|
/* A type designated by `typename T::t'. TYPE_CONTEXT is `T',
|
||||||
TYPE_NAME is a TYPE_DECL for `t'. If TREE_TYPE is present, this
|
TYPE_NAME is an IDENTIFIER_NODE for `t'. If the type was named via
|
||||||
type was generated by the implicit typename extension, and the
|
template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR.
|
||||||
TREE_TYPE is a _TYPE from a baseclass of `T'. */
|
If TREE_TYPE is present, this type was generated by the implicit
|
||||||
|
typename extension, and the TREE_TYPE is a _TYPE from a baseclass
|
||||||
|
of `T'. */
|
||||||
DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
|
DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
|
||||||
|
|
||||||
/* A type designated by `__typeof (expr)'. TYPE_FIELDS is the
|
/* A type designated by `__typeof (expr)'. TYPE_FIELDS is the
|
||||||
|
|
|
||||||
|
|
@ -5302,6 +5302,11 @@ build_typename_type (context, name, fullname, base_type)
|
||||||
&typename_compare))
|
&typename_compare))
|
||||||
fatal ("virtual memory exhausted");
|
fatal ("virtual memory exhausted");
|
||||||
|
|
||||||
|
/* The FULLNAME needs to exist for the life of the hash table, i.e.,
|
||||||
|
for the entire compilation. */
|
||||||
|
if (!TREE_PERMANENT (fullname))
|
||||||
|
fullname = copy_to_permanent (fullname);
|
||||||
|
|
||||||
/* Build the TYPENAME_TYPE. */
|
/* Build the TYPENAME_TYPE. */
|
||||||
t = make_lang_type (TYPENAME_TYPE);
|
t = make_lang_type (TYPENAME_TYPE);
|
||||||
TYPE_CONTEXT (t) = FROB_CONTEXT (context);
|
TYPE_CONTEXT (t) = FROB_CONTEXT (context);
|
||||||
|
|
@ -5341,7 +5346,17 @@ make_typename_type (context, name)
|
||||||
tree fullname;
|
tree fullname;
|
||||||
|
|
||||||
if (TREE_CODE_CLASS (TREE_CODE (name)) == 't')
|
if (TREE_CODE_CLASS (TREE_CODE (name)) == 't')
|
||||||
name = TYPE_IDENTIFIER (name);
|
{
|
||||||
|
if (!(TYPE_LANG_SPECIFIC (name)
|
||||||
|
&& (CLASSTYPE_IS_TEMPLATE (name)
|
||||||
|
|| CLASSTYPE_USE_TEMPLATE (name))))
|
||||||
|
name = TYPE_IDENTIFIER (name);
|
||||||
|
else
|
||||||
|
/* Create a TEMPLATE_ID_EXPR for the type. */
|
||||||
|
name = build_nt (TEMPLATE_ID_EXPR,
|
||||||
|
CLASSTYPE_TI_TEMPLATE (name),
|
||||||
|
CLASSTYPE_TI_ARGS (name));
|
||||||
|
}
|
||||||
else if (TREE_CODE (name) == TYPE_DECL)
|
else if (TREE_CODE (name) == TYPE_DECL)
|
||||||
name = DECL_NAME (name);
|
name = DECL_NAME (name);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Build don't link:
|
||||||
|
// Origin: Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct S {
|
||||||
|
template <class U>
|
||||||
|
struct I {
|
||||||
|
typedef U X;
|
||||||
|
|
||||||
|
X f();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
template <class U>
|
||||||
|
typename S<T>::I<U>::X S<T>::I<U>::f() {}
|
||||||
Loading…
Reference in New Issue