diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-03 23:07:43 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-08-03 23:07:43 +0000 |
commit | 6a50ae279b825059836c4197aa60d7a9fefa51e9 (patch) | |
tree | d52d0d24a56ac71f5c913dcfebee9f4622a244a8 /gcc/extend.texi | |
parent | 254aa3380d9e92cde8ebb6301493a0864279a62f (diff) | |
download | gcc-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.texi | 43 |
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 |