diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a3798926d6f..8015d38f2ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +1999-01-26 Jason Merrill + + * decl.c (push_local_binding): Also wrap used decls in a TREE_LIST. + (poplevel): Handle that. Fix logic for removing TREE_LISTs. + (cat_namespace_levels): Don't loop forever. + +1999-01-25 Richard Henderson + + * typeck.c (build_reinterpret_cast): Fix typo in duplicated test. + 1999-01-25 Jason Merrill * class.c (resolve_address_of_overloaded_function): Mark the diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 927eec61ccc..e3ed11635d4 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1126,18 +1126,20 @@ push_local_binding (id, decl) { tree d = decl; - if (TREE_CODE (decl) == OVERLOAD) - /* We must put the OVERLOAD into a TREE_LIST since the - TREE_CHAIN of an OVERLOAD is already used. */ - decl = build_tree_list (NULL_TREE, decl); - if (lookup_name_current_level (id)) /* Supplement the existing binding. */ - add_binding (id, decl); + add_binding (id, d); else /* Create a new binding. */ push_binding (id, d, current_binding_level); + if (TREE_CODE (decl) == OVERLOAD + || (DECL_P (decl) && DECL_NAMESPACE_SCOPE_P (decl))) + /* We must put the OVERLOAD into a TREE_LIST since the + TREE_CHAIN of an OVERLOAD is already used. Similarly for + decls that got here through a using-declaration. */ + decl = build_tree_list (NULL_TREE, decl); + /* And put DECL on the list of things declared by the current binding level. */ TREE_CHAIN (decl) = current_binding_level->names; @@ -1423,11 +1425,12 @@ poplevel (keep, reverse, functionbody) else { /* Remove the binding. */ + if (TREE_CODE (link) == TREE_LIST) + link = TREE_VALUE (link); if (TREE_CODE_CLASS (TREE_CODE (link)) == 'd') pop_binding (DECL_NAME (link), link); - else if (TREE_CODE (link) == TREE_LIST) - pop_binding (DECL_NAME (OVL_FUNCTION (TREE_VALUE (link))), - TREE_VALUE (link)); + else if (TREE_CODE (link) == OVERLOAD) + pop_binding (DECL_NAME (OVL_FUNCTION (link)), link); else my_friendly_abort (0); } @@ -1454,11 +1457,13 @@ poplevel (keep, reverse, functionbody) { tree* d; - for (d = &BLOCK_VARS (block); - *d; - d = *d ? &TREE_CHAIN (*d) : d) - if (TREE_CODE (*d) == TREE_LIST) - *d = TREE_CHAIN (*d); + for (d = &BLOCK_VARS (block); *d; ) + { + if (TREE_CODE (*d) == TREE_LIST) + *d = TREE_CHAIN (*d); + else + d = &TREE_CHAIN (*d); + } } /* If the level being exited is the top level of a function, @@ -2078,6 +2083,10 @@ cat_namespace_levels() /* The nested namespaces appear in the names list of their ancestors. */ for (current = last; current; current = TREE_CHAIN (current)) { + /* Catch simple infinite loops. */ + if (TREE_CHAIN (current) == current) + my_friendly_abort (990126); + if (TREE_CODE (current) != NAMESPACE_DECL || DECL_NAMESPACE_ALIAS (current)) continue; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 82ce5144fe2..58c19a42d0f 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5485,7 +5485,7 @@ build_reinterpret_cast (type, expr) return fold (build1 (NOP_EXPR, type, expr)); } else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype)) - || (TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))) + || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type))) { pedwarn ("ANSI C++ forbids casting between pointers to functions and objects"); if (TREE_READONLY_DECL_P (expr))