diff options
author | Jason Merrill <jason@gcc.gnu.org> | 1999-01-25 19:50:29 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1999-01-25 19:50:29 -0500 |
commit | a06d48ef02e4328a8aa8de2441cb86bf3fb73a64 (patch) | |
tree | cc45380b3dbb54f5294910cb9c428b52dcca69f5 | |
parent | 9602dbfbf43612466a24ed90a876dcc7aba1d465 (diff) | |
download | gcc-a06d48ef02e4328a8aa8de2441cb86bf3fb73a64.zip gcc-a06d48ef02e4328a8aa8de2441cb86bf3fb73a64.tar.gz gcc-a06d48ef02e4328a8aa8de2441cb86bf3fb73a64.tar.bz2 |
decl.c (push_local_binding): Also wrap used decls in a TREE_LIST.
* 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.
Fixes 733Y14.
* typeck.c (build_reinterpret_cast): Fix typo in duplicated test.
From-SVN: r24867
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/decl.c | 37 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 2 |
3 files changed, 34 insertions, 15 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a379892..8015d38 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +1999-01-26 Jason Merrill <jason@yorick.cygnus.com> + + * 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 <rth@cygnus.com> + + * typeck.c (build_reinterpret_cast): Fix typo in duplicated test. + 1999-01-25 Jason Merrill <jason@yorick.cygnus.com> * class.c (resolve_address_of_overloaded_function): Mark the diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 927eec6..e3ed116 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 82ce514..58c19a4 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)) |