if (list)
{
stmt_list_cache = TREE_CHAIN (list);
+ gcc_assert (stmt_list_cache != list);
memset (list, 0, sizeof(struct tree_common));
TREE_SET_CODE (list, STATEMENT_LIST);
}
{
gcc_assert (!STATEMENT_LIST_HEAD (t));
gcc_assert (!STATEMENT_LIST_TAIL (t));
+ /* If this triggers, it's a sign that the same list is being freed
+ twice. */
+ gcc_assert (t != stmt_list_cache || stmt_list_cache == NULL);
TREE_CHAIN (t) = stmt_list_cache;
stmt_list_cache = t;
}
}
else
{
- gcc_assert (!STATEMENT_LIST_TAIL (i->container));
- STATEMENT_LIST_HEAD (i->container) = head;
+ head->prev = STATEMENT_LIST_TAIL (i->container);
+ if (head->prev)
+ head->prev->next = head;
+ else
+ STATEMENT_LIST_HEAD (i->container) = head;
STATEMENT_LIST_TAIL (i->container) = tail;
}
i->ptr = tail;
break;
case TSI_SAME_STMT:
- gcc_assert (cur);
break;
}
}
STATEMENT_LIST_TAIL (new_sl) = STATEMENT_LIST_TAIL (old_sl);
STATEMENT_LIST_TAIL (old_sl) = prev;
cur->prev = NULL;
- prev->next = NULL;
+ if (prev)
+ prev->next = NULL;
return new_sl;
}
return expr;
}
-/* If EXPR is a single statement, naked or in a STATEMENT_LIST, then
- return it. Otherwise return NULL. */
+/* If EXPR is a single statement return it. If EXPR is a
+ STATEMENT_LIST containing exactly one statement S, return S.
+ Otherwise, return NULL. */
tree
expr_only (tree expr)