Commit 68642fb6 by Ulrich Drepper

(flag_isoc9x): New variable to be able to use code in c-common.c.

For now always zero.

From-SVN: r31185
parent 4b3b5328
...@@ -191,7 +191,7 @@ static void indent PROTO((void)); ...@@ -191,7 +191,7 @@ static void indent PROTO((void));
tree error_mark_list; tree error_mark_list;
/* The following symbols are subsumed in the cp_global_trees array, and /* The following symbols are subsumed in the cp_global_trees array, and
listed here individually for documentation purposes. listed here individually for documentation purposes.
C++ extensions C++ extensions
tree wchar_decl_node; tree wchar_decl_node;
...@@ -322,6 +322,10 @@ tree current_function_decl; ...@@ -322,6 +322,10 @@ tree current_function_decl;
tree current_function_return_value; tree current_function_return_value;
/* Nonzero means use the ISO C9x dialect of C. */
int flag_isoc9x;
/* Nonzero means give `double' the same size as `float'. */ /* Nonzero means give `double' the same size as `float'. */
extern int flag_short_double; extern int flag_short_double;
...@@ -490,7 +494,7 @@ struct binding_level ...@@ -490,7 +494,7 @@ struct binding_level
}; };
#define NULL_BINDING_LEVEL ((struct binding_level *) NULL) #define NULL_BINDING_LEVEL ((struct binding_level *) NULL)
/* The binding level currently in effect. */ /* The binding level currently in effect. */
#define current_binding_level \ #define current_binding_level \
...@@ -1022,13 +1026,13 @@ push_class_binding (id, decl) ...@@ -1022,13 +1026,13 @@ push_class_binding (id, decl)
/* Remove the binding for DECL which should be the innermost binding /* Remove the binding for DECL which should be the innermost binding
for ID. */ for ID. */
static void static void
pop_binding (id, decl) pop_binding (id, decl)
tree id; tree id;
tree decl; tree decl;
{ {
tree binding; tree binding;
if (id == NULL_TREE) if (id == NULL_TREE)
/* It's easiest to write the loops that call this function without /* It's easiest to write the loops that call this function without
checking whether or not the entities involved have names. We checking whether or not the entities involved have names. We
...@@ -1081,7 +1085,7 @@ pop_label (link) ...@@ -1081,7 +1085,7 @@ pop_label (link)
} }
/* At the end of a function, all labels declared within the fucntion /* At the end of a function, all labels declared within the fucntion
go out of scope. BLOCK is the top-level block for the go out of scope. BLOCK is the top-level block for the
function. */ function. */
static void static void
...@@ -1248,7 +1252,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1248,7 +1252,7 @@ poplevel (keep, reverse, functionbody)
in a for-init statement were in scope after the for-statement in a for-init statement were in scope after the for-statement
ended. We only use the new rules in flag_new_for_scope is ended. We only use the new rules in flag_new_for_scope is
nonzero. */ nonzero. */
leaving_for_scope leaving_for_scope
= current_binding_level->is_for_scope && flag_new_for_scope == 1; = current_binding_level->is_for_scope && flag_new_for_scope == 1;
/* Remove declarations for all the DECLs in this level. */ /* Remove declarations for all the DECLs in this level. */
...@@ -1256,7 +1260,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1256,7 +1260,7 @@ poplevel (keep, reverse, functionbody)
{ {
if (leaving_for_scope && TREE_CODE (link) == VAR_DECL) if (leaving_for_scope && TREE_CODE (link) == VAR_DECL)
{ {
tree outer_binding tree outer_binding
= TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (link))); = TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (link)));
tree ns_binding; tree ns_binding;
...@@ -1265,21 +1269,21 @@ poplevel (keep, reverse, functionbody) ...@@ -1265,21 +1269,21 @@ poplevel (keep, reverse, functionbody)
else else
ns_binding = NULL_TREE; ns_binding = NULL_TREE;
if (outer_binding if (outer_binding
&& (BINDING_LEVEL (outer_binding) && (BINDING_LEVEL (outer_binding)
== current_binding_level->level_chain)) == current_binding_level->level_chain))
/* We have something like: /* We have something like:
int i; int i;
for (int i; ;); for (int i; ;);
and we are leaving the `for' scope. There's no reason to and we are leaving the `for' scope. There's no reason to
keep the binding of the inner `i' in this case. */ keep the binding of the inner `i' in this case. */
pop_binding (DECL_NAME (link), link); pop_binding (DECL_NAME (link), link);
else if ((outer_binding else if ((outer_binding
&& (TREE_CODE (BINDING_VALUE (outer_binding)) && (TREE_CODE (BINDING_VALUE (outer_binding))
== TYPE_DECL)) == TYPE_DECL))
|| (ns_binding || (ns_binding
&& TREE_CODE (ns_binding) == TYPE_DECL)) && TREE_CODE (ns_binding) == TYPE_DECL))
/* Here, we have something like: /* Here, we have something like:
...@@ -1297,11 +1301,11 @@ poplevel (keep, reverse, functionbody) ...@@ -1297,11 +1301,11 @@ poplevel (keep, reverse, functionbody)
/* Mark this VAR_DECL as dead so that we can tell we left it /* Mark this VAR_DECL as dead so that we can tell we left it
there only for backward compatibility. */ there only for backward compatibility. */
DECL_DEAD_FOR_LOCAL (link) = 1; DECL_DEAD_FOR_LOCAL (link) = 1;
/* Keep track of what should of have happenned when we /* Keep track of what should of have happenned when we
popped the binding. */ popped the binding. */
if (outer_binding && BINDING_VALUE (outer_binding)) if (outer_binding && BINDING_VALUE (outer_binding))
DECL_SHADOWED_FOR_VAR (link) DECL_SHADOWED_FOR_VAR (link)
= BINDING_VALUE (outer_binding); = BINDING_VALUE (outer_binding);
/* Add it to the list of dead variables in the next /* Add it to the list of dead variables in the next
...@@ -1318,7 +1322,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1318,7 +1322,7 @@ poplevel (keep, reverse, functionbody)
= 0; = 0;
} }
} }
else else
{ {
/* Remove the binding. */ /* Remove the binding. */
decl = link; decl = link;
...@@ -1328,7 +1332,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1328,7 +1332,7 @@ poplevel (keep, reverse, functionbody)
pop_binding (DECL_NAME (decl), decl); pop_binding (DECL_NAME (decl), decl);
else if (TREE_CODE (decl) == OVERLOAD) else if (TREE_CODE (decl) == OVERLOAD)
pop_binding (DECL_NAME (OVL_FUNCTION (decl)), decl); pop_binding (DECL_NAME (OVL_FUNCTION (decl)), decl);
else else
my_friendly_abort (0); my_friendly_abort (0);
} }
} }
...@@ -1346,7 +1350,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1346,7 +1350,7 @@ poplevel (keep, reverse, functionbody)
/* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */ /* Restore the IDENTIFIER_LABEL_VALUEs for local labels. */
for (link = current_binding_level->shadowed_labels; for (link = current_binding_level->shadowed_labels;
link; link;
link = TREE_CHAIN (link)) link = TREE_CHAIN (link))
pop_label (link); pop_label (link);
...@@ -1429,7 +1433,7 @@ poplevel (keep, reverse, functionbody) ...@@ -1429,7 +1433,7 @@ poplevel (keep, reverse, functionbody)
{ {
tree scope_stmts; tree scope_stmts;
scope_stmts scope_stmts
= add_scope_stmt (/*begin_p=*/0, /*partial_p=*/1); = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/1);
if (block) if (block)
{ {
...@@ -1529,7 +1533,7 @@ poplevel_class () ...@@ -1529,7 +1533,7 @@ poplevel_class ()
tree shadowed; tree shadowed;
my_friendly_assert (level != 0, 354); my_friendly_assert (level != 0, 354);
/* If we're leaving a toplevel class, don't bother to do the setting /* If we're leaving a toplevel class, don't bother to do the setting
of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot
shouldn't even be used when current_class_type isn't set, and second, shouldn't even be used when current_class_type isn't set, and second,
...@@ -1544,7 +1548,7 @@ poplevel_class () ...@@ -1544,7 +1548,7 @@ poplevel_class ()
shadowed; shadowed;
shadowed = TREE_CHAIN (shadowed)) shadowed = TREE_CHAIN (shadowed))
IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = NULL_TREE; IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = NULL_TREE;
/* Find the next enclosing class, and recreate /* Find the next enclosing class, and recreate
IDENTIFIER_CLASS_VALUEs appropriate for that class. */ IDENTIFIER_CLASS_VALUEs appropriate for that class. */
b = level->level_chain; b = level->level_chain;
...@@ -1552,8 +1556,8 @@ poplevel_class () ...@@ -1552,8 +1556,8 @@ poplevel_class ()
b = b->level_chain; b = b->level_chain;
if (b) if (b)
for (shadowed = b->class_shadowed; for (shadowed = b->class_shadowed;
shadowed; shadowed;
shadowed = TREE_CHAIN (shadowed)) shadowed = TREE_CHAIN (shadowed))
{ {
tree t; tree t;
...@@ -1561,9 +1565,9 @@ poplevel_class () ...@@ -1561,9 +1565,9 @@ poplevel_class ()
t = IDENTIFIER_BINDING (TREE_PURPOSE (shadowed)); t = IDENTIFIER_BINDING (TREE_PURPOSE (shadowed));
while (t && BINDING_LEVEL (t) != b) while (t && BINDING_LEVEL (t) != b)
t = TREE_CHAIN (t); t = TREE_CHAIN (t);
if (t) if (t)
IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed))
= BINDING_VALUE (t); = BINDING_VALUE (t);
} }
} }
...@@ -1580,8 +1584,8 @@ poplevel_class () ...@@ -1580,8 +1584,8 @@ poplevel_class ()
SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed), TREE_VALUE (shadowed)); SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed), TREE_VALUE (shadowed));
/* Remove the bindings for all of the class-level declarations. */ /* Remove the bindings for all of the class-level declarations. */
for (shadowed = level->class_shadowed; for (shadowed = level->class_shadowed;
shadowed; shadowed;
shadowed = TREE_CHAIN (shadowed)) shadowed = TREE_CHAIN (shadowed))
pop_binding (TREE_PURPOSE (shadowed), TREE_TYPE (shadowed)); pop_binding (TREE_PURPOSE (shadowed), TREE_TYPE (shadowed));
...@@ -1705,7 +1709,7 @@ struct walk_globals_data { ...@@ -1705,7 +1709,7 @@ struct walk_globals_data {
for which P returns non-zero, call F with its address. If any call for which P returns non-zero, call F with its address. If any call
to F returns a non-zero value, return a non-zero value. */ to F returns a non-zero value, return a non-zero value. */
static int static int
walk_globals_r (namespace, data) walk_globals_r (namespace, data)
tree namespace; tree namespace;
void *data; void *data;
...@@ -1776,10 +1780,10 @@ wrapup_globals_for_namespace (namespace, data) ...@@ -1776,10 +1780,10 @@ wrapup_globals_for_namespace (namespace, data)
/* Process the decls in reverse order--earliest first. /* Process the decls in reverse order--earliest first.
Put them into VEC from back to front, then take out from front. */ Put them into VEC from back to front, then take out from front. */
for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl)) for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
vec[len - i - 1] = decl; vec[len - i - 1] = decl;
if (last_time) if (last_time)
{ {
check_global_declarations (vec, len); check_global_declarations (vec, len);
...@@ -1865,7 +1869,7 @@ print_binding_level (lvl) ...@@ -1865,7 +1869,7 @@ print_binding_level (lvl)
/* We can probably fit 3 names to a line? */ /* We can probably fit 3 names to a line? */
for (t = lvl->names; t; t = TREE_CHAIN (t)) for (t = lvl->names; t; t = TREE_CHAIN (t))
{ {
if (no_print_functions && (TREE_CODE (t) == FUNCTION_DECL)) if (no_print_functions && (TREE_CODE (t) == FUNCTION_DECL))
continue; continue;
if (no_print_builtins if (no_print_builtins
&& (TREE_CODE (t) == TYPE_DECL) && (TREE_CODE (t) == TYPE_DECL)
...@@ -2004,7 +2008,7 @@ find_binding (name, scope) ...@@ -2004,7 +2008,7 @@ find_binding (name, scope)
tree iter, prev = NULL_TREE; tree iter, prev = NULL_TREE;
scope = ORIGINAL_NAMESPACE (scope); scope = ORIGINAL_NAMESPACE (scope);
for (iter = IDENTIFIER_NAMESPACE_BINDINGS (name); iter; for (iter = IDENTIFIER_NAMESPACE_BINDINGS (name); iter;
iter = TREE_CHAIN (iter)) iter = TREE_CHAIN (iter))
{ {
...@@ -2039,7 +2043,7 @@ binding_for_name (name, scope) ...@@ -2039,7 +2043,7 @@ binding_for_name (name, scope)
tree result; tree result;
scope = ORIGINAL_NAMESPACE (scope); scope = ORIGINAL_NAMESPACE (scope);
if (b && TREE_CODE (b) != CPLUS_BINDING) if (b && TREE_CODE (b) != CPLUS_BINDING)
{ {
/* Get rid of optimization for global scope. */ /* Get rid of optimization for global scope. */
...@@ -2093,7 +2097,7 @@ set_namespace_binding (name, scope, val) ...@@ -2093,7 +2097,7 @@ set_namespace_binding (name, scope, val)
if (scope == NULL_TREE) if (scope == NULL_TREE)
scope = global_namespace; scope = global_namespace;
if (scope == global_namespace) if (scope == global_namespace)
{ {
b = IDENTIFIER_NAMESPACE_BINDINGS (name); b = IDENTIFIER_NAMESPACE_BINDINGS (name);
...@@ -2158,7 +2162,7 @@ push_namespace (name) ...@@ -2158,7 +2162,7 @@ push_namespace (name)
} }
} }
} }
if (need_new) if (need_new)
{ {
/* Make a new namespace, binding the name to it. */ /* Make a new namespace, binding the name to it. */
...@@ -2216,7 +2220,7 @@ push_nested_namespace (ns) ...@@ -2216,7 +2220,7 @@ push_nested_namespace (ns)
/* Pop back from the scope of the namespace NS, which was previously /* Pop back from the scope of the namespace NS, which was previously
entered with push_nested_namespace. */ entered with push_nested_namespace. */
void void
pop_nested_namespace (ns) pop_nested_namespace (ns)
tree ns; tree ns;
...@@ -2293,7 +2297,7 @@ store_bindings (names, old_bindings) ...@@ -2293,7 +2297,7 @@ store_bindings (names, old_bindings)
else else
id = DECL_NAME (t); id = DECL_NAME (t);
if (!id if (!id
/* Note that we may have an IDENTIFIER_CLASS_VALUE even when /* Note that we may have an IDENTIFIER_CLASS_VALUE even when
we have no IDENTIFIER_BINDING if we have left the class we have no IDENTIFIER_BINDING if we have left the class
scope, but cached the class-level declarations. */ scope, but cached the class-level declarations. */
...@@ -2433,7 +2437,7 @@ pop_from_top_level () ...@@ -2433,7 +2437,7 @@ pop_from_top_level ()
} }
/* Push a definition of struct, union or enum tag "name". /* Push a definition of struct, union or enum tag "name".
into binding_level "b". "type" should be the type node, into binding_level "b". "type" should be the type node,
We assume that the tag "name" is not already defined. We assume that the tag "name" is not already defined.
Note that the definition may really be just a forward reference. Note that the definition may really be just a forward reference.
...@@ -2530,30 +2534,30 @@ pop_everything () ...@@ -2530,30 +2534,30 @@ pop_everything ()
Returns the TYPE_DECL for TYPE, which may have been altered by this Returns the TYPE_DECL for TYPE, which may have been altered by this
processing. */ processing. */
static tree static tree
maybe_process_template_type_declaration (type, globalize, b) maybe_process_template_type_declaration (type, globalize, b)
tree type; tree type;
int globalize; int globalize;
struct binding_level* b; struct binding_level* b;
{ {
tree decl = TYPE_NAME (type); tree decl = TYPE_NAME (type);
if (processing_template_parmlist) if (processing_template_parmlist)
/* You can't declare a new template type in a template parameter /* You can't declare a new template type in a template parameter
list. But, you can declare a non-template type: list. But, you can declare a non-template type:
template <class A*> struct S; template <class A*> struct S;
is a forward-declaration of `A'. */ is a forward-declaration of `A'. */
; ;
else else
{ {
maybe_check_template_type (type); maybe_check_template_type (type);
my_friendly_assert (IS_AGGR_TYPE (type) my_friendly_assert (IS_AGGR_TYPE (type)
|| TREE_CODE (type) == ENUMERAL_TYPE, 0); || TREE_CODE (type) == ENUMERAL_TYPE, 0);
if (processing_template_decl) if (processing_template_decl)
{ {
/* This may change after the call to /* This may change after the call to
...@@ -2576,7 +2580,7 @@ maybe_process_template_type_declaration (type, globalize, b) ...@@ -2576,7 +2580,7 @@ maybe_process_template_type_declaration (type, globalize, b)
/* Put this tag on the list of tags for the class, since /* Put this tag on the list of tags for the class, since
that won't happen below because B is not the class that won't happen below because B is not the class
binding level, but is instead the pseudo-global level. */ binding level, but is instead the pseudo-global level. */
b->level_chain->tags = b->level_chain->tags =
tree_cons (name, type, b->level_chain->tags); tree_cons (name, type, b->level_chain->tags);
if (TYPE_SIZE (current_class_type) == NULL_TREE) if (TYPE_SIZE (current_class_type) == NULL_TREE)
CLASSTYPE_TAGS (current_class_type) = b->level_chain->tags; CLASSTYPE_TAGS (current_class_type) = b->level_chain->tags;
...@@ -2644,7 +2648,7 @@ pushtag (name, type, globalize) ...@@ -2644,7 +2648,7 @@ pushtag (name, type, globalize)
if (! globalize) if (! globalize)
context = cs; context = cs;
else if (cs != NULL_TREE else if (cs != NULL_TREE
&& TREE_CODE_CLASS (TREE_CODE (cs)) == 't') && TREE_CODE_CLASS (TREE_CODE (cs)) == 't')
/* When declaring a friend class of a local class, we want /* When declaring a friend class of a local class, we want
to inject the newly named class into the scope to inject the newly named class into the scope
...@@ -2846,7 +2850,7 @@ decls_match (newdecl, olddecl) ...@@ -2846,7 +2850,7 @@ decls_match (newdecl, olddecl)
if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl), if (!comp_template_parms (DECL_TEMPLATE_PARMS (newdecl),
DECL_TEMPLATE_PARMS (olddecl))) DECL_TEMPLATE_PARMS (olddecl)))
return 0; return 0;
if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL) if (TREE_CODE (DECL_TEMPLATE_RESULT (newdecl)) == TYPE_DECL)
types_match = 1; types_match = 1;
else else
...@@ -2890,10 +2894,10 @@ warn_extern_redeclared_static (newdecl, olddecl) ...@@ -2890,10 +2894,10 @@ warn_extern_redeclared_static (newdecl, olddecl)
tree name; tree name;
if (TREE_CODE (newdecl) == TYPE_DECL if (TREE_CODE (newdecl) == TYPE_DECL
|| TREE_CODE (newdecl) == TEMPLATE_DECL) || TREE_CODE (newdecl) == TEMPLATE_DECL)
return; return;
/* Don't get confused by static member functions; that's a different /* Don't get confused by static member functions; that's a different
use of `static'. */ use of `static'. */
if (TREE_CODE (newdecl) == FUNCTION_DECL if (TREE_CODE (newdecl) == FUNCTION_DECL
...@@ -2945,7 +2949,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -2945,7 +2949,7 @@ duplicate_decls (newdecl, olddecl)
if (TREE_TYPE (newdecl) == error_mark_node if (TREE_TYPE (newdecl) == error_mark_node
|| TREE_TYPE (olddecl) == error_mark_node) || TREE_TYPE (olddecl) == error_mark_node)
types_match = 1; types_match = 1;
/* Check for redeclaration and other discrepancies. */ /* Check for redeclaration and other discrepancies. */
if (TREE_CODE (olddecl) == FUNCTION_DECL if (TREE_CODE (olddecl) == FUNCTION_DECL
&& DECL_ARTIFICIAL (olddecl)) && DECL_ARTIFICIAL (olddecl))
...@@ -3001,7 +3005,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -3001,7 +3005,7 @@ duplicate_decls (newdecl, olddecl)
/* Discard the old built-in function. */ /* Discard the old built-in function. */
return 0; return 0;
} }
if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl)) if (DECL_THIS_STATIC (newdecl) && !DECL_THIS_STATIC (olddecl))
{ {
/* If a builtin function is redeclared as `static', merge /* If a builtin function is redeclared as `static', merge
...@@ -3113,14 +3117,14 @@ duplicate_decls (newdecl, olddecl) ...@@ -3113,14 +3117,14 @@ duplicate_decls (newdecl, olddecl)
cp_error_at ("previous declaration as `%#D'", olddecl); cp_error_at ("previous declaration as `%#D'", olddecl);
} }
} }
else if (TREE_CODE (newdecl) == FUNCTION_DECL else if (TREE_CODE (newdecl) == FUNCTION_DECL
&& ((DECL_TEMPLATE_SPECIALIZATION (olddecl) && ((DECL_TEMPLATE_SPECIALIZATION (olddecl)
&& (!DECL_TEMPLATE_INFO (newdecl) && (!DECL_TEMPLATE_INFO (newdecl)
|| (DECL_TI_TEMPLATE (newdecl) || (DECL_TI_TEMPLATE (newdecl)
!= DECL_TI_TEMPLATE (olddecl)))) != DECL_TI_TEMPLATE (olddecl))))
|| (DECL_TEMPLATE_SPECIALIZATION (newdecl) || (DECL_TEMPLATE_SPECIALIZATION (newdecl)
&& (!DECL_TEMPLATE_INFO (olddecl) && (!DECL_TEMPLATE_INFO (olddecl)
|| (DECL_TI_TEMPLATE (olddecl) || (DECL_TI_TEMPLATE (olddecl)
!= DECL_TI_TEMPLATE (newdecl)))))) != DECL_TI_TEMPLATE (newdecl))))))
/* It's OK to have a template specialization and a non-template /* It's OK to have a template specialization and a non-template
with the same type, or to have specializations of two with the same type, or to have specializations of two
...@@ -3131,8 +3135,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -3131,8 +3135,8 @@ duplicate_decls (newdecl, olddecl)
specialize one of its methods. This situation is legal, but specialize one of its methods. This situation is legal, but
the declarations must be merged in the usual way. */ the declarations must be merged in the usual way. */
return 0; return 0;
else if (TREE_CODE (newdecl) == FUNCTION_DECL else if (TREE_CODE (newdecl) == FUNCTION_DECL
&& ((DECL_TEMPLATE_INSTANTIATION (olddecl) && ((DECL_TEMPLATE_INSTANTIATION (olddecl)
&& !DECL_USE_TEMPLATE (newdecl)) && !DECL_USE_TEMPLATE (newdecl))
|| (DECL_TEMPLATE_INSTANTIATION (newdecl) || (DECL_TEMPLATE_INSTANTIATION (newdecl)
&& !DECL_USE_TEMPLATE (olddecl)))) && !DECL_USE_TEMPLATE (olddecl))))
...@@ -3193,7 +3197,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -3193,7 +3197,7 @@ duplicate_decls (newdecl, olddecl)
if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE) if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE)
t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2); t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2);
for (; t1 && t1 != void_list_node; for (; t1 && t1 != void_list_node;
t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++) t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++)
if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2)) if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
...@@ -3255,7 +3259,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -3255,7 +3259,7 @@ duplicate_decls (newdecl, olddecl)
DECL_NEEDS_FINAL_OVERRIDER_P (newdecl) |= DECL_NEEDS_FINAL_OVERRIDER_P (olddecl); DECL_NEEDS_FINAL_OVERRIDER_P (newdecl) |= DECL_NEEDS_FINAL_OVERRIDER_P (olddecl);
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl); DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE; new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
/* Optionally warn about more than one declaration for the same /* Optionally warn about more than one declaration for the same
name, but don't warn about a function declaration followed by a name, but don't warn about a function declaration followed by a
definition. */ definition. */
...@@ -3288,7 +3292,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -3288,7 +3292,7 @@ duplicate_decls (newdecl, olddecl)
/* Copy all the DECL_... slots specified in the new decl /* Copy all the DECL_... slots specified in the new decl
except for any that we copy here from the old type. */ except for any that we copy here from the old type. */
DECL_MACHINE_ATTRIBUTES (newdecl) DECL_MACHINE_ATTRIBUTES (newdecl)
= merge_machine_decl_attributes (olddecl, newdecl); = merge_machine_decl_attributes (olddecl, newdecl);
if (TREE_CODE (newdecl) == TEMPLATE_DECL) if (TREE_CODE (newdecl) == TEMPLATE_DECL)
...@@ -3297,13 +3301,13 @@ duplicate_decls (newdecl, olddecl) ...@@ -3297,13 +3301,13 @@ duplicate_decls (newdecl, olddecl)
DECL_TEMPLATE_RESULT (olddecl))) DECL_TEMPLATE_RESULT (olddecl)))
cp_error ("invalid redeclaration of %D", newdecl); cp_error ("invalid redeclaration of %D", newdecl);
TREE_TYPE (olddecl) = TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl)); TREE_TYPE (olddecl) = TREE_TYPE (DECL_TEMPLATE_RESULT (olddecl));
DECL_TEMPLATE_SPECIALIZATIONS (olddecl) DECL_TEMPLATE_SPECIALIZATIONS (olddecl)
= chainon (DECL_TEMPLATE_SPECIALIZATIONS (olddecl), = chainon (DECL_TEMPLATE_SPECIALIZATIONS (olddecl),
DECL_TEMPLATE_SPECIALIZATIONS (newdecl)); DECL_TEMPLATE_SPECIALIZATIONS (newdecl));
return 1; return 1;
} }
if (types_match) if (types_match)
{ {
/* Automatically handles default parameters. */ /* Automatically handles default parameters. */
...@@ -3415,13 +3419,13 @@ duplicate_decls (newdecl, olddecl) ...@@ -3415,13 +3419,13 @@ duplicate_decls (newdecl, olddecl)
TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl); TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl);
if (! DECL_EXTERNAL (olddecl)) if (! DECL_EXTERNAL (olddecl))
DECL_EXTERNAL (newdecl) = 0; DECL_EXTERNAL (newdecl) = 0;
if (DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl)) if (DECL_LANG_SPECIFIC (newdecl) && DECL_LANG_SPECIFIC (olddecl))
{ {
DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl); DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl); DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl); DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl);
DECL_TEMPLATE_INSTANTIATED (newdecl) DECL_TEMPLATE_INSTANTIATED (newdecl)
|= DECL_TEMPLATE_INSTANTIATED (olddecl); |= DECL_TEMPLATE_INSTANTIATED (olddecl);
/* Don't really know how much of the language-specific /* Don't really know how much of the language-specific
values we should copy from old to new. */ values we should copy from old to new. */
...@@ -3441,8 +3445,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -3441,8 +3445,8 @@ duplicate_decls (newdecl, olddecl)
if (TREE_CODE (newdecl) == FUNCTION_DECL) if (TREE_CODE (newdecl) == FUNCTION_DECL)
{ {
if (DECL_TEMPLATE_INSTANTIATION (olddecl) if (DECL_TEMPLATE_INSTANTIATION (olddecl)
&& !DECL_TEMPLATE_INSTANTIATION (newdecl)) && !DECL_TEMPLATE_INSTANTIATION (newdecl))
{ {
/* If newdecl is not a specialization, then it is not a /* If newdecl is not a specialization, then it is not a
template-related function at all. And that means that we template-related function at all. And that means that we
...@@ -3450,16 +3454,16 @@ duplicate_decls (newdecl, olddecl) ...@@ -3450,16 +3454,16 @@ duplicate_decls (newdecl, olddecl)
my_friendly_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl), my_friendly_assert (DECL_TEMPLATE_SPECIALIZATION (newdecl),
0); 0);
if (TREE_USED (olddecl)) if (TREE_USED (olddecl))
/* From [temp.expl.spec]: /* From [temp.expl.spec]:
If a template, a member template or the member of a class If a template, a member template or the member of a class
template is explicitly specialized then that template is explicitly specialized then that
specialization shall be declared before the first use of specialization shall be declared before the first use of
that specialization that would cause an implicit that specialization that would cause an implicit
instantiation to take place, in every translation unit in instantiation to take place, in every translation unit in
which such a use occurs. */ which such a use occurs. */
cp_error ("explicit specialization of %D after first use", cp_error ("explicit specialization of %D after first use",
olddecl); olddecl);
SET_DECL_TEMPLATE_SPECIALIZATION (olddecl); SET_DECL_TEMPLATE_SPECIALIZATION (olddecl);
...@@ -3545,16 +3549,16 @@ duplicate_decls (newdecl, olddecl) ...@@ -3545,16 +3549,16 @@ duplicate_decls (newdecl, olddecl)
the following sequence of events has occurred: the following sequence of events has occurred:
o A friend function was declared in a class template. The o A friend function was declared in a class template. The
class template was instantiated. class template was instantiated.
o The instantiation of the friend declaration was o The instantiation of the friend declaration was
recorded on the instantiation list, and is newdecl. recorded on the instantiation list, and is newdecl.
o Later, however, instantiate_class_template called pushdecl o Later, however, instantiate_class_template called pushdecl
on the newdecl to perform name injection. But, pushdecl in on the newdecl to perform name injection. But, pushdecl in
turn called duplicate_decls when it discovered that another turn called duplicate_decls when it discovered that another
declaration of a global function with the same name already declaration of a global function with the same name already
existed. existed.
o Here, in duplicate_decls, we decided to clobber newdecl. o Here, in duplicate_decls, we decided to clobber newdecl.
...@@ -3563,8 +3567,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -3563,8 +3567,8 @@ duplicate_decls (newdecl, olddecl)
instantiations so that if we try to do the instantiation instantiations so that if we try to do the instantiation
again we won't get the clobbered declaration. */ again we won't get the clobbered declaration. */
tree tmpl = DECL_TI_TEMPLATE (newdecl); tree tmpl = DECL_TI_TEMPLATE (newdecl);
tree decls = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); tree decls = DECL_TEMPLATE_SPECIALIZATIONS (tmpl);
for (; decls; decls = TREE_CHAIN (decls)) for (; decls; decls = TREE_CHAIN (decls))
if (TREE_VALUE (decls) == newdecl) if (TREE_VALUE (decls) == newdecl)
...@@ -3638,7 +3642,7 @@ pushdecl (x) ...@@ -3638,7 +3642,7 @@ pushdecl (x)
/* If this is the declaration for a namespace-scope function, /* If this is the declaration for a namespace-scope function,
but the declaration itself is in a local scope, mark the but the declaration itself is in a local scope, mark the
declaration. */ declaration. */
if (TREE_CODE (x) == FUNCTION_DECL if (TREE_CODE (x) == FUNCTION_DECL
&& DECL_NAMESPACE_SCOPE_P (x) && DECL_NAMESPACE_SCOPE_P (x)
&& current_function_decl && current_function_decl
&& x != current_function_decl) && x != current_function_decl)
...@@ -3660,7 +3664,7 @@ pushdecl (x) ...@@ -3660,7 +3664,7 @@ pushdecl (x)
#endif #endif
if (TREE_CODE (name) == TEMPLATE_ID_EXPR) if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
name = TREE_OPERAND (name, 0); name = TREE_OPERAND (name, 0);
/* Namespace-scoped variables are not found in the current level. */ /* Namespace-scoped variables are not found in the current level. */
if (TREE_CODE (x) == VAR_DECL && DECL_NAMESPACE_SCOPE_P (x)) if (TREE_CODE (x) == VAR_DECL && DECL_NAMESPACE_SCOPE_P (x))
t = namespace_binding (name, DECL_CONTEXT (x)); t = namespace_binding (name, DECL_CONTEXT (x));
...@@ -3749,7 +3753,7 @@ pushdecl (x) ...@@ -3749,7 +3753,7 @@ pushdecl (x)
else if (DECL_MAIN_P (x)) else if (DECL_MAIN_P (x))
{ {
/* A redeclaration of main, but not a duplicate of the /* A redeclaration of main, but not a duplicate of the
previous one. previous one.
[basic.start.main] [basic.start.main]
...@@ -3807,7 +3811,7 @@ pushdecl (x) ...@@ -3807,7 +3811,7 @@ pushdecl (x)
/* We don't want to copy the type when all we're /* We don't want to copy the type when all we're
doing is making a TYPE_DECL for the purposes of doing is making a TYPE_DECL for the purposes of
inlining. */ inlining. */
&& (!TYPE_NAME (type) && (!TYPE_NAME (type)
|| TYPE_NAME (type) != DECL_ABSTRACT_ORIGIN (x))) || TYPE_NAME (type) != DECL_ABSTRACT_ORIGIN (x)))
{ {
DECL_ORIGINAL_TYPE (x) = type; DECL_ORIGINAL_TYPE (x) = type;
...@@ -3820,7 +3824,7 @@ pushdecl (x) ...@@ -3820,7 +3824,7 @@ pushdecl (x)
if (type != error_mark_node if (type != error_mark_node
&& TYPE_NAME (type) && TYPE_NAME (type)
&& TYPE_IDENTIFIER (type)) && TYPE_IDENTIFIER (type))
set_identifier_type_value_with_scope (DECL_NAME (x), type, set_identifier_type_value_with_scope (DECL_NAME (x), type,
current_binding_level); current_binding_level);
} }
...@@ -3829,7 +3833,7 @@ pushdecl (x) ...@@ -3829,7 +3833,7 @@ pushdecl (x)
We get warnings about inline functions where they are defined. We get warnings about inline functions where they are defined.
We get warnings about other functions from push_overloaded_decl. We get warnings about other functions from push_overloaded_decl.
Avoid duplicate warnings where they are used. */ Avoid duplicate warnings where they are used. */
if (TREE_PUBLIC (x) && TREE_CODE (x) != FUNCTION_DECL) if (TREE_PUBLIC (x) && TREE_CODE (x) != FUNCTION_DECL)
{ {
...@@ -3869,11 +3873,11 @@ pushdecl (x) ...@@ -3869,11 +3873,11 @@ pushdecl (x)
the mangled name (i.e., NAME) to the DECL. But, for the mangled name (i.e., NAME) to the DECL. But, for
an `extern "C"' function, the mangled name and the an `extern "C"' function, the mangled name and the
ordinary name are the same so we need not do this. */ ordinary name are the same so we need not do this. */
&& !(TREE_CODE (x) == FUNCTION_DECL && && !(TREE_CODE (x) == FUNCTION_DECL &&
DECL_LANGUAGE (x) == lang_c)) DECL_LANGUAGE (x) == lang_c))
{ {
if (TREE_CODE (x) == FUNCTION_DECL) if (TREE_CODE (x) == FUNCTION_DECL)
my_friendly_assert my_friendly_assert
((IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE) ((IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE)
|| (IDENTIFIER_GLOBAL_VALUE (name) == x), 378); || (IDENTIFIER_GLOBAL_VALUE (name) == x), 378);
SET_IDENTIFIER_NAMESPACE_VALUE (name, x); SET_IDENTIFIER_NAMESPACE_VALUE (name, x);
...@@ -3919,14 +3923,14 @@ pushdecl (x) ...@@ -3919,14 +3923,14 @@ pushdecl (x)
/* If this is a TYPE_DECL, push it into the type value slot. */ /* If this is a TYPE_DECL, push it into the type value slot. */
if (TREE_CODE (x) == TYPE_DECL) if (TREE_CODE (x) == TYPE_DECL)
set_identifier_type_value_with_scope (name, TREE_TYPE (x), set_identifier_type_value_with_scope (name, TREE_TYPE (x),
current_binding_level); current_binding_level);
/* Clear out any TYPE_DECL shadowed by a namespace so that /* Clear out any TYPE_DECL shadowed by a namespace so that
we won't think this is a type. The C struct hack doesn't we won't think this is a type. The C struct hack doesn't
go through namespaces. */ go through namespaces. */
if (TREE_CODE (x) == NAMESPACE_DECL) if (TREE_CODE (x) == NAMESPACE_DECL)
set_identifier_type_value_with_scope (name, NULL_TREE, set_identifier_type_value_with_scope (name, NULL_TREE,
current_binding_level); current_binding_level);
/* If this is an extern function declaration, see if we /* If this is an extern function declaration, see if we
...@@ -3983,7 +3987,7 @@ pushdecl (x) ...@@ -3983,7 +3987,7 @@ pushdecl (x)
warning ("variable `%s' shadows local", warning ("variable `%s' shadows local",
IDENTIFIER_POINTER (name)); IDENTIFIER_POINTER (name));
cp_warning_at (" this is the shadowed declaration", oldlocal); cp_warning_at (" this is the shadowed declaration", oldlocal);
} }
/* Maybe warn if shadowing something else. */ /* Maybe warn if shadowing something else. */
else if (warn_shadow && !DECL_EXTERNAL (x) else if (warn_shadow && !DECL_EXTERNAL (x)
/* No shadow warnings for internally generated vars. */ /* No shadow warnings for internally generated vars. */
...@@ -4020,12 +4024,12 @@ pushdecl (x) ...@@ -4020,12 +4024,12 @@ pushdecl (x)
/* RTTI TD entries are created while defining the type_info. */ /* RTTI TD entries are created while defining the type_info. */
|| (TYPE_LANG_SPECIFIC (TREE_TYPE (x)) || (TYPE_LANG_SPECIFIC (TREE_TYPE (x))
&& TYPE_BEING_DEFINED (TREE_TYPE (x))))) && TYPE_BEING_DEFINED (TREE_TYPE (x)))))
current_binding_level->incomplete current_binding_level->incomplete
= tree_cons (NULL_TREE, x, current_binding_level->incomplete); = tree_cons (NULL_TREE, x, current_binding_level->incomplete);
} }
if (need_new_binding) if (need_new_binding)
add_decl_to_level (x, add_decl_to_level (x,
DECL_NAMESPACE_SCOPE_P (x) DECL_NAMESPACE_SCOPE_P (x)
? NAMESPACE_LEVEL (CP_DECL_CONTEXT (x)) ? NAMESPACE_LEVEL (CP_DECL_CONTEXT (x))
: current_binding_level); : current_binding_level);
...@@ -4165,8 +4169,8 @@ maybe_push_decl (decl) ...@@ -4165,8 +4169,8 @@ maybe_push_decl (decl)
/* Add this decl to the current binding level, but not if it comes /* Add this decl to the current binding level, but not if it comes
from another scope, e.g. a static member variable. TEM may equal from another scope, e.g. a static member variable. TEM may equal
DECL or it may be a previous decl of the same name. */ DECL or it may be a previous decl of the same name. */
if ((TREE_CODE (decl) != PARM_DECL if ((TREE_CODE (decl) != PARM_DECL
&& DECL_CONTEXT (decl) != NULL_TREE && DECL_CONTEXT (decl) != NULL_TREE
/* Definitions of namespace members outside their namespace are /* Definitions of namespace members outside their namespace are
possible. */ possible. */
&& TREE_CODE (DECL_CONTEXT (decl)) != NAMESPACE_DECL) && TREE_CODE (DECL_CONTEXT (decl)) != NAMESPACE_DECL)
...@@ -4214,7 +4218,7 @@ push_class_level_binding (name, x) ...@@ -4214,7 +4218,7 @@ push_class_level_binding (name, x)
tree x; tree x;
{ {
tree binding; tree binding;
/* The class_binding_level will be NULL if x is a template /* The class_binding_level will be NULL if x is a template
parameter name in a member template. */ parameter name in a member template. */
if (!class_binding_level) if (!class_binding_level)
return; return;
...@@ -4228,7 +4232,7 @@ push_class_level_binding (name, x) ...@@ -4228,7 +4232,7 @@ push_class_level_binding (name, x)
class, then we will need to restore IDENTIFIER_CLASS_VALUE when class, then we will need to restore IDENTIFIER_CLASS_VALUE when
we leave this class. Record the shadowed declaration here. */ we leave this class. Record the shadowed declaration here. */
binding = IDENTIFIER_BINDING (name); binding = IDENTIFIER_BINDING (name);
if (binding if (binding
&& ((TREE_CODE (x) == OVERLOAD && ((TREE_CODE (x) == OVERLOAD
&& BINDING_VALUE (binding) && BINDING_VALUE (binding)
&& is_overloaded_fn (BINDING_VALUE (binding))) && is_overloaded_fn (BINDING_VALUE (binding)))
...@@ -4295,7 +4299,7 @@ push_using_decl (scope, name) ...@@ -4295,7 +4299,7 @@ push_using_decl (scope, name)
tree name; tree name;
{ {
tree decl; tree decl;
my_friendly_assert (TREE_CODE (scope) == NAMESPACE_DECL, 383); my_friendly_assert (TREE_CODE (scope) == NAMESPACE_DECL, 383);
my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 384); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 384);
for (decl = current_binding_level->usings; decl; decl = TREE_CHAIN (decl)) for (decl = current_binding_level->usings; decl; decl = TREE_CHAIN (decl))
...@@ -4320,7 +4324,7 @@ push_using_directive (used) ...@@ -4320,7 +4324,7 @@ push_using_directive (used)
{ {
tree ud = current_binding_level->using_directives; tree ud = current_binding_level->using_directives;
tree iter, ancestor; tree iter, ancestor;
/* Check if we already have this. */ /* Check if we already have this. */
if (purpose_member (used, ud) != NULL_TREE) if (purpose_member (used, ud) != NULL_TREE)
return NULL_TREE; return NULL_TREE;
...@@ -4349,7 +4353,7 @@ push_using_directive (used) ...@@ -4349,7 +4353,7 @@ push_using_directive (used)
PUSH_LOCAL: Bind DECL in the current scope, rather than at PUSH_LOCAL: Bind DECL in the current scope, rather than at
namespace scope. namespace scope.
PUSH_USING: DECL is being pushed as the result of a using PUSH_USING: DECL is being pushed as the result of a using
declaration. declaration.
The value returned may be a previous declaration if we guessed wrong The value returned may be a previous declaration if we guessed wrong
about what language DECL should belong to (C or C++). Otherwise, about what language DECL should belong to (C or C++). Otherwise,
...@@ -4384,7 +4388,7 @@ push_overloaded_decl (decl, flags) ...@@ -4384,7 +4388,7 @@ push_overloaded_decl (decl, flags)
else if (is_overloaded_fn (old)) else if (is_overloaded_fn (old))
{ {
tree tmp; tree tmp;
for (tmp = old; tmp; tmp = OVL_NEXT (tmp)) for (tmp = old; tmp; tmp = OVL_NEXT (tmp))
{ {
tree fn = OVL_CURRENT (tmp); tree fn = OVL_CURRENT (tmp);
...@@ -4395,7 +4399,7 @@ push_overloaded_decl (decl, flags) ...@@ -4395,7 +4399,7 @@ push_overloaded_decl (decl, flags)
TYPE_ARG_TYPES (TREE_TYPE (decl)))) TYPE_ARG_TYPES (TREE_TYPE (decl))))
cp_error ("`%#D' conflicts with previous using declaration `%#D'", cp_error ("`%#D' conflicts with previous using declaration `%#D'",
decl, fn); decl, fn);
if (duplicate_decls (decl, fn)) if (duplicate_decls (decl, fn))
return fn; return fn;
} }
...@@ -4434,7 +4438,7 @@ push_overloaded_decl (decl, flags) ...@@ -4434,7 +4438,7 @@ push_overloaded_decl (decl, flags)
if (TREE_CODE (new_binding) == OVERLOAD && old) if (TREE_CODE (new_binding) == OVERLOAD && old)
{ {
tree *d; tree *d;
for (d = &BINDING_LEVEL (IDENTIFIER_BINDING (name))->names; for (d = &BINDING_LEVEL (IDENTIFIER_BINDING (name))->names;
*d; *d;
d = &TREE_CHAIN (*d)) d = &TREE_CHAIN (*d))
...@@ -4447,7 +4451,7 @@ push_overloaded_decl (decl, flags) ...@@ -4447,7 +4451,7 @@ push_overloaded_decl (decl, flags)
TREE_VALUE (*d) = new_binding; TREE_VALUE (*d) = new_binding;
else else
/* Build a TREE_LIST to wrap the OVERLOAD. */ /* Build a TREE_LIST to wrap the OVERLOAD. */
*d = tree_cons (NULL_TREE, new_binding, *d = tree_cons (NULL_TREE, new_binding,
TREE_CHAIN (*d)); TREE_CHAIN (*d));
/* And update the CPLUS_BINDING node. */ /* And update the CPLUS_BINDING node. */
...@@ -4633,7 +4637,7 @@ make_label_decl (id, local_p) ...@@ -4633,7 +4637,7 @@ make_label_decl (id, local_p)
be found, create one. (We keep track of used, but undefined, be found, create one. (We keep track of used, but undefined,
labels, and complain about them at the end of a function.) */ labels, and complain about them at the end of a function.) */
tree tree
lookup_label (id) lookup_label (id)
tree id; tree id;
{ {
...@@ -4646,7 +4650,7 @@ lookup_label (id) ...@@ -4646,7 +4650,7 @@ lookup_label (id)
IDENTIFIER_POINTER (id)); IDENTIFIER_POINTER (id));
return NULL_TREE; return NULL_TREE;
} }
/* See if we've already got this label. */ /* See if we've already got this label. */
decl = IDENTIFIER_LABEL_VALUE (id); decl = IDENTIFIER_LABEL_VALUE (id);
if (decl != NULL_TREE && DECL_CONTEXT (decl) == current_function_decl) if (decl != NULL_TREE && DECL_CONTEXT (decl) == current_function_decl)
...@@ -4676,14 +4680,14 @@ declare_local_label (id) ...@@ -4676,14 +4680,14 @@ declare_local_label (id)
/* Add a new entry to the SHADOWED_LABELS list so that when we leave /* Add a new entry to the SHADOWED_LABELS list so that when we leave
this scope we can restore the old value of this scope we can restore the old value of
IDENTIFIER_TYPE_VALUE. */ IDENTIFIER_TYPE_VALUE. */
current_binding_level->shadowed_labels current_binding_level->shadowed_labels
= tree_cons (IDENTIFIER_LABEL_VALUE (id), NULL_TREE, = tree_cons (IDENTIFIER_LABEL_VALUE (id), NULL_TREE,
current_binding_level->shadowed_labels); current_binding_level->shadowed_labels);
/* Look for the label. */ /* Look for the label. */
decl = make_label_decl (id, /*local_p=*/1); decl = make_label_decl (id, /*local_p=*/1);
/* Now fill in the information we didn't have before. */ /* Now fill in the information we didn't have before. */
TREE_VALUE (current_binding_level->shadowed_labels) = decl; TREE_VALUE (current_binding_level->shadowed_labels) = decl;
return decl; return decl;
} }
...@@ -4853,7 +4857,7 @@ define_case_label () ...@@ -4853,7 +4857,7 @@ define_case_label ()
if (! switch_stack) if (! switch_stack)
/* Don't crash; we'll complain in do_case. */ /* Don't crash; we'll complain in do_case. */
return; return;
if (cleanup) if (cleanup)
{ {
static int explained = 0; static int explained = 0;
...@@ -4982,10 +4986,10 @@ lookup_tag (form, name, binding_level, thislevel_only) ...@@ -4982,10 +4986,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
declaration, then we use the _TYPE node for the declaration, then we use the _TYPE node for the
template. See the example below. */ template. See the example below. */
if (thislevel_only && !allow_pseudo_global if (thislevel_only && !allow_pseudo_global
&& old && BINDING_VALUE (old) && old && BINDING_VALUE (old)
&& DECL_CLASS_TEMPLATE_P (BINDING_VALUE (old))) && DECL_CLASS_TEMPLATE_P (BINDING_VALUE (old)))
old = TREE_TYPE (BINDING_VALUE (old)); old = TREE_TYPE (BINDING_VALUE (old));
else else
old = BINDING_TYPE (old); old = BINDING_TYPE (old);
/* If it has an original type, it is a typedef, and we /* If it has an original type, it is a typedef, and we
...@@ -5027,10 +5031,10 @@ lookup_tag (form, name, binding_level, thislevel_only) ...@@ -5027,10 +5031,10 @@ lookup_tag (form, name, binding_level, thislevel_only)
if (level->pseudo_global && allow_pseudo_global) if (level->pseudo_global && allow_pseudo_global)
{ {
/* We must deal with cases like this: /* We must deal with cases like this:
template <class T> struct S; template <class T> struct S;
template <class T> struct S {}; template <class T> struct S {};
When looking up `S', for the second declaration, we When looking up `S', for the second declaration, we
would like to find the first declaration. But, we would like to find the first declaration. But, we
are in the pseudo-global level created for the are in the pseudo-global level created for the
...@@ -5121,7 +5125,7 @@ lookup_namespace_name (namespace, name) ...@@ -5121,7 +5125,7 @@ lookup_namespace_name (namespace, name)
} }
my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 373); my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 373);
val = make_node (CPLUS_BINDING); val = make_node (CPLUS_BINDING);
if (!qualified_lookup_using_namespace (name, namespace, val, 0)) if (!qualified_lookup_using_namespace (name, namespace, val, 0))
return error_mark_node; return error_mark_node;
...@@ -5133,14 +5137,14 @@ lookup_namespace_name (namespace, name) ...@@ -5133,14 +5137,14 @@ lookup_namespace_name (namespace, name)
if (template_id) if (template_id)
{ {
if (DECL_CLASS_TEMPLATE_P (val)) if (DECL_CLASS_TEMPLATE_P (val))
val = lookup_template_class (val, val = lookup_template_class (val,
TREE_OPERAND (template_id, 1), TREE_OPERAND (template_id, 1),
/*in_decl=*/NULL_TREE, /*in_decl=*/NULL_TREE,
/*context=*/NULL_TREE, /*context=*/NULL_TREE,
/*entering_scope=*/0); /*entering_scope=*/0);
else if (DECL_FUNCTION_TEMPLATE_P (val) else if (DECL_FUNCTION_TEMPLATE_P (val)
|| TREE_CODE (val) == OVERLOAD) || TREE_CODE (val) == OVERLOAD)
val = lookup_template_function (val, val = lookup_template_function (val,
TREE_OPERAND (template_id, 1)); TREE_OPERAND (template_id, 1));
else else
{ {
...@@ -5192,10 +5196,10 @@ typename_compare (k1, k2) ...@@ -5192,10 +5196,10 @@ typename_compare (k1, k2)
t2 = (tree) k2; t2 = (tree) k2;
d1 = TYPE_NAME (t1); d1 = TYPE_NAME (t1);
d2 = TYPE_NAME (t2); d2 = TYPE_NAME (t2);
return (DECL_NAME (d1) == DECL_NAME (d2) return (DECL_NAME (d1) == DECL_NAME (d2)
&& same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)) && same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2))
&& ((TREE_TYPE (t1) != NULL_TREE) && ((TREE_TYPE (t1) != NULL_TREE)
== (TREE_TYPE (t2) != NULL_TREE)) == (TREE_TYPE (t2) != NULL_TREE))
&& same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)) && same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
&& TYPENAME_TYPE_FULLNAME (t1) == TYPENAME_TYPE_FULLNAME (t2)); && TYPENAME_TYPE_FULLNAME (t1) == TYPENAME_TYPE_FULLNAME (t2));
...@@ -5205,7 +5209,7 @@ typename_compare (k1, k2) ...@@ -5205,7 +5209,7 @@ typename_compare (k1, k2)
the type of `T', NAME is the IDENTIFIER_NODE for `t'. If BASE_TYPE the type of `T', NAME is the IDENTIFIER_NODE for `t'. If BASE_TYPE
is non-NULL, this type is being created by the implicit typename is non-NULL, this type is being created by the implicit typename
extension, and BASE_TYPE is a type named `t' in some base class of extension, and BASE_TYPE is a type named `t' in some base class of
`T' which depends on template parameters. `T' which depends on template parameters.
Returns the new TYPENAME_TYPE. */ Returns the new TYPENAME_TYPE. */
...@@ -5225,7 +5229,7 @@ build_typename_type (context, name, fullname, base_type) ...@@ -5225,7 +5229,7 @@ build_typename_type (context, name, fullname, base_type)
if (!ht.table) if (!ht.table)
{ {
static struct hash_table *h = &ht; static struct hash_table *h = &ht;
if (!hash_table_init (&ht, &hash_newfunc, &typename_hash, if (!hash_table_init (&ht, &hash_newfunc, &typename_hash,
&typename_compare)) &typename_compare))
fatal ("virtual memory exhausted"); fatal ("virtual memory exhausted");
ggc_add_tree_hash_table_root (&h, 1); ggc_add_tree_hash_table_root (&h, 1);
...@@ -5268,8 +5272,8 @@ make_typename_type (context, name, complain) ...@@ -5268,8 +5272,8 @@ make_typename_type (context, name, complain)
if (TREE_CODE_CLASS (TREE_CODE (name)) == 't') if (TREE_CODE_CLASS (TREE_CODE (name)) == 't')
{ {
if (!(TYPE_LANG_SPECIFIC (name) if (!(TYPE_LANG_SPECIFIC (name)
&& (CLASSTYPE_IS_TEMPLATE (name) && (CLASSTYPE_IS_TEMPLATE (name)
|| CLASSTYPE_USE_TEMPLATE (name)))) || CLASSTYPE_USE_TEMPLATE (name))))
name = TYPE_IDENTIFIER (name); name = TYPE_IDENTIFIER (name);
else else
...@@ -5318,15 +5322,15 @@ make_typename_type (context, name, complain) ...@@ -5318,15 +5322,15 @@ make_typename_type (context, name, complain)
return error_mark_node; return error_mark_node;
} }
return lookup_template_class (tmpl, return lookup_template_class (tmpl,
TREE_OPERAND (fullname, 1), TREE_OPERAND (fullname, 1),
NULL_TREE, context, NULL_TREE, context,
/*entering_scope=*/0); /*entering_scope=*/0);
} }
else else
{ {
tree t; tree t;
if (!IS_AGGR_TYPE (context)) if (!IS_AGGR_TYPE (context))
{ {
if (complain) if (complain)
...@@ -5348,8 +5352,8 @@ make_typename_type (context, name, complain) ...@@ -5348,8 +5352,8 @@ make_typename_type (context, name, complain)
cp_error ("no type named `%#T' in `%#T'", name, context); cp_error ("no type named `%#T' in `%#T'", name, context);
return error_mark_node; return error_mark_node;
} }
return build_typename_type (context, name, fullname, NULL_TREE); return build_typename_type (context, name, fullname, NULL_TREE);
} }
...@@ -5369,7 +5373,7 @@ select_decl (binding, flags) ...@@ -5369,7 +5373,7 @@ select_decl (binding, flags)
return val; return val;
return NULL_TREE; return NULL_TREE;
} }
/* If we could have a type and /* If we could have a type and
we have nothing or we need a type and have none. */ we have nothing or we need a type and have none. */
if (BINDING_TYPE (binding) if (BINDING_TYPE (binding)
...@@ -5416,7 +5420,7 @@ unqualified_namespace_lookup (name, flags, spacesp) ...@@ -5416,7 +5420,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
BINDING_TYPE (b) = BINDING_TYPE (val); BINDING_TYPE (b) = BINDING_TYPE (val);
/* Add all _DECLs seen through local using-directives. */ /* Add all _DECLs seen through local using-directives. */
for (level = current_binding_level; for (level = current_binding_level;
!level->namespace_p; !level->namespace_p;
level = level->level_chain) level = level->level_chain)
if (!lookup_using_namespace (name, b, level->using_directives, if (!lookup_using_namespace (name, b, level->using_directives,
...@@ -5429,7 +5433,7 @@ unqualified_namespace_lookup (name, flags, spacesp) ...@@ -5429,7 +5433,7 @@ unqualified_namespace_lookup (name, flags, spacesp)
siter = initial; siter = initial;
while (1) while (1)
{ {
if (!lookup_using_namespace (name, b, DECL_NAMESPACE_USING (siter), if (!lookup_using_namespace (name, b, DECL_NAMESPACE_USING (siter),
scope, flags, spacesp)) scope, flags, spacesp))
/* Give up because of error. */ /* Give up because of error. */
return error_mark_node; return error_mark_node;
...@@ -5498,7 +5502,7 @@ warn_about_implicit_typename_lookup (typename, binding) ...@@ -5498,7 +5502,7 @@ warn_about_implicit_typename_lookup (typename, binding)
&& ! (TREE_CODE (binding) == TYPE_DECL && ! (TREE_CODE (binding) == TYPE_DECL
&& same_type_p (TREE_TYPE (binding), subtype))) && same_type_p (TREE_TYPE (binding), subtype)))
{ {
cp_warning ("lookup of `%D' finds `%#D'", cp_warning ("lookup of `%D' finds `%#D'",
name, binding); name, binding);
cp_warning (" instead of `%D' from dependent base class", cp_warning (" instead of `%D' from dependent base class",
typename); typename);
...@@ -5516,7 +5520,7 @@ warn_about_implicit_typename_lookup (typename, binding) ...@@ -5516,7 +5520,7 @@ warn_about_implicit_typename_lookup (typename, binding)
If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces. If PREFER_TYPE is > 0, we prefer TYPE_DECLs or namespaces.
If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces). If PREFER_TYPE is > 1, we reject non-type decls (e.g. namespaces).
If PREFER_TYPE is -2, we're being called from yylex(). (UGLY) If PREFER_TYPE is -2, we're being called from yylex(). (UGLY)
Otherwise we prefer non-TYPE_DECLs. Otherwise we prefer non-TYPE_DECLs.
If NONCLASS is non-zero, we don't look for the NAME in class scope, If NONCLASS is non-zero, we don't look for the NAME in class scope,
using IDENTIFIER_CLASS_VALUE. */ using IDENTIFIER_CLASS_VALUE. */
...@@ -5558,7 +5562,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) ...@@ -5558,7 +5562,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
type = got_scope; type = got_scope;
else if (got_object != error_mark_node) else if (got_object != error_mark_node)
type = got_object; type = got_object;
if (type) if (type)
{ {
if (type == error_mark_node) if (type == error_mark_node)
...@@ -5617,11 +5621,11 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) ...@@ -5617,11 +5621,11 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
if (!LOCAL_BINDING_P (t) && nonclass) if (!LOCAL_BINDING_P (t) && nonclass)
/* We're not looking for class-scoped bindings, so keep going. */ /* We're not looking for class-scoped bindings, so keep going. */
continue; continue;
/* If this is the kind of thing we're looking for, we're done. */ /* If this is the kind of thing we're looking for, we're done. */
if (qualify_lookup (BINDING_VALUE (t), flags)) if (qualify_lookup (BINDING_VALUE (t), flags))
binding = BINDING_VALUE (t); binding = BINDING_VALUE (t);
else if ((flags & LOOKUP_PREFER_TYPES) else if ((flags & LOOKUP_PREFER_TYPES)
&& qualify_lookup (BINDING_TYPE (t), flags)) && qualify_lookup (BINDING_TYPE (t), flags))
binding = BINDING_TYPE (t); binding = BINDING_TYPE (t);
else else
...@@ -5633,7 +5637,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only) ...@@ -5633,7 +5637,7 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
if (val_is_implicit_typename && !yylex) if (val_is_implicit_typename && !yylex)
warn_about_implicit_typename_lookup (val, binding); warn_about_implicit_typename_lookup (val, binding);
val = binding; val = binding;
val_is_implicit_typename val_is_implicit_typename
= IMPLICIT_TYPENAME_TYPE_DECL_P (val); = IMPLICIT_TYPENAME_TYPE_DECL_P (val);
if (!val_is_implicit_typename) if (!val_is_implicit_typename)
break; break;
...@@ -5738,14 +5742,14 @@ lookup_name_current_level (name) ...@@ -5738,14 +5742,14 @@ lookup_name_current_level (name)
if (t != NULL_TREE && TREE_CODE (t) == TREE_LIST) if (t != NULL_TREE && TREE_CODE (t) == TREE_LIST)
t = TREE_VALUE (t); t = TREE_VALUE (t);
} }
else if (IDENTIFIER_BINDING (name) else if (IDENTIFIER_BINDING (name)
&& LOCAL_BINDING_P (IDENTIFIER_BINDING (name))) && LOCAL_BINDING_P (IDENTIFIER_BINDING (name)))
{ {
while (1) while (1)
{ {
if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b) if (BINDING_LEVEL (IDENTIFIER_BINDING (name)) == b)
return IDENTIFIER_VALUE (name); return IDENTIFIER_VALUE (name);
if (b->keep == 2) if (b->keep == 2)
b = b->level_chain; b = b->level_chain;
else else
...@@ -5843,7 +5847,7 @@ record_builtin_type (rid_index, name, type) ...@@ -5843,7 +5847,7 @@ record_builtin_type (rid_index, name, type)
tname = get_identifier (name); tname = get_identifier (name);
TYPE_BUILT_IN (type) = 1; TYPE_BUILT_IN (type) = 1;
if (tname) if (tname)
{ {
tdecl = pushdecl (build_decl (TYPE_DECL, tname, type)); tdecl = pushdecl (build_decl (TYPE_DECL, tname, type));
...@@ -5917,7 +5921,7 @@ record_unknown_type (type, name) ...@@ -5917,7 +5921,7 @@ record_unknown_type (type, name)
TYPE_SIZE (type) = TYPE_SIZE (void_type_node); TYPE_SIZE (type) = TYPE_SIZE (void_type_node);
TYPE_ALIGN (type) = 1; TYPE_ALIGN (type) = 1;
TYPE_MODE (type) = TYPE_MODE (void_type_node); TYPE_MODE (type) = TYPE_MODE (void_type_node);
} }
/* Push overloaded decl, in global scope, with one argument so it /* Push overloaded decl, in global scope, with one argument so it
can be used as a callback from define_function. */ can be used as a callback from define_function. */
...@@ -6070,11 +6074,11 @@ init_decl_processing () ...@@ -6070,11 +6074,11 @@ init_decl_processing ()
/* Create the widest literal types. */ /* Create the widest literal types. */
widest_integer_literal_type_node = make_signed_type (HOST_BITS_PER_WIDE_INT * 2); widest_integer_literal_type_node = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
pushdecl (build_decl (TYPE_DECL, NULL_TREE, pushdecl (build_decl (TYPE_DECL, NULL_TREE,
widest_integer_literal_type_node)); widest_integer_literal_type_node));
widest_unsigned_literal_type_node = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2); widest_unsigned_literal_type_node = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
pushdecl (build_decl (TYPE_DECL, NULL_TREE, pushdecl (build_decl (TYPE_DECL, NULL_TREE,
widest_unsigned_literal_type_node)); widest_unsigned_literal_type_node));
/* These are types that type_for_size and type_for_mode use. */ /* These are types that type_for_size and type_for_mode use. */
...@@ -6145,7 +6149,7 @@ init_decl_processing () ...@@ -6145,7 +6149,7 @@ init_decl_processing ()
string_type_node = build_pointer_type (char_type_node); string_type_node = build_pointer_type (char_type_node);
const_string_type_node const_string_type_node
= build_pointer_type (build_qualified_type (char_type_node, = build_pointer_type (build_qualified_type (char_type_node,
TYPE_QUAL_CONST)); TYPE_QUAL_CONST));
empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE);
#if 0 #if 0
...@@ -6273,7 +6277,7 @@ init_decl_processing () ...@@ -6273,7 +6277,7 @@ init_decl_processing ()
layout_type (vtbl_ptr_type_node); layout_type (vtbl_ptr_type_node);
record_builtin_type (RID_MAX, NULL_PTR, vtbl_ptr_type_node); record_builtin_type (RID_MAX, NULL_PTR, vtbl_ptr_type_node);
std_node = build_decl (NAMESPACE_DECL, std_node = build_decl (NAMESPACE_DECL,
get_identifier (flag_honor_std ? "fake std":"std"), get_identifier (flag_honor_std ? "fake std":"std"),
void_type_node); void_type_node);
pushdecl (std_node); pushdecl (std_node);
...@@ -6414,7 +6418,7 @@ define_function (name, type, pfn, library_name) ...@@ -6414,7 +6418,7 @@ define_function (name, type, pfn, library_name)
} }
/* Wrapper around define_function, for the benefit of /* Wrapper around define_function, for the benefit of
c_common_nodes_and_builtins. c_common_nodes_and_builtins.
FUNCTION_CODE tells later passes how to compile calls to this function. FUNCTION_CODE tells later passes how to compile calls to this function.
See tree.h for its possible values. */ See tree.h for its possible values. */
...@@ -6664,7 +6668,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) ...@@ -6664,7 +6668,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, decl = grokdeclarator (declarator, declspecs, NORMAL, initialized,
attrlist); attrlist);
if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE) if (decl == NULL_TREE || TREE_CODE (decl) == VOID_TYPE)
return NULL_TREE; return NULL_TREE;
...@@ -6735,7 +6739,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) ...@@ -6735,7 +6739,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
#ifdef SET_DEFAULT_DECL_ATTRIBUTES #ifdef SET_DEFAULT_DECL_ATTRIBUTES
SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes); SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes);
#endif #endif
/* Set attributes here so if duplicate decl, will have proper attributes. */ /* Set attributes here so if duplicate decl, will have proper attributes. */
cplus_decl_attributes (decl, attributes, prefix_attributes); cplus_decl_attributes (decl, attributes, prefix_attributes);
...@@ -6777,7 +6781,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) ...@@ -6777,7 +6781,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
/* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */ /* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */
DECL_IN_AGGR_P (decl) = 0; DECL_IN_AGGR_P (decl) = 0;
if ((DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl)) if ((DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
|| CLASSTYPE_USE_TEMPLATE (context)) || CLASSTYPE_USE_TEMPLATE (context))
{ {
SET_DECL_TEMPLATE_SPECIALIZATION (decl); SET_DECL_TEMPLATE_SPECIALIZATION (decl);
...@@ -6810,7 +6814,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) ...@@ -6810,7 +6814,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
data segment. */ data segment. */
DECL_COMMON (tem) = flag_conserve_space || ! TREE_PUBLIC (tem); DECL_COMMON (tem) = flag_conserve_space || ! TREE_PUBLIC (tem);
#endif #endif
if (! processing_template_decl) if (! processing_template_decl)
start_decl_1 (tem); start_decl_1 (tem);
...@@ -6936,7 +6940,7 @@ grok_reference_init (decl, type, init) ...@@ -6936,7 +6940,7 @@ grok_reference_init (decl, type, init)
/* Note: default conversion is only called in very special cases. */ /* Note: default conversion is only called in very special cases. */
init = default_conversion (init); init = default_conversion (init);
} }
/* Convert INIT to the reference type TYPE. This may involve the /* Convert INIT to the reference type TYPE. This may involve the
creation of a temporary, whose lifetime must be the same as that creation of a temporary, whose lifetime must be the same as that
of the reference. If so, a DECL_STMT for the temporary will be of the reference. If so, a DECL_STMT for the temporary will be
...@@ -7067,7 +7071,7 @@ layout_var_decl (decl) ...@@ -7067,7 +7071,7 @@ layout_var_decl (decl)
/* If we haven't already layed out this declaration, do so now. /* If we haven't already layed out this declaration, do so now.
Note that we must not call complete type for an external object Note that we must not call complete type for an external object
because it's type might involve templates that we are not because it's type might involve templates that we are not
supposed to isntantiate yet. (And it's perfectly legal to say supposed to isntantiate yet. (And it's perfectly legal to say
`extern X x' for some incomplete type `X'.) */ `extern X x' for some incomplete type `X'.) */
if (!DECL_EXTERNAL (decl)) if (!DECL_EXTERNAL (decl))
complete_type (type); complete_type (type);
...@@ -7306,7 +7310,7 @@ check_initializer (decl, init) ...@@ -7306,7 +7310,7 @@ check_initializer (decl, init)
} }
else else
check_for_uninitialized_const_var (decl); check_for_uninitialized_const_var (decl);
return init; return init;
} }
...@@ -7419,7 +7423,7 @@ maybe_inject_for_scope_var (decl) ...@@ -7419,7 +7423,7 @@ maybe_inject_for_scope_var (decl)
{ {
if (current_binding_level->is_for_scope) if (current_binding_level->is_for_scope)
{ {
struct binding_level *outer struct binding_level *outer
= current_binding_level->level_chain; = current_binding_level->level_chain;
/* Check to see if the same name is already bound at the outer /* Check to see if the same name is already bound at the outer
...@@ -7431,11 +7435,11 @@ maybe_inject_for_scope_var (decl) ...@@ -7431,11 +7435,11 @@ maybe_inject_for_scope_var (decl)
Otherwise, we need to preserve the temp slot for decl to last Otherwise, we need to preserve the temp slot for decl to last
into the outer binding level. */ into the outer binding level. */
tree outer_binding tree outer_binding
= TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (decl))); = TREE_CHAIN (IDENTIFIER_BINDING (DECL_NAME (decl)));
if (outer_binding && BINDING_LEVEL (outer_binding) == outer if (outer_binding && BINDING_LEVEL (outer_binding) == outer
&& (TREE_CODE (BINDING_VALUE (outer_binding)) && (TREE_CODE (BINDING_VALUE (outer_binding))
== VAR_DECL) == VAR_DECL)
&& DECL_DEAD_FOR_LOCAL (BINDING_VALUE (outer_binding))) && DECL_DEAD_FOR_LOCAL (BINDING_VALUE (outer_binding)))
{ {
...@@ -7482,7 +7486,7 @@ initialize_local_var (decl, init, flags) ...@@ -7482,7 +7486,7 @@ initialize_local_var (decl, init, flags)
if (DECL_SIZE (decl) && type != error_mark_node) if (DECL_SIZE (decl) && type != error_mark_node)
{ {
int already_used; int already_used;
/* Compute and store the initial value. */ /* Compute and store the initial value. */
already_used = TREE_USED (decl) || TREE_USED (type); already_used = TREE_USED (decl) || TREE_USED (type);
...@@ -7506,7 +7510,7 @@ initialize_local_var (decl, init, flags) ...@@ -7506,7 +7510,7 @@ initialize_local_var (decl, init, flags)
marked used. (see TREE_USED, above.) */ marked used. (see TREE_USED, above.) */
if (TYPE_NEEDS_CONSTRUCTING (type) if (TYPE_NEEDS_CONSTRUCTING (type)
&& ! already_used && ! already_used
&& !TYPE_NEEDS_DESTRUCTOR (type) && !TYPE_NEEDS_DESTRUCTOR (type)
&& DECL_NAME (decl)) && DECL_NAME (decl))
TREE_USED (decl) = 0; TREE_USED (decl) = 0;
else if (already_used) else if (already_used)
...@@ -7516,7 +7520,7 @@ initialize_local_var (decl, init, flags) ...@@ -7516,7 +7520,7 @@ initialize_local_var (decl, init, flags)
/* Generate code to destroy DECL (a local variable). */ /* Generate code to destroy DECL (a local variable). */
static void static void
destroy_local_var (decl) destroy_local_var (decl)
tree decl; tree decl;
{ {
...@@ -7526,7 +7530,7 @@ destroy_local_var (decl) ...@@ -7526,7 +7530,7 @@ destroy_local_var (decl)
/* Only variables get cleaned up. */ /* Only variables get cleaned up. */
if (TREE_CODE (decl) != VAR_DECL) if (TREE_CODE (decl) != VAR_DECL)
return; return;
/* And only things with destructors need cleaning up. */ /* And only things with destructors need cleaning up. */
if (!TYPE_NEEDS_DESTRUCTOR (type)) if (!TYPE_NEEDS_DESTRUCTOR (type))
return; return;
...@@ -7537,7 +7541,7 @@ destroy_local_var (decl) ...@@ -7537,7 +7541,7 @@ destroy_local_var (decl)
translation unit, or that need a static cleanup. The latter translation unit, or that need a static cleanup. The latter
are handled by finish_file. */ are handled by finish_file. */
return; return;
/* Compute the cleanup. */ /* Compute the cleanup. */
cleanup = maybe_build_cleanup (decl); cleanup = maybe_build_cleanup (decl);
...@@ -7557,14 +7561,14 @@ emit_local_var (decl) ...@@ -7557,14 +7561,14 @@ emit_local_var (decl)
if (DECL_RTL (decl)) if (DECL_RTL (decl))
/* Only a RESULT_DECL should have non-NULL RTL when arriving here. /* Only a RESULT_DECL should have non-NULL RTL when arriving here.
All other local variables are assigned RTL in this function. */ All other local variables are assigned RTL in this function. */
my_friendly_assert (TREE_CODE (decl) == RESULT_DECL, my_friendly_assert (TREE_CODE (decl) == RESULT_DECL,
19990828); 19990828);
else else
{ {
if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)) if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
/* The user must have specified an assembler name for this /* The user must have specified an assembler name for this
variable. Set that up now. */ variable. Set that up now. */
rest_of_decl_compilation rest_of_decl_compilation
(decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
/*top_level=*/0, /*at_end=*/0); /*top_level=*/0, /*at_end=*/0);
else else
...@@ -7619,7 +7623,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags) ...@@ -7619,7 +7623,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
/* Handling __FUNCTION__ and its ilk in a template-function requires /* Handling __FUNCTION__ and its ilk in a template-function requires
some special processing because we are called from some special processing because we are called from
language-independent code. */ language-independent code. */
if (cfun && processing_template_decl if (cfun && processing_template_decl
&& current_function_name_declared == 2) && current_function_name_declared == 2)
{ {
/* Since we're in a template function, we need to /* Since we're in a template function, we need to
...@@ -7628,7 +7632,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags) ...@@ -7628,7 +7632,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
retrofit_lang_decl (decl); retrofit_lang_decl (decl);
decl = push_template_decl (decl); decl = push_template_decl (decl);
if (strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), if (strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)),
"__PRETTY_FUNCTION__") == 0) "__PRETTY_FUNCTION__") == 0)
{ {
init = build (FUNCTION_NAME, const_string_type_node); init = build (FUNCTION_NAME, const_string_type_node);
...@@ -7653,7 +7657,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags) ...@@ -7653,7 +7657,7 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
&& (DECL_INITIAL (decl) || init)) && (DECL_INITIAL (decl) || init))
DECL_DEFINED_IN_CLASS_P (decl) = 1; DECL_DEFINED_IN_CLASS_P (decl) = 1;
if (TREE_CODE (decl) == VAR_DECL if (TREE_CODE (decl) == VAR_DECL
&& DECL_CONTEXT (decl) && DECL_CONTEXT (decl)
&& TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL
&& DECL_CONTEXT (decl) != current_namespace && DECL_CONTEXT (decl) != current_namespace
...@@ -7759,11 +7763,11 @@ cp_finish_decl (decl, init, asmspec_tree, flags) ...@@ -7759,11 +7763,11 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
make_rtl_for_nonlocal_decl (decl, init, asmspec); make_rtl_for_nonlocal_decl (decl, init, asmspec);
if (TREE_CODE (type) == FUNCTION_TYPE if (TREE_CODE (type) == FUNCTION_TYPE
|| TREE_CODE (type) == METHOD_TYPE) || TREE_CODE (type) == METHOD_TYPE)
abstract_virtuals_error (decl, abstract_virtuals_error (decl,
strip_array_types (TREE_TYPE (type))); strip_array_types (TREE_TYPE (type)));
else else
abstract_virtuals_error (decl, strip_array_types (type)); abstract_virtuals_error (decl, strip_array_types (type));
if (TREE_CODE (decl) == FUNCTION_DECL) if (TREE_CODE (decl) == FUNCTION_DECL)
...@@ -7913,7 +7917,7 @@ get_atexit_node () ...@@ -7913,7 +7917,7 @@ get_atexit_node ()
We build up the argument types and then then function type We build up the argument types and then then function type
itself. */ itself. */
/* First, build the pointer-to-function type for the first /* First, build the pointer-to-function type for the first
argument. */ argument. */
arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node); arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
...@@ -7931,7 +7935,7 @@ get_atexit_node () ...@@ -7931,7 +7935,7 @@ get_atexit_node ()
else else
{ {
/* The declaration for `atexit' is: /* The declaration for `atexit' is:
int atexit (void (*)()); int atexit (void (*)());
We build up the argument types and then then function type We build up the argument types and then then function type
...@@ -8127,7 +8131,7 @@ expand_static_init (decl, init) ...@@ -8127,7 +8131,7 @@ expand_static_init (decl, init)
initialization is complete. This ensures that an exception, initialization is complete. This ensures that an exception,
thrown during the construction, will cause the variable to thrown during the construction, will cause the variable to
reinitialized when we pass through this code again, as per: reinitialized when we pass through this code again, as per:
[stmt.dcl] [stmt.dcl]
If the initialization exits by throwing an exception, the If the initialization exits by throwing an exception, the
...@@ -8143,7 +8147,7 @@ expand_static_init (decl, init) ...@@ -8143,7 +8147,7 @@ expand_static_init (decl, init)
/* Begin the conditional initialization. */ /* Begin the conditional initialization. */
if_stmt = begin_if_stmt (); if_stmt = begin_if_stmt ();
finish_if_stmt_cond (build_binary_op (EQ_EXPR, temp, finish_if_stmt_cond (build_binary_op (EQ_EXPR, temp,
integer_zero_node), integer_zero_node),
if_stmt); if_stmt);
then_clause = begin_compound_stmt (/*has_no_scope=*/0); then_clause = begin_compound_stmt (/*has_no_scope=*/0);
...@@ -8170,7 +8174,7 @@ expand_static_init (decl, init) ...@@ -8170,7 +8174,7 @@ expand_static_init (decl, init)
if (assignment) if (assignment)
{ {
assignment = tree_cons (NULL_TREE, assignment, assignment = tree_cons (NULL_TREE, assignment,
build_tree_list (NULL_TREE, build_tree_list (NULL_TREE,
temp_init)); temp_init));
assignment = build_compound_expr (assignment); assignment = build_compound_expr (assignment);
} }
...@@ -8232,7 +8236,7 @@ complete_array_type (type, initial_value, do_default) ...@@ -8232,7 +8236,7 @@ complete_array_type (type, initial_value, do_default)
{ {
register tree maxindex = NULL_TREE; register tree maxindex = NULL_TREE;
int value = 0; int value = 0;
if (initial_value) if (initial_value)
{ {
/* Note MAXINDEX is really the maximum index, /* Note MAXINDEX is really the maximum index,
...@@ -8358,7 +8362,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises) ...@@ -8358,7 +8362,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
or `volatile'. or `volatile'.
RAISES is a list of exceptions that this function can raise. RAISES is a list of exceptions that this function can raise.
CHECK is 1 if we must find this method in CTYPE, 0 if we should CHECK is 1 if we must find this method in CTYPE, 0 if we should
not look, and -1 if we should not call `grokclassfn' at all. not look, and -1 if we should not call `grokclassfn' at all.
Returns `NULL_TREE' if something goes wrong, after issuing Returns `NULL_TREE' if something goes wrong, after issuing
applicable error messages. */ applicable error messages. */
...@@ -8511,7 +8515,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8511,7 +8515,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (PROCESSING_REAL_TEMPLATE_DECL_P ()) if (PROCESSING_REAL_TEMPLATE_DECL_P ())
{ {
/* Something like `template <class T> friend void f<T>()'. */ /* Something like `template <class T> friend void f<T>()'. */
cp_error ("template-id `%D' in declaration of primary template", cp_error ("template-id `%D' in declaration of primary template",
orig_declarator); orig_declarator);
return NULL_TREE; return NULL_TREE;
} }
...@@ -8534,7 +8538,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8534,7 +8538,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (inlinep) if (inlinep)
{ {
cp_error ("`inline' is not allowed in declaration of friend template specialization `%D'", cp_error ("`inline' is not allowed in declaration of friend template specialization `%D'",
decl); decl);
return NULL_TREE; return NULL_TREE;
} }
...@@ -8572,8 +8576,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8572,8 +8576,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
grokclassfn (ctype, decl, flags, quals); grokclassfn (ctype, decl, flags, quals);
decl = check_explicit_specialization (orig_declarator, decl, decl = check_explicit_specialization (orig_declarator, decl,
template_count, template_count,
2 * (funcdef_flag != 0) + 2 * (funcdef_flag != 0) +
4 * (friendp != 0)); 4 * (friendp != 0));
if (decl == error_mark_node) if (decl == error_mark_node)
return NULL_TREE; return NULL_TREE;
...@@ -8605,8 +8609,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8605,8 +8609,8 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
grokclassfn (ctype, decl, flags, quals); grokclassfn (ctype, decl, flags, quals);
decl = check_explicit_specialization (orig_declarator, decl, decl = check_explicit_specialization (orig_declarator, decl,
template_count, template_count,
2 * (funcdef_flag != 0) + 2 * (funcdef_flag != 0) +
4 * (friendp != 0)); 4 * (friendp != 0));
if (decl == error_mark_node) if (decl == error_mark_node)
return NULL_TREE; return NULL_TREE;
...@@ -8619,7 +8623,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8619,7 +8623,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (tmp && TREE_CODE (tmp) == TEMPLATE_DECL) if (tmp && TREE_CODE (tmp) == TEMPLATE_DECL)
tmp = DECL_TEMPLATE_RESULT (tmp); tmp = DECL_TEMPLATE_RESULT (tmp);
if (tmp && DECL_STATIC_FUNCTION_P (tmp) if (tmp && DECL_STATIC_FUNCTION_P (tmp)
&& TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
{ {
...@@ -8691,7 +8695,7 @@ grokvardecl (type, declarator, specbits_in, initialized, constp, in_namespace) ...@@ -8691,7 +8695,7 @@ grokvardecl (type, declarator, specbits_in, initialized, constp, in_namespace)
else else
context = NULL_TREE; context = NULL_TREE;
if (processing_template_decl) if (processing_template_decl)
/* If we're in a template, we need DECL_LANG_SPECIFIC so that /* If we're in a template, we need DECL_LANG_SPECIFIC so that
we can call push_template_decl. */ we can call push_template_decl. */
decl = build_lang_decl (VAR_DECL, declarator, type); decl = build_lang_decl (VAR_DECL, declarator, type);
...@@ -8781,7 +8785,7 @@ build_ptrmemfunc_type (type) ...@@ -8781,7 +8785,7 @@ build_ptrmemfunc_type (type)
/* Make sure that we always have the unqualified pointer-to-member /* Make sure that we always have the unqualified pointer-to-member
type first. */ type first. */
if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED) if (CP_TYPE_QUALS (type) != TYPE_UNQUALIFIED)
unqualified_variant unqualified_variant
= build_ptrmemfunc_type (TYPE_MAIN_VARIANT (type)); = build_ptrmemfunc_type (TYPE_MAIN_VARIANT (type));
u = make_aggr_type (UNION_TYPE); u = make_aggr_type (UNION_TYPE);
...@@ -8850,7 +8854,7 @@ check_static_variable_definition (decl, type) ...@@ -8850,7 +8854,7 @@ check_static_variable_definition (decl, type)
required. */ required. */
if (CLASS_TYPE_P (type) || TREE_CODE (type) == REFERENCE_TYPE) if (CLASS_TYPE_P (type) || TREE_CODE (type) == REFERENCE_TYPE)
{ {
cp_error ("in-class initialization of static data member of non-integral type `%T'", cp_error ("in-class initialization of static data member of non-integral type `%T'",
type); type);
/* If we just return the declaration, crashes will sometimes /* If we just return the declaration, crashes will sometimes
occur. We therefore return void_type_node, as if this was a occur. We therefore return void_type_node, as if this was a
...@@ -8941,7 +8945,7 @@ compute_array_index_type (name, size) ...@@ -8941,7 +8945,7 @@ compute_array_index_type (name, size)
size = integer_one_node; size = integer_one_node;
} }
/* Except that an extension we allow zero-sized arrays. We /* Except that an extension we allow zero-sized arrays. We
always allow them in system headers because glibc uses always allow them in system headers because glibc uses
them. */ them. */
else if (integer_zerop (size) && pedantic && !in_system_header) else if (integer_zerop (size) && pedantic && !in_system_header)
{ {
...@@ -8959,7 +8963,7 @@ compute_array_index_type (name, size) ...@@ -8959,7 +8963,7 @@ compute_array_index_type (name, size)
cp_convert (ssizetype, size), cp_convert (ssizetype, size),
cp_convert (ssizetype, cp_convert (ssizetype,
integer_one_node))); integer_one_node)));
/* Check for variable-sized arrays. We allow such things as an /* Check for variable-sized arrays. We allow such things as an
extension, even though they are not allowed in ANSI/ISO C++. */ extension, even though they are not allowed in ANSI/ISO C++. */
if (!TREE_CONSTANT (itype)) if (!TREE_CONSTANT (itype))
...@@ -8984,7 +8988,7 @@ compute_array_index_type (name, size) ...@@ -8984,7 +8988,7 @@ compute_array_index_type (name, size)
error ("overflow in array dimension"); error ("overflow in array dimension");
TREE_OVERFLOW (itype) = 0; TREE_OVERFLOW (itype) = 0;
} }
/* Create and return the appropriate index type. */ /* Create and return the appropriate index type. */
return build_index_type (itype); return build_index_type (itype);
} }
...@@ -9048,7 +9052,7 @@ create_array_type_for_decl (name, type, size) ...@@ -9048,7 +9052,7 @@ create_array_type_for_decl (name, type, size)
} }
/* [dcl.array] /* [dcl.array]
The constant expressions that specify the bounds of the arrays The constant expressions that specify the bounds of the arrays
can be omitted only for the first member of the sequence. */ can be omitted only for the first member of the sequence. */
if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)) if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type))
...@@ -9320,7 +9324,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9320,7 +9324,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
} }
ctype = NULL_TREE; ctype = NULL_TREE;
break; break;
case TEMPLATE_ID_EXPR: case TEMPLATE_ID_EXPR:
{ {
tree fns = TREE_OPERAND (decl, 0); tree fns = TREE_OPERAND (decl, 0);
...@@ -9513,7 +9517,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9513,7 +9517,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (name == NULL) if (name == NULL)
name = decl_context == PARM ? "parameter" : "type name"; name = decl_context == PARM ? "parameter" : "type name";
/* Look through the decl specs and record which ones appear. /* Look through the decl specs and record which ones appear.
Some typespecs are defined as built-in typenames. Some typespecs are defined as built-in typenames.
Others, the ones that are modifiers of other types, Others, the ones that are modifiers of other types,
...@@ -9716,7 +9720,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9716,7 +9720,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
&& TYPE_MAIN_VARIANT (type) == double_type_node) && TYPE_MAIN_VARIANT (type) == double_type_node)
{ {
RIDBIT_RESET (RID_LONG, specbits); RIDBIT_RESET (RID_LONG, specbits);
type = build_qualified_type (long_double_type_node, type = build_qualified_type (long_double_type_node,
CP_TYPE_QUALS (type)); CP_TYPE_QUALS (type));
} }
...@@ -9785,7 +9789,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9785,7 +9789,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
It is implementation-defined whether a plain (neither It is implementation-defined whether a plain (neither
explicitly signed or unsigned) char, short, int, or long explicitly signed or unsigned) char, short, int, or long
bit-field is signed or unsigned. bit-field is signed or unsigned.
Naturally, we extend this to long long as well. Note that Naturally, we extend this to long long as well. Note that
this does not include wchar_t. */ this does not include wchar_t. */
|| (bitfield && !flag_signed_bitfields || (bitfield && !flag_signed_bitfields
...@@ -9793,7 +9797,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9793,7 +9797,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* A typedef for plain `int' without `signed' can be /* A typedef for plain `int' without `signed' can be
controlled just like plain `int', but a typedef for controlled just like plain `int', but a typedef for
`signed int' cannot be so controlled. */ `signed int' cannot be so controlled. */
&& !(typedef_decl && !(typedef_decl
&& C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)) && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))
&& (TREE_CODE (type) == INTEGER_TYPE && (TREE_CODE (type) == INTEGER_TYPE
|| TREE_CODE (type) == CHAR_TYPE) || TREE_CODE (type) == CHAR_TYPE)
...@@ -9847,7 +9851,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9847,7 +9851,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type = build_complex_type (type); type = build_complex_type (type);
} }
if (return_type == return_conversion if (return_type == return_conversion
&& (RIDBIT_SETP (RID_CONST, specbits) && (RIDBIT_SETP (RID_CONST, specbits)
|| RIDBIT_SETP (RID_VOLATILE, specbits) || RIDBIT_SETP (RID_VOLATILE, specbits)
|| RIDBIT_SETP (RID_RESTRICT, specbits))) || RIDBIT_SETP (RID_RESTRICT, specbits)))
...@@ -9859,9 +9863,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9859,9 +9863,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
Likewise for VOLATILEP. */ Likewise for VOLATILEP. */
constp = !! RIDBIT_SETP (RID_CONST, specbits) + CP_TYPE_CONST_P (type); constp = !! RIDBIT_SETP (RID_CONST, specbits) + CP_TYPE_CONST_P (type);
restrictp = restrictp =
!! RIDBIT_SETP (RID_RESTRICT, specbits) + CP_TYPE_RESTRICT_P (type); !! RIDBIT_SETP (RID_RESTRICT, specbits) + CP_TYPE_RESTRICT_P (type);
volatilep = volatilep =
!! RIDBIT_SETP (RID_VOLATILE, specbits) + CP_TYPE_VOLATILE_P (type); !! RIDBIT_SETP (RID_VOLATILE, specbits) + CP_TYPE_VOLATILE_P (type);
type_quals = ((constp ? TYPE_QUAL_CONST : 0) type_quals = ((constp ? TYPE_QUAL_CONST : 0)
| (restrictp ? TYPE_QUAL_RESTRICT : 0) | (restrictp ? TYPE_QUAL_RESTRICT : 0)
...@@ -9946,7 +9950,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9946,7 +9950,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (declarator) if (declarator)
{ {
/* Avoid trying to get an operand off an identifier node. */ /* Avoid trying to get an operand off an identifier node. */
if (TREE_CODE (declarator) == IDENTIFIER_NODE) if (TREE_CODE (declarator) == IDENTIFIER_NODE)
tmp = declarator; tmp = declarator;
else else
...@@ -9998,7 +10002,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -9998,7 +10002,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
the declared identifier (or NULL_TREE, in an absolute declarator). */ the declared identifier (or NULL_TREE, in an absolute declarator). */
inner_attrs = NULL_TREE; inner_attrs = NULL_TREE;
ignore_attrs = 0; ignore_attrs = 0;
while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE
&& TREE_CODE (declarator) != TEMPLATE_ID_EXPR) && TREE_CODE (declarator) != TEMPLATE_ID_EXPR)
...@@ -10121,7 +10125,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10121,7 +10125,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF) if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF)
inner_decl = TREE_OPERAND (inner_decl, 1); inner_decl = TREE_OPERAND (inner_decl, 1);
if (inner_decl && TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR) if (inner_decl && TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR)
inner_decl = dname; inner_decl = dname;
/* Pick up type qualifiers which should be applied to `this'. */ /* Pick up type qualifiers which should be applied to `this'. */
...@@ -10133,11 +10137,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10133,11 +10137,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* Say it's a definition only for the CALL_EXPR /* Say it's a definition only for the CALL_EXPR
closest to the identifier. */ closest to the identifier. */
funcdecl_p funcdecl_p
= inner_decl = inner_decl
&& (TREE_CODE (inner_decl) == IDENTIFIER_NODE && (TREE_CODE (inner_decl) == IDENTIFIER_NODE
|| TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR || TREE_CODE (inner_decl) == TEMPLATE_ID_EXPR
|| TREE_CODE (inner_decl) == BIT_NOT_EXPR); || TREE_CODE (inner_decl) == BIT_NOT_EXPR);
if (ctype == NULL_TREE if (ctype == NULL_TREE
&& decl_context == FIELD && decl_context == FIELD
&& funcdecl_p && funcdecl_p
...@@ -10250,7 +10254,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10250,7 +10254,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
want the underlying IDENTIFIER. */ want the underlying IDENTIFIER. */
if (TREE_CODE (declarator) == BIT_NOT_EXPR) if (TREE_CODE (declarator) == BIT_NOT_EXPR)
declarator = TREE_OPERAND (declarator, 0); declarator = TREE_OPERAND (declarator, 0);
if (strict_prototype == 0 && arg_types == NULL_TREE) if (strict_prototype == 0 && arg_types == NULL_TREE)
arg_types = void_list_node; arg_types = void_list_node;
else if (arg_types == NULL_TREE else if (arg_types == NULL_TREE
...@@ -10437,7 +10441,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10437,7 +10441,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
ctype = TREE_OPERAND (declarator, 0); ctype = TREE_OPERAND (declarator, 0);
t = ctype; t = ctype;
while (t != NULL_TREE && CLASS_TYPE_P (t)) while (t != NULL_TREE && CLASS_TYPE_P (t))
{ {
if (CLASSTYPE_TEMPLATE_INFO (t) && if (CLASSTYPE_TEMPLATE_INFO (t) &&
!CLASSTYPE_TEMPLATE_SPECIALIZATION (t)) !CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
...@@ -10673,10 +10677,10 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10673,10 +10677,10 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
type is a (non-primary) template. The name for the type is a (non-primary) template. The name for the
template needs updating as well. */ template needs updating as well. */
if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_TEMPLATE_INFO (type)) if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_TEMPLATE_INFO (type))
DECL_NAME (CLASSTYPE_TI_TEMPLATE (type)) DECL_NAME (CLASSTYPE_TI_TEMPLATE (type))
= TYPE_IDENTIFIER (type); = TYPE_IDENTIFIER (type);
/* XXX Temporarily set the scope. /* XXX Temporarily set the scope.
When returning, start_decl expects it as NULL_TREE, When returning, start_decl expects it as NULL_TREE,
and will then then set it using pushdecl. */ and will then then set it using pushdecl. */
my_friendly_assert (DECL_CONTEXT (decl) == NULL_TREE, 980404); my_friendly_assert (DECL_CONTEXT (decl) == NULL_TREE, 980404);
...@@ -10845,7 +10849,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10845,7 +10849,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
return NULL_TREE; return NULL_TREE;
} }
} }
{ {
register tree decl; register tree decl;
...@@ -10930,11 +10934,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10930,11 +10934,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
} }
/* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */
function_context = (ctype != NULL_TREE) ? function_context = (ctype != NULL_TREE) ?
hack_decl_function_context (TYPE_MAIN_DECL (ctype)) : NULL_TREE; hack_decl_function_context (TYPE_MAIN_DECL (ctype)) : NULL_TREE;
publicp = (! friendp || ! staticp) publicp = (! friendp || ! staticp)
&& function_context == NULL_TREE; && function_context == NULL_TREE;
decl = grokfndecl (ctype, type, decl = grokfndecl (ctype, type,
TREE_CODE (declarator) != TEMPLATE_ID_EXPR TREE_CODE (declarator) != TEMPLATE_ID_EXPR
? declarator : dname, ? declarator : dname,
declarator, declarator,
...@@ -10966,7 +10970,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10966,7 +10970,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
We don't look at the first parameter, which is We don't look at the first parameter, which is
really just the `this' parameter for the new really just the `this' parameter for the new
object. */ object. */
tree arg_types = tree arg_types =
TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))); TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl)));
/* Skip the `in_chrg' argument too, if present. */ /* Skip the `in_chrg' argument too, if present. */
...@@ -10974,8 +10978,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10974,8 +10978,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
arg_types = TREE_CHAIN (arg_types); arg_types = TREE_CHAIN (arg_types);
if (arg_types == void_list_node if (arg_types == void_list_node
|| (arg_types || (arg_types
&& TREE_CHAIN (arg_types) && TREE_CHAIN (arg_types)
&& TREE_CHAIN (arg_types) != void_list_node && TREE_CHAIN (arg_types) != void_list_node
&& !TREE_PURPOSE (TREE_CHAIN (arg_types)))) && !TREE_PURPOSE (TREE_CHAIN (arg_types))))
DECL_NONCONVERTING_P (decl) = 1; DECL_NONCONVERTING_P (decl) = 1;
...@@ -11039,8 +11043,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11039,8 +11043,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
{ {
if (template_class_depth (current_class_type) == 0) if (template_class_depth (current_class_type) == 0)
{ {
decl decl
= check_explicit_specialization = check_explicit_specialization
(declarator, decl, (declarator, decl,
template_count, 2 * (funcdef_flag != 0) + 4); template_count, 2 * (funcdef_flag != 0) + 4);
if (decl == error_mark_node) if (decl == error_mark_node)
...@@ -11053,7 +11057,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11053,7 +11057,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
} }
if (t && funcdef_flag) if (t && funcdef_flag)
return t; return t;
return void_type_node; return void_type_node;
} }
} }
...@@ -11068,11 +11072,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11068,11 +11072,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
{ {
/* An attempt is being made to initialize a non-static /* An attempt is being made to initialize a non-static
member. But, from [class.mem]: member. But, from [class.mem]:
4 A member-declarator can contain a 4 A member-declarator can contain a
constant-initializer only if it declares a static constant-initializer only if it declares a static
member (_class.static_) of integral or enumeration member (_class.static_) of integral or enumeration
type, see _class.static.data_. type, see _class.static.data_.
This used to be relatively common practice, but This used to be relatively common practice, but
the rest of the compiler does not correctly the rest of the compiler does not correctly
...@@ -11160,7 +11164,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11160,7 +11164,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
else else
pedwarn ("storage class `inline' invalid for function `%s' declared out of global scope", name); pedwarn ("storage class `inline' invalid for function `%s' declared out of global scope", name);
} }
if (ctype == NULL_TREE) if (ctype == NULL_TREE)
{ {
if (virtualp) if (virtualp)
...@@ -11181,7 +11185,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11181,7 +11185,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
decl = grokfndecl (ctype, type, original_name, declarator, decl = grokfndecl (ctype, type, original_name, declarator,
virtualp, flags, quals, raises, virtualp, flags, quals, raises,
1, friendp, 1, friendp,
publicp, inlinep, funcdef_flag, publicp, inlinep, funcdef_flag,
template_count, in_namespace); template_count, in_namespace);
if (decl == NULL_TREE) if (decl == NULL_TREE)
return NULL_TREE; return NULL_TREE;
...@@ -11216,9 +11220,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -11216,9 +11220,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
/* It's a variable. */ /* It's a variable. */
/* An uninitialized decl with `extern' is a reference. */ /* An uninitialized decl with `extern' is a reference. */
decl = grokvardecl (type, declarator, &specbits, decl = grokvardecl (type, declarator, &specbits,
initialized, initialized,
(type_quals & TYPE_QUAL_CONST) != 0, (type_quals & TYPE_QUAL_CONST) != 0,
in_namespace); in_namespace);
bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE, bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE,
inlinep, friendp, raises != NULL_TREE); inlinep, friendp, raises != NULL_TREE);
...@@ -11330,7 +11334,7 @@ int ...@@ -11330,7 +11334,7 @@ int
local_variable_p (t) local_variable_p (t)
tree t; tree t;
{ {
if ((TREE_CODE (t) == VAR_DECL if ((TREE_CODE (t) == VAR_DECL
/* A VAR_DECL with a context that is a _TYPE is a static data /* A VAR_DECL with a context that is a _TYPE is a static data
member. */ member. */
&& !TYPE_P (CP_DECL_CONTEXT (t)) && !TYPE_P (CP_DECL_CONTEXT (t))
...@@ -11364,7 +11368,7 @@ local_variable_p_walkfn (tp, walk_subtrees, data) ...@@ -11364,7 +11368,7 @@ local_variable_p_walkfn (tp, walk_subtrees, data)
int *walk_subtrees ATTRIBUTE_UNUSED; int *walk_subtrees ATTRIBUTE_UNUSED;
void *data ATTRIBUTE_UNUSED; void *data ATTRIBUTE_UNUSED;
{ {
return ((local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp)) return ((local_variable_p (*tp) && !DECL_ARTIFICIAL (*tp))
? *tp : NULL_TREE); ? *tp : NULL_TREE);
} }
...@@ -11402,7 +11406,7 @@ check_default_argument (decl, arg) ...@@ -11402,7 +11406,7 @@ check_default_argument (decl, arg)
else else
decl_type = TREE_TYPE (decl); decl_type = TREE_TYPE (decl);
if (arg == error_mark_node if (arg == error_mark_node
|| decl == error_mark_node || decl == error_mark_node
|| TREE_TYPE (arg) == error_mark_node || TREE_TYPE (arg) == error_mark_node
|| decl_type == error_mark_node) || decl_type == error_mark_node)
...@@ -11411,14 +11415,14 @@ check_default_argument (decl, arg) ...@@ -11411,14 +11415,14 @@ check_default_argument (decl, arg)
return error_mark_node; return error_mark_node;
/* [dcl.fct.default] /* [dcl.fct.default]
A default argument expression is implicitly converted to the A default argument expression is implicitly converted to the
parameter type. */ parameter type. */
if (!TREE_TYPE (arg) if (!TREE_TYPE (arg)
|| !can_convert_arg (decl_type, TREE_TYPE (arg), arg)) || !can_convert_arg (decl_type, TREE_TYPE (arg), arg))
{ {
if (decl) if (decl)
cp_error ("default argument for `%#D' has type `%T'", cp_error ("default argument for `%#D' has type `%T'",
decl, TREE_TYPE (arg)); decl, TREE_TYPE (arg));
else else
cp_error ("default argument for parameter of type `%T' has type `%T'", cp_error ("default argument for parameter of type `%T' has type `%T'",
...@@ -11430,7 +11434,7 @@ check_default_argument (decl, arg) ...@@ -11430,7 +11434,7 @@ check_default_argument (decl, arg)
/* [dcl.fct.default] /* [dcl.fct.default]
Local variables shall not be used in default argument Local variables shall not be used in default argument
expressions. expressions.
The keyword `this' shall not be used in a default argument of a The keyword `this' shall not be used in a default argument of a
member function. */ member function. */
...@@ -11521,7 +11525,7 @@ grokparms (first_parm, funcdef_flag) ...@@ -11521,7 +11525,7 @@ grokparms (first_parm, funcdef_flag)
chain = TREE_CHAIN (parm); chain = TREE_CHAIN (parm);
/* @@ weak defense against parse errors. */ /* @@ weak defense against parse errors. */
if (TREE_CODE (decl) != VOID_TYPE if (TREE_CODE (decl) != VOID_TYPE
&& TREE_CODE (decl) != TREE_LIST) && TREE_CODE (decl) != TREE_LIST)
{ {
/* Give various messages as the need arises. */ /* Give various messages as the need arises. */
...@@ -11738,7 +11742,7 @@ grok_ctor_properties (ctype, decl) ...@@ -11738,7 +11742,7 @@ grok_ctor_properties (ctype, decl)
A declaration of a constructor for a class X is ill-formed if its A declaration of a constructor for a class X is ill-formed if its
first parameter is of type (optionally cv-qualified) X and either first parameter is of type (optionally cv-qualified) X and either
there are no other parameters or else all other parameters have there are no other parameters or else all other parameters have
default arguments. default arguments.
We *don't* complain about member template instantiations that We *don't* complain about member template instantiations that
have this form, though; they can occur as we try to decide what have this form, though; they can occur as we try to decide what
...@@ -11843,7 +11847,7 @@ grok_op_properties (decl, virtualp, friendp) ...@@ -11843,7 +11847,7 @@ grok_op_properties (decl, virtualp, friendp)
doesn't look at the class declaration to find out if it's static. */ doesn't look at the class declaration to find out if it's static. */
if (methodp) if (methodp)
revert_static_member_fn (&decl, NULL, NULL); revert_static_member_fn (&decl, NULL, NULL);
/* Take care of function decl if we had syntax errors. */ /* Take care of function decl if we had syntax errors. */
if (argtypes == NULL_TREE) if (argtypes == NULL_TREE)
TREE_TYPE (decl) TREE_TYPE (decl)
...@@ -11858,7 +11862,7 @@ grok_op_properties (decl, virtualp, friendp) ...@@ -11858,7 +11862,7 @@ grok_op_properties (decl, virtualp, friendp)
{ {
if (methodp) if (methodp)
revert_static_member_fn (&decl, NULL, NULL); revert_static_member_fn (&decl, NULL, NULL);
if (argtypes == NULL_TREE) if (argtypes == NULL_TREE)
TREE_TYPE (decl) TREE_TYPE (decl)
= build_function_type (void_type_node, = build_function_type (void_type_node,
...@@ -11915,7 +11919,7 @@ grok_op_properties (decl, virtualp, friendp) ...@@ -11915,7 +11919,7 @@ grok_op_properties (decl, virtualp, friendp)
; ;
} }
} }
if (name == ansi_opname[(int) CALL_EXPR]) if (name == ansi_opname[(int) CALL_EXPR])
return; /* No restrictions on args. */ return; /* No restrictions on args. */
...@@ -11969,7 +11973,7 @@ grok_op_properties (decl, virtualp, friendp) ...@@ -11969,7 +11973,7 @@ grok_op_properties (decl, virtualp, friendp)
{ {
/* 13.4.0.3 */ /* 13.4.0.3 */
cp_error ("ANSI C++ prohibits overloading operator ?:"); cp_error ("ANSI C++ prohibits overloading operator ?:");
} }
else if (ambi_op_p (name)) else if (ambi_op_p (name))
{ {
if (list_length (argtypes) == 2) if (list_length (argtypes) == 2)
...@@ -12190,11 +12194,11 @@ xref_tag (code_type_node, name, globalize) ...@@ -12190,11 +12194,11 @@ xref_tag (code_type_node, name, globalize)
} }
else else
ref = lookup_tag (code, name, b, 0); ref = lookup_tag (code, name, b, 0);
if (! ref) if (! ref)
{ {
/* Try finding it as a type declaration. If that wins, /* Try finding it as a type declaration. If that wins,
use it. */ use it. */
ref = lookup_name (name, 1); ref = lookup_name (name, 1);
if (ref != NULL_TREE if (ref != NULL_TREE
...@@ -12212,9 +12216,9 @@ xref_tag (code_type_node, name, globalize) ...@@ -12212,9 +12216,9 @@ xref_tag (code_type_node, name, globalize)
ref = NULL_TREE; ref = NULL_TREE;
} }
if (ref && current_class_type if (ref && current_class_type
&& template_class_depth (current_class_type) && template_class_depth (current_class_type)
&& PROCESSING_REAL_TEMPLATE_DECL_P ()) && PROCESSING_REAL_TEMPLATE_DECL_P ())
{ {
/* Since GLOBALIZE is non-zero, we are not looking at a /* Since GLOBALIZE is non-zero, we are not looking at a
definition of this tag. Since, in addition, we are currently definition of this tag. Since, in addition, we are currently
...@@ -12303,7 +12307,7 @@ xref_tag (code_type_node, name, globalize) ...@@ -12303,7 +12307,7 @@ xref_tag (code_type_node, name, globalize)
else else
{ {
/* If it no longer looks like a nested type, make sure it's /* If it no longer looks like a nested type, make sure it's
in global scope. in global scope.
If it is not an IDENTIFIER, this is not a declaration */ If it is not an IDENTIFIER, this is not a declaration */
if (b->namespace_p && !class_binding_level if (b->namespace_p && !class_binding_level
&& TREE_CODE (name) == IDENTIFIER_NODE && TREE_CODE (name) == IDENTIFIER_NODE
...@@ -12444,7 +12448,7 @@ xref_basetypes (code_type_node, name, ref, binfo) ...@@ -12444,7 +12448,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
} }
if (TYPE_FOR_JAVA (basetype) if (TYPE_FOR_JAVA (basetype)
&& (current_lang_stack && (current_lang_stack
== &VARRAY_TREE (current_lang_base, 0))) == &VARRAY_TREE (current_lang_base, 0)))
TYPE_FOR_JAVA (ref) = 1; TYPE_FOR_JAVA (ref) = 1;
...@@ -12455,14 +12459,14 @@ xref_basetypes (code_type_node, name, ref, binfo) ...@@ -12455,14 +12459,14 @@ xref_basetypes (code_type_node, name, ref, binfo)
derived classes. (Each BINFO record describing an derived classes. (Each BINFO record describing an
individual inheritance contains flags which say what individual inheritance contains flags which say what
the `accessibility' of that particular inheritance is.) */ the `accessibility' of that particular inheritance is.) */
base_binfo base_binfo
= make_binfo (integer_zero_node, basetype, = make_binfo (integer_zero_node, basetype,
CLASS_TYPE_P (basetype) CLASS_TYPE_P (basetype)
? TYPE_BINFO_VTABLE (basetype) : NULL_TREE, ? TYPE_BINFO_VTABLE (basetype) : NULL_TREE,
CLASS_TYPE_P (basetype) CLASS_TYPE_P (basetype)
? TYPE_BINFO_VIRTUALS (basetype) : NULL_TREE); ? TYPE_BINFO_VIRTUALS (basetype) : NULL_TREE);
TREE_VEC_ELT (binfos, i) = base_binfo; TREE_VEC_ELT (binfos, i) = base_binfo;
TREE_VIA_PUBLIC (base_binfo) = via_public; TREE_VIA_PUBLIC (base_binfo) = via_public;
TREE_VIA_PROTECTED (base_binfo) = via_protected; TREE_VIA_PROTECTED (base_binfo) = via_protected;
...@@ -12490,12 +12494,12 @@ xref_basetypes (code_type_node, name, ref, binfo) ...@@ -12490,12 +12494,12 @@ xref_basetypes (code_type_node, name, ref, binfo)
TYPE_GETS_NEW (ref) |= TYPE_GETS_NEW (basetype); TYPE_GETS_NEW (ref) |= TYPE_GETS_NEW (basetype);
TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype); TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype);
/* If the base-class uses multiple inheritance, so do we. */ /* If the base-class uses multiple inheritance, so do we. */
TYPE_USES_MULTIPLE_INHERITANCE (ref) TYPE_USES_MULTIPLE_INHERITANCE (ref)
|= TYPE_USES_MULTIPLE_INHERITANCE (basetype); |= TYPE_USES_MULTIPLE_INHERITANCE (basetype);
/* Likewise, if converting to a base of the base may require /* Likewise, if converting to a base of the base may require
code, then we may need to generate code to convert to a code, then we may need to generate code to convert to a
base as well. */ base as well. */
TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref) TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (ref)
|= TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype); |= TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (basetype);
} }
...@@ -12524,7 +12528,7 @@ xref_basetypes (code_type_node, name, ref, binfo) ...@@ -12524,7 +12528,7 @@ xref_basetypes (code_type_node, name, ref, binfo)
bases. */ bases. */
get_vbase_types (ref); get_vbase_types (ref);
} }
/* Begin compiling the definition of an enumeration type. /* Begin compiling the definition of an enumeration type.
NAME is its name (or null if anonymous). NAME is its name (or null if anonymous).
...@@ -12614,7 +12618,7 @@ finish_enum (enumtype) ...@@ -12614,7 +12618,7 @@ finish_enum (enumtype)
reason to do that when processing_template_decl. reason to do that when processing_template_decl.
And, if the expression is something like a And, if the expression is something like a
TEMPLATE_PARM_INDEX or a CAST_EXPR doing so will TEMPLATE_PARM_INDEX or a CAST_EXPR doing so will
wreak havoc on the intended type of the expression. wreak havoc on the intended type of the expression.
Of course, there's also no point in trying to compute Of course, there's also no point in trying to compute
minimum or maximum values if we're in a template. */ minimum or maximum values if we're in a template. */
...@@ -12628,7 +12632,7 @@ finish_enum (enumtype) ...@@ -12628,7 +12632,7 @@ finish_enum (enumtype)
minnode = value; minnode = value;
} }
if (processing_template_decl) if (processing_template_decl)
/* If this is just a template, leave the CONST_DECL /* If this is just a template, leave the CONST_DECL
alone. That way tsubst_copy will find CONST_DECLs for alone. That way tsubst_copy will find CONST_DECLs for
CONST_DECLs, and not INTEGER_CSTs. */ CONST_DECLs, and not INTEGER_CSTs. */
...@@ -12670,7 +12674,7 @@ finish_enum (enumtype) ...@@ -12670,7 +12674,7 @@ finish_enum (enumtype)
if (flag_short_enums || (precision > TYPE_PRECISION (integer_type_node))) if (flag_short_enums || (precision > TYPE_PRECISION (integer_type_node)))
/* Use the width of the narrowest normal C type which is wide /* Use the width of the narrowest normal C type which is wide
enough. */ enough. */
TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size
(precision, 1)); (precision, 1));
else else
...@@ -12678,7 +12682,7 @@ finish_enum (enumtype) ...@@ -12678,7 +12682,7 @@ finish_enum (enumtype)
TYPE_SIZE (enumtype) = 0; TYPE_SIZE (enumtype) = 0;
layout_type (enumtype); layout_type (enumtype);
/* Fix up all variant types of this enum type. */ /* Fix up all variant types of this enum type. */
for (tem = TYPE_MAIN_VARIANT (enumtype); tem; for (tem = TYPE_MAIN_VARIANT (enumtype); tem;
tem = TYPE_NEXT_VARIANT (tem)) tem = TYPE_NEXT_VARIANT (tem))
...@@ -12754,7 +12758,7 @@ build_enumerator (name, value, enumtype) ...@@ -12754,7 +12758,7 @@ build_enumerator (name, value, enumtype)
prev_value, prev_value,
integer_one_node, integer_one_node,
PLUS_EXPR); PLUS_EXPR);
if (tree_int_cst_lt (value, prev_value)) if (tree_int_cst_lt (value, prev_value))
cp_error ("overflow in enumeration values at `%D'", name); cp_error ("overflow in enumeration values at `%D'", name);
} }
...@@ -12861,7 +12865,7 @@ check_function_type (decl) ...@@ -12861,7 +12865,7 @@ check_function_type (decl)
TREE_TYPE (decl) TREE_TYPE (decl)
= build_function_type (void_type_node, = build_function_type (void_type_node,
TYPE_ARG_TYPES (TREE_TYPE (decl))); TYPE_ARG_TYPES (TREE_TYPE (decl)));
TREE_TYPE (decl) TREE_TYPE (decl)
= build_exception_variant (fntype, = build_exception_variant (fntype,
TYPE_RAISES_EXCEPTIONS (fntype)); TYPE_RAISES_EXCEPTIONS (fntype));
} }
...@@ -12879,8 +12883,8 @@ check_function_type (decl) ...@@ -12879,8 +12883,8 @@ check_function_type (decl)
process and that DECLSPECS should be ignored), SF_INCLASS_INLINE process and that DECLSPECS should be ignored), SF_INCLASS_INLINE
indicating that the function is an inline defined in-class, and indicating that the function is an inline defined in-class, and
SF_EXPAND indicating that we should generate RTL for this SF_EXPAND indicating that we should generate RTL for this
function. function.
This function creates a binding context for the function body This function creates a binding context for the function body
as well as setting up the FUNCTION_DECL in current_function_decl. as well as setting up the FUNCTION_DECL in current_function_decl.
...@@ -12983,7 +12987,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -12983,7 +12987,7 @@ start_function (declspecs, declarator, attrs, flags)
} }
} }
} }
/* Sometimes we don't notice that a function is a static member, and /* Sometimes we don't notice that a function is a static member, and
build a METHOD_TYPE for it. Fix that up now. */ build a METHOD_TYPE for it. Fix that up now. */
if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1) if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1)
...@@ -13030,7 +13034,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13030,7 +13034,7 @@ start_function (declspecs, declarator, attrs, flags)
#ifdef SET_DEFAULT_DECL_ATTRIBUTES #ifdef SET_DEFAULT_DECL_ATTRIBUTES
SET_DEFAULT_DECL_ATTRIBUTES (decl1, attrs); SET_DEFAULT_DECL_ATTRIBUTES (decl1, attrs);
#endif #endif
/* This function exists in static storage. /* This function exists in static storage.
(This does not mean `static' in the C sense!) */ (This does not mean `static' in the C sense!) */
TREE_STATIC (decl1) = 1; TREE_STATIC (decl1) = 1;
...@@ -13064,8 +13068,8 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13064,8 +13068,8 @@ start_function (declspecs, declarator, attrs, flags)
{ {
DECL_RESULT (decl1) DECL_RESULT (decl1)
= build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype)); = build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (restype));
c_apply_type_quals_to_decl (CP_TYPE_QUALS (restype), c_apply_type_quals_to_decl (CP_TYPE_QUALS (restype),
DECL_RESULT (decl1)); DECL_RESULT (decl1));
} }
} }
else else
...@@ -13102,7 +13106,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13102,7 +13106,7 @@ start_function (declspecs, declarator, attrs, flags)
if (!processing_template_decl && !(flags & SF_PRE_PARSED)) if (!processing_template_decl && !(flags & SF_PRE_PARSED))
{ {
/* A specialization is not used to guide overload resolution. */ /* A specialization is not used to guide overload resolution. */
if ((flag_guiding_decls if ((flag_guiding_decls
|| !DECL_TEMPLATE_SPECIALIZATION (decl1)) || !DECL_TEMPLATE_SPECIALIZATION (decl1))
&& ! DECL_FUNCTION_MEMBER_P (decl1)) && ! DECL_FUNCTION_MEMBER_P (decl1))
decl1 = pushdecl (decl1); decl1 = pushdecl (decl1);
...@@ -13151,13 +13155,13 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13151,13 +13155,13 @@ start_function (declspecs, declarator, attrs, flags)
never get us to that point. Here we keep the consistency never get us to that point. Here we keep the consistency
between `current_class_type' and `current_class_ptr'. */ between `current_class_type' and `current_class_ptr'. */
tree t = DECL_ARGUMENTS (decl1); tree t = DECL_ARGUMENTS (decl1);
my_friendly_assert (t != NULL_TREE && TREE_CODE (t) == PARM_DECL, my_friendly_assert (t != NULL_TREE && TREE_CODE (t) == PARM_DECL,
162); 162);
my_friendly_assert (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE, my_friendly_assert (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE,
19990811); 19990811);
cp_function_chain->x_current_class_ref cp_function_chain->x_current_class_ref
= build_indirect_ref (t, NULL_PTR); = build_indirect_ref (t, NULL_PTR);
cp_function_chain->x_current_class_ptr = t; cp_function_chain->x_current_class_ptr = t;
...@@ -13180,7 +13184,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13180,7 +13184,7 @@ start_function (declspecs, declarator, attrs, flags)
if (DECL_NOT_REALLY_EXTERN (decl1)) if (DECL_NOT_REALLY_EXTERN (decl1))
DECL_EXTERNAL (decl1) = 0; DECL_EXTERNAL (decl1) = 0;
if (ctx != NULL_TREE && DECL_THIS_INLINE (ctx) if (ctx != NULL_TREE && DECL_THIS_INLINE (ctx)
&& TREE_PUBLIC (ctx)) && TREE_PUBLIC (ctx))
/* This is a function in a local class in an extern inline /* This is a function in a local class in an extern inline
function. */ function. */
...@@ -13246,7 +13250,7 @@ start_function (declspecs, declarator, attrs, flags) ...@@ -13246,7 +13250,7 @@ start_function (declspecs, declarator, attrs, flags)
if (attrs) if (attrs)
cplus_decl_attributes (decl1, NULL_TREE, attrs); cplus_decl_attributes (decl1, NULL_TREE, attrs);
if (!building_stmt_tree ()) if (!building_stmt_tree ())
{ {
GNU_xref_function (decl1, current_function_parms); GNU_xref_function (decl1, current_function_parms);
...@@ -13353,7 +13357,7 @@ store_parm_decls () ...@@ -13353,7 +13357,7 @@ store_parm_decls ()
if (doing_semantic_analysis_p ()) if (doing_semantic_analysis_p ())
{ {
tree cleanup; tree cleanup;
if (DECL_NAME (parm) == NULL_TREE if (DECL_NAME (parm) == NULL_TREE
|| TREE_CODE (parm) != VOID_TYPE) || TREE_CODE (parm) != VOID_TYPE)
pushdecl (parm); pushdecl (parm);
...@@ -13361,7 +13365,7 @@ store_parm_decls () ...@@ -13361,7 +13365,7 @@ store_parm_decls ()
cp_error ("parameter `%D' declared void", parm); cp_error ("parameter `%D' declared void", parm);
cleanup = maybe_build_cleanup (parm); cleanup = maybe_build_cleanup (parm);
if (cleanup) if (cleanup)
cleanups = tree_cons (parm, cleanup, cleanups); cleanups = tree_cons (parm, cleanup, cleanups);
} }
...@@ -13414,7 +13418,7 @@ store_parm_decls () ...@@ -13414,7 +13418,7 @@ store_parm_decls ()
should not be called before the parm can be used. */ should not be called before the parm can be used. */
while (cleanups) while (cleanups)
{ {
finish_decl_cleanup (TREE_PURPOSE (cleanups), finish_decl_cleanup (TREE_PURPOSE (cleanups),
TREE_VALUE (cleanups)); TREE_VALUE (cleanups));
cleanups = TREE_CHAIN (cleanups); cleanups = TREE_CHAIN (cleanups);
} }
...@@ -13430,8 +13434,8 @@ store_parm_decls () ...@@ -13430,8 +13434,8 @@ store_parm_decls ()
} }
/* Do the starting of the exception specifications, if we have any. */ /* Do the starting of the exception specifications, if we have any. */
if (flag_exceptions && !processing_template_decl if (flag_exceptions && !processing_template_decl
&& building_stmt_tree () && building_stmt_tree ()
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl))) && TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
current_eh_spec_try_block = expand_start_eh_spec (); current_eh_spec_try_block = expand_start_eh_spec ();
} }
...@@ -13474,9 +13478,9 @@ save_function_data (decl) ...@@ -13474,9 +13478,9 @@ save_function_data (decl)
get it back when we really expand this function. */ get it back when we really expand this function. */
my_friendly_assert (!DECL_PENDING_INLINE_P (decl), my_friendly_assert (!DECL_PENDING_INLINE_P (decl),
19990908); 19990908);
/* Make a copy. */ /* Make a copy. */
f = ((struct language_function *) f = ((struct language_function *)
xmalloc (sizeof (struct language_function))); xmalloc (sizeof (struct language_function)));
bcopy ((char *) cp_function_chain, (char *) f, bcopy ((char *) cp_function_chain, (char *) f,
sizeof (struct language_function)); sizeof (struct language_function));
...@@ -13555,9 +13559,9 @@ finish_destructor_body () ...@@ -13555,9 +13559,9 @@ finish_destructor_body ()
in_charge = current_in_charge_parm; in_charge = current_in_charge_parm;
exprstmt = build_delete (current_class_type, exprstmt = build_delete (current_class_type,
current_class_ref, current_class_ref,
in_charge, in_charge,
LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL, LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_NORMAL,
0); 0);
if (exprstmt != error_mark_node if (exprstmt != error_mark_node
...@@ -13576,7 +13580,7 @@ finish_destructor_body () ...@@ -13576,7 +13580,7 @@ finish_destructor_body ()
tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type))); tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type)));
tree if_stmt = begin_if_stmt (); tree if_stmt = begin_if_stmt ();
finish_if_stmt_cond (build (BIT_AND_EXPR, integer_type_node, finish_if_stmt_cond (build (BIT_AND_EXPR, integer_type_node,
current_in_charge_parm, current_in_charge_parm,
integer_two_node), integer_two_node),
if_stmt); if_stmt);
...@@ -13599,16 +13603,16 @@ finish_destructor_body () ...@@ -13599,16 +13603,16 @@ finish_destructor_body ()
finish_if_stmt (); finish_if_stmt ();
} }
} }
virtual_size = c_sizeof (current_class_type); virtual_size = c_sizeof (current_class_type);
/* At the end, call delete if that's what's requested. */ /* At the end, call delete if that's what's requested. */
/* FDIS sez: At the point of definition of a virtual destructor /* FDIS sez: At the point of definition of a virtual destructor
(including an implicit definition), non-placement operator delete (including an implicit definition), non-placement operator delete
shall be looked up in the scope of the destructor's class and if shall be looked up in the scope of the destructor's class and if
found shall be accessible and unambiguous. found shall be accessible and unambiguous.
This is somewhat unclear, but I take it to mean that if the class This is somewhat unclear, but I take it to mean that if the class
only defines placement deletes we don't do anything here. So we only defines placement deletes we don't do anything here. So we
pass LOOKUP_SPECULATIVELY; delete_sanity will complain for us if pass LOOKUP_SPECULATIVELY; delete_sanity will complain for us if
...@@ -13643,8 +13647,8 @@ finish_destructor_body () ...@@ -13643,8 +13647,8 @@ finish_destructor_body ()
This is called after parsing the body of the function definition. This is called after parsing the body of the function definition.
LINENO is the current line number. LINENO is the current line number.
FLAGS is a bitwise or of the following values: FLAGS is a bitwise or of the following values:
1 - CALL_POPLEVEL 1 - CALL_POPLEVEL
An extra call to poplevel (and expand_end_bindings) must be An extra call to poplevel (and expand_end_bindings) must be
made to take care of the binding contour for the base made to take care of the binding contour for the base
initializers. This is only relevant for constructors. initializers. This is only relevant for constructors.
...@@ -13709,7 +13713,7 @@ finish_function (lineno, flags) ...@@ -13709,7 +13713,7 @@ finish_function (lineno, flags)
/* Finish dealing with exception specifiers. */ /* Finish dealing with exception specifiers. */
if (flag_exceptions && !processing_template_decl if (flag_exceptions && !processing_template_decl
&& TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl))) && TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl)))
expand_end_eh_spec (TYPE_RAISES_EXCEPTIONS expand_end_eh_spec (TYPE_RAISES_EXCEPTIONS
(TREE_TYPE (current_function_decl)), (TREE_TYPE (current_function_decl)),
current_eh_spec_try_block); current_eh_spec_try_block);
} }
...@@ -13760,7 +13764,7 @@ finish_function (lineno, flags) ...@@ -13760,7 +13764,7 @@ finish_function (lineno, flags)
/* If this function is supposed to return a value, ensure that /* If this function is supposed to return a value, ensure that
we do not fall into the cleanups by mistake. The end of our we do not fall into the cleanups by mistake. The end of our
function will look like this: function will look like this:
user code (may have return stmt somewhere) user code (may have return stmt somewhere)
goto no_return_label goto no_return_label
cleanup_label: cleanup_label:
...@@ -13770,7 +13774,7 @@ finish_function (lineno, flags) ...@@ -13770,7 +13774,7 @@ finish_function (lineno, flags)
NOTE_INSN_FUNCTION_END NOTE_INSN_FUNCTION_END
return_label: return_label:
things for return things for return
If the user omits a return stmt in the USER CODE section, we If the user omits a return stmt in the USER CODE section, we
will have a control path which reaches NOTE_INSN_FUNCTION_END. will have a control path which reaches NOTE_INSN_FUNCTION_END.
Otherwise, we won't. */ Otherwise, we won't. */
...@@ -13825,7 +13829,7 @@ finish_function (lineno, flags) ...@@ -13825,7 +13829,7 @@ finish_function (lineno, flags)
maybe_end_member_template_processing decides to pop all the maybe_end_member_template_processing decides to pop all the
template parameters. */ template parameters. */
expand_p = !building_stmt_tree (); expand_p = !building_stmt_tree ();
/* If we're saving up tree structure, tie off the function now. */ /* If we're saving up tree structure, tie off the function now. */
if (!expand_p) if (!expand_p)
finish_stmt_tree (&DECL_SAVED_TREE (fndecl)); finish_stmt_tree (&DECL_SAVED_TREE (fndecl));
...@@ -14067,7 +14071,7 @@ start_method (declspecs, declarator, attrlist) ...@@ -14067,7 +14071,7 @@ start_method (declspecs, declarator, attrlist)
{ {
if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type) if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type)
{ {
if (DECL_CONTEXT (fndecl) if (DECL_CONTEXT (fndecl)
&& TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL) && TREE_CODE( DECL_CONTEXT (fndecl)) != NAMESPACE_DECL)
cp_error ("`%D' is already defined in class %s", fndecl, cp_error ("`%D' is already defined in class %s", fndecl,
TYPE_NAME_STRING (DECL_CONTEXT (fndecl))); TYPE_NAME_STRING (DECL_CONTEXT (fndecl)));
...@@ -14114,7 +14118,7 @@ start_method (declspecs, declarator, attrlist) ...@@ -14114,7 +14118,7 @@ start_method (declspecs, declarator, attrlist)
/* Make a place for the parms */ /* Make a place for the parms */
pushlevel (0); pushlevel (0);
current_binding_level->parm_flag = 1; current_binding_level->parm_flag = 1;
DECL_IN_AGGR_P (fndecl) = 1; DECL_IN_AGGR_P (fndecl) = 1;
return fndecl; return fndecl;
} }
...@@ -14307,7 +14311,7 @@ cplus_expand_expr_stmt (exp) ...@@ -14307,7 +14311,7 @@ cplus_expand_expr_stmt (exp)
{ {
if (stmts_are_full_exprs_p) if (stmts_are_full_exprs_p)
exp = convert_to_void (exp, "statement"); exp = convert_to_void (exp, "statement");
#if 0 #if 0
/* We should do this eventually, but right now this causes regex.o from /* We should do this eventually, but right now this causes regex.o from
libg++ to miscompile, and tString to core dump. */ libg++ to miscompile, and tString to core dump. */
...@@ -14347,9 +14351,9 @@ revert_static_member_fn (decl, fn, argtypes) ...@@ -14347,9 +14351,9 @@ revert_static_member_fn (decl, fn, argtypes)
tree function = fn ? *fn : TREE_TYPE (*decl); tree function = fn ? *fn : TREE_TYPE (*decl);
tree args = argtypes ? *argtypes : TYPE_ARG_TYPES (function); tree args = argtypes ? *argtypes : TYPE_ARG_TYPES (function);
if (CP_TYPE_QUALS (TREE_TYPE (TREE_VALUE (args))) if (CP_TYPE_QUALS (TREE_TYPE (TREE_VALUE (args)))
!= TYPE_UNQUALIFIED) != TYPE_UNQUALIFIED)
cp_error ("static member function `%#D' declared with type qualifiers", cp_error ("static member function `%#D' declared with type qualifiers",
*decl); *decl);
args = TREE_CHAIN (args); args = TREE_CHAIN (args);
...@@ -14367,15 +14371,15 @@ revert_static_member_fn (decl, fn, argtypes) ...@@ -14367,15 +14371,15 @@ revert_static_member_fn (decl, fn, argtypes)
*argtypes = args; *argtypes = args;
} }
/* Initialize the variables used during compilation of a C++ /* Initialize the variables used during compilation of a C++
function. */ function. */
static void static void
push_cp_function_context (f) push_cp_function_context (f)
struct function *f; struct function *f;
{ {
struct language_function *p struct language_function *p
= ((struct language_function *) = ((struct language_function *)
xcalloc (1, sizeof (struct language_function))); xcalloc (1, sizeof (struct language_function)));
f->language = p; f->language = p;
...@@ -14513,7 +14517,7 @@ lang_mark_tree (t) ...@@ -14513,7 +14517,7 @@ lang_mark_tree (t)
{ {
struct lang_type *lt = TYPE_LANG_SPECIFIC (t); struct lang_type *lt = TYPE_LANG_SPECIFIC (t);
if (lt && !(TREE_CODE (t) == POINTER_TYPE if (lt && !(TREE_CODE (t) == POINTER_TYPE
&& TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE)) && TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE))
{ {
ggc_mark (lt); ggc_mark (lt);
...@@ -14535,4 +14539,3 @@ lang_mark_tree (t) ...@@ -14535,4 +14539,3 @@ lang_mark_tree (t)
ggc_mark_tree ((tree) lt); ggc_mark_tree ((tree) lt);
} }
} }
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