cp-tree.h (struct lang_type): Add anon_union field.
* cp-tree.h (struct lang_type): Add anon_union field. (ANON_UNION_TYPE_P): Use it instead of examining type. (SET_ANON_UNION_TYPE_P): New macro. * decl.c (check_tag_decl): Use it. * search.c (compute_access): Handle non-type contexts earlier, and handle NULL_TREE. * tree.c (build_exception_variant): Use copy_to_permanent. From-SVN: r25618
This commit is contained in:
parent
4b523fc495
commit
0dd3962da5
|
@ -1,5 +1,15 @@
|
|||
1999-03-06 Jason Merrill <jason@yorick.cygnus.com>
|
||||
|
||||
* cp-tree.h (struct lang_type): Add anon_union field.
|
||||
(ANON_UNION_TYPE_P): Use it instead of examining type.
|
||||
(SET_ANON_UNION_TYPE_P): New macro.
|
||||
* decl.c (check_tag_decl): Use it.
|
||||
|
||||
* search.c (compute_access): Handle non-type contexts earlier, and
|
||||
handle NULL_TREE.
|
||||
|
||||
* tree.c (build_exception_variant): Use copy_to_permanent.
|
||||
|
||||
* decl2.c (setup_initp): Give statics with no priority the default
|
||||
priority here.
|
||||
(do_dtors, do_ctors, finish_file): Remove special handling of
|
||||
|
|
|
@ -725,11 +725,12 @@ struct lang_type
|
|||
unsigned non_aggregate : 1;
|
||||
unsigned is_partial_instantiation : 1;
|
||||
unsigned has_mutable : 1;
|
||||
unsigned anon_union : 1;
|
||||
|
||||
/* The MIPS compiler gets it wrong if this struct also
|
||||
does not fill out to a multiple of 4 bytes. Add a
|
||||
member `dummy' with new bits if you go over the edge. */
|
||||
unsigned dummy : 10;
|
||||
unsigned dummy : 9;
|
||||
} type_flags;
|
||||
|
||||
int n_ancestors;
|
||||
|
@ -1708,13 +1709,14 @@ extern int flag_new_for_scope;
|
|||
|
||||
#define ANON_UNION_P(NODE) (DECL_NAME (NODE) == 0)
|
||||
|
||||
/* Nonzero if TYPE is an anonymous union type. We're careful
|
||||
accessing TYPE_IDENTIFIER because some built-in types, like
|
||||
pointer-to-member types, do not have TYPE_NAME. */
|
||||
#define ANON_UNION_TYPE_P(TYPE) \
|
||||
(TREE_CODE (TYPE) == UNION_TYPE \
|
||||
&& TYPE_NAME (TYPE) \
|
||||
&& ANON_AGGRNAME_P (TYPE_IDENTIFIER (TYPE)))
|
||||
/* Nonzero if TYPE is an anonymous union type. We have to use a flag for
|
||||
this because "A union for which objects or pointers are declared is not
|
||||
an anonymous union" [class.union]. */
|
||||
#define ANON_UNION_TYPE_P(NODE) \
|
||||
(TYPE_LANG_SPECIFIC (NODE) \
|
||||
&& TYPE_LANG_SPECIFIC (NODE)->type_flags.anon_union)
|
||||
#define SET_ANON_UNION_TYPE_P(NODE) \
|
||||
(TYPE_LANG_SPECIFIC (NODE)->type_flags.anon_union = 1)
|
||||
|
||||
#define UNKNOWN_TYPE LANG_TYPE
|
||||
|
||||
|
|
|
@ -6740,8 +6740,18 @@ check_tag_decl (declspecs)
|
|||
Until we have a good way of detecting the latter, don't warn. */
|
||||
if (t == NULL_TREE && ! current_class_type)
|
||||
pedwarn ("declaration does not declare anything");
|
||||
else if (t && ANON_UNION_TYPE_P (t))
|
||||
/* Anonymous unions are objects, so they can have specifiers. */;
|
||||
|
||||
/* Check for an anonymous union. We're careful
|
||||
accessing TYPE_IDENTIFIER because some built-in types, like
|
||||
pointer-to-member types, do not have TYPE_NAME. */
|
||||
else if (t && TREE_CODE (t) == UNION_TYPE
|
||||
&& TYPE_NAME (t)
|
||||
&& ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
|
||||
{
|
||||
/* Anonymous unions are objects, so they can have specifiers. */;
|
||||
SET_ANON_UNION_TYPE_P (t);
|
||||
}
|
||||
|
||||
else if (ob_modifier)
|
||||
{
|
||||
if (ob_modifier == ridpointers[(int) RID_INLINE]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Breadth-first and depth-first routines for
|
||||
searching multiple-inheritance lattice for GNU C++.
|
||||
Copyright (C) 1987, 89, 92-97, 1998 Free Software Foundation, Inc.
|
||||
Copyright (C) 1987, 89, 92-97, 1998, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Michael Tiemann (tiemann@cygnus.com)
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
@ -667,6 +667,11 @@ compute_access (basetype_path, field)
|
|||
&& TREE_CODE (field) == FIELD_DECL)
|
||||
context = TYPE_CONTEXT (context);
|
||||
|
||||
/* If we aren't a real class member (e.g. we're from a namespace-scope
|
||||
anonymous union), there's no access control. */
|
||||
if (context == NULL_TREE || ! TYPE_P (context))
|
||||
PUBLIC_RETURN;
|
||||
|
||||
/* Virtual function tables are never private. But we should know that
|
||||
we are looking for this, and not even try to hide it. */
|
||||
if (DECL_NAME (field) && VFIELD_NAME_P (DECL_NAME (field)) == 1)
|
||||
|
@ -677,7 +682,7 @@ compute_access (basetype_path, field)
|
|||
{
|
||||
/* Are we (or an enclosing scope) friends with the class that has
|
||||
FIELD? */
|
||||
if (TYPE_P (context) && is_friend (context, previous_scope))
|
||||
if (is_friend (context, previous_scope))
|
||||
PUBLIC_RETURN;
|
||||
|
||||
/* If it's private, it's private, you letch. */
|
||||
|
@ -693,7 +698,6 @@ compute_access (basetype_path, field)
|
|||
{
|
||||
if (current_class_type
|
||||
&& (static_mem || DECL_CONSTRUCTOR_P (field))
|
||||
&& TYPE_P (context)
|
||||
&& ACCESSIBLY_DERIVED_FROM_P (context, current_class_type))
|
||||
PUBLIC_RETURN;
|
||||
else
|
||||
|
@ -755,7 +759,7 @@ compute_access (basetype_path, field)
|
|||
|
||||
if (access == access_default_node)
|
||||
{
|
||||
if (TYPE_P (context) && is_friend (context, previous_scope))
|
||||
if (is_friend (context, previous_scope))
|
||||
access = access_public_node;
|
||||
else if (TREE_PRIVATE (field))
|
||||
access = access_private_node;
|
||||
|
|
|
@ -1517,12 +1517,7 @@ build_exception_variant (type, raises)
|
|||
v = build_type_copy (type);
|
||||
|
||||
if (raises && ! TREE_PERMANENT (raises))
|
||||
{
|
||||
push_obstacks_nochange ();
|
||||
end_temporary_allocation ();
|
||||
raises = copy_list (raises);
|
||||
pop_obstacks ();
|
||||
}
|
||||
raises = copy_to_permanent (raises);
|
||||
|
||||
TYPE_RAISES_EXCEPTIONS (v) = raises;
|
||||
return v;
|
||||
|
|
Loading…
Reference in New Issue