Commit cd7ffd8a by Tom de Vries Committed by Tom de Vries

[doc] Note variable shadowing at max macro using statement expression

When suggesting to rewrite the unsafe (with respect to multiple evaluation of
arguments) macro definition:
...
  #define max(a,b) ((a) > (b) ? (a) : (b))
...
into the safe macro definition:
...
  #define maxint(a,b) \
    ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
...
mention the variable shadowing problem for:
...
  #define maxint3(a, b, c) \
    ({int _a = (a), _b = (b), _c = (c); maxint (maxint (_a, _b), _c); })
...

2019-04-11  Tom de Vries  <tdevries@suse.de>

	* doc/extend.texi (@node Statement Exprs): Note variable shadowing at
	max macro using statement expression.

From-SVN: r270287
parent 657184d0
2019-04-11 Tom de Vries <tdevries@suse.de>
* doc/extend.texi (@node Statement Exprs): Note variable shadowing at
max macro using statement expression.
2019-04-11 David Edelsohn <dje.gcc@gmail.com> 2019-04-11 David Edelsohn <dje.gcc@gmail.com>
* xcoffout.h (xcoff_private_rodata_section_name): Declare. * xcoffout.h (xcoff_private_rodata_section_name): Declare.
......
...@@ -142,14 +142,36 @@ follows: ...@@ -142,14 +142,36 @@ follows:
@cindex side effects, macro argument @cindex side effects, macro argument
But this definition computes either @var{a} or @var{b} twice, with bad But this definition computes either @var{a} or @var{b} twice, with bad
results if the operand has side effects. In GNU C, if you know the results if the operand has side effects. In GNU C, if you know the
type of the operands (here taken as @code{int}), you can define type of the operands (here taken as @code{int}), you can avoid this
the macro safely as follows: problem by defining the macro as follows:
@smallexample @smallexample
#define maxint(a,b) \ #define maxint(a,b) \
(@{int _a = (a), _b = (b); _a > _b ? _a : _b; @}) (@{int _a = (a), _b = (b); _a > _b ? _a : _b; @})
@end smallexample @end smallexample
Note that introducing variable declarations (as we do in @code{maxint}) can
cause variable shadowing, so while this example using the @code{max} macro
produces correct results:
@smallexample
int _a = 1, _b = 2, c;
c = max (_a, _b);
@end smallexample
@noindent
this example using maxint will not:
@smallexample
int _a = 1, _b = 2, c;
c = maxint (_a, _b);
@end smallexample
This problem may for instance occur when we use this pattern recursively, like
so:
@smallexample
#define maxint3(a, b, c) \
(@{int _a = (a), _b = (b), _c = (c); maxint (maxint (_a, _b), _c); @})
@end smallexample
Embedded statements are not allowed in constant expressions, such as Embedded statements are not allowed in constant expressions, such as
the value of an enumeration constant, the width of a bit-field, or the value of an enumeration constant, the width of a bit-field, or
the initial value of a static variable. the initial value of a static variable.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment