* 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
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
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;
#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
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]
/* 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.
&& 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)
{
/* 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. */
{
if (current_class_type
&& (static_mem || DECL_CONSTRUCTOR_P (field))
- && TYPE_P (context)
&& ACCESSIBLY_DERIVED_FROM_P (context, current_class_type))
PUBLIC_RETURN;
else
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;
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;