aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>1999-01-25 19:50:29 -0500
committerJason Merrill <jason@gcc.gnu.org>1999-01-25 19:50:29 -0500
commita06d48ef02e4328a8aa8de2441cb86bf3fb73a64 (patch)
treecc45380b3dbb54f5294910cb9c428b52dcca69f5
parent9602dbfbf43612466a24ed90a876dcc7aba1d465 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/cp/decl.c37
-rw-r--r--gcc/cp/typeck.c2
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))