summaryrefslogtreecommitdiff
path: root/gcc/extend.texi
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-08-03 23:07:43 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-08-03 23:07:43 +0000
commit6a50ae279b825059836c4197aa60d7a9fefa51e9 (patch)
treed52d0d24a56ac71f5c913dcfebee9f4622a244a8 /gcc/extend.texi
parent254aa3380d9e92cde8ebb6301493a0864279a62f (diff)
downloadgcc-6a50ae279b825059836c4197aa60d7a9fefa51e9.tar.gz
ChangeLog
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35463 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/extend.texi')
-rw-r--r--gcc/extend.texi43
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/extend.texi b/gcc/extend.texi
index b590e21df65..ed4e75f9bfb 100644
--- a/gcc/extend.texi
+++ b/gcc/extend.texi
@@ -184,6 +184,49 @@ If you don't know the type of the operand, you can still do this, but you
must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming
Types}).
+Statement expressions are not supported fully in G++, and their fate
+there is unclear. (It is possible that they will become fully supported
+at some point, or that they will be deprecated, or that the bugs that
+are present will continue to exist indefinitely.) Presently, statement
+expressions do not work well as default arguments.
+
+In addition, there are semantic issues with statement-expressions in
+C++. If you try to use statement-expressions instead of inline
+functions in C++, you may be surprised at the way object destruction is
+handled. For example:
+
+@example
+#define foo(a) (@{int b = (a); b + 3; @})
+@end example
+
+@noindent
+does not work the same way as:
+
+@example
+inline int foo(a) @{ int b = a; return b + 3; @}
+@end example
+
+@noindent
+In particular, if the expression passed into @code{foo} involves the
+creation of temporaries, the destructors for those temporaries will be
+run earlier in the case of the macro than in the case of the function.
+
+These considerations mean that it is probably a bad idea to use
+statement-expressions of this form in header files that are designed to
+work with C++. Note that the GNU C Library does contain header files
+using statement-expressions, and that these definitions make the library
+technically non-conforming. For example, when optimization is turned
+on,
+
+@example
+string a, b;
+printf("%s", toupper((a+b).c_str()[0]));
+@end example
+
+@noindent
+will result in the destructor for the temporary created for @code{a+b}
+being run earlier than it should be.
+
@node Local Labels
@section Locally Declared Labels
@cindex local labels