]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Update CLEANUP_POINT_EXPR docs.
authorJason Merrill <merrill@gnu.org>
Fri, 3 Mar 1995 03:45:02 +0000 (03:45 +0000)
committerJason Merrill <merrill@gnu.org>
Fri, 3 Mar 1995 03:45:02 +0000 (03:45 +0000)
From-SVN: r9118

gcc/tree.def

index 1338a73b65a36f6102645d86892a9a9ef96d19ac..453e28864828d6704781c25371962cf033ae4405 100644 (file)
@@ -444,8 +444,20 @@ DEFTREECODE (METHOD_CALL_EXPR, "method_call_expr", "e", 4)
 DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", "e", 3)
 
 /* Specify a cleanup point.
-   Operand 0 is the expression that has cleanups that we want ensure are
-   cleaned up.  */
+   Operand 0 is an expression that may have cleanups.  If it does, those
+   cleanups are executed after the expression is expanded.
+
+   Note that if the expression is a reference to storage, it is forced out
+   of memory before the cleanups are run.  This is necessary to handle
+   cases where the cleanups modify the storage referenced; in the
+   expression 't.i', if 't' is a struct with an integer member 'i' and a
+   cleanup which modifies 'i', the value of the expression depends on
+   whether the cleanup is run before or after 't.i' is evaluated.  When
+   expand_expr is run on 't.i', it returns a MEM.  This is not good enough;
+   the value of 't.i' must be forced out of memory.
+
+   As a consequence, the operand of a CLEANUP_POINT_EXPR must not have
+   BLKmode, because it will not be forced out of memory.  */
 DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", "e", 1)
 
 /* The following two codes are used in languages that have types where