On Wed, 2 Apr 2025, Sandra Loosemore wrote: > Looking over the recently-committed change to the musttail attribute > documentation, it appears the comment in the last example was a paste-o, > as it does not agree with either what the similar example in the > -Wmaybe-musttail-local-addr documentation says, or the actual behavior > observed when running the code. > > In addition, the entire section on musttail was in need of copy-editing > to put it in the present tense, avoid reference to "the user", etc. I've > attempted to clean it up here.
LGTM > gcc/ChangeLog > * doc/extend.texi (Statement Attributes): Copy-edit the musttail > attribute documentation and correct the comment in the last > example. > --- > gcc/doc/extend.texi | 46 ++++++++++++++++++++++----------------------- > 1 file changed, 23 insertions(+), 23 deletions(-) > > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 4302df76c7f..16ad83fc510 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -9314,7 +9314,7 @@ The @code{gnu::musttail} or @code{clang::musttail} > standard attribute > or @code{musttail} GNU attribute can be applied to a @code{return} statement > with a return-value expression that is a function call. It asserts that the > call must be a tail call that does not allocate extra stack space, so it is > -safe to use tail recursion to implement long running loops. > +safe to use tail recursion to implement long-running loops. > > @smallexample > [[gnu::musttail]] return foo(); > @@ -9324,11 +9324,11 @@ safe to use tail recursion to implement long running > loops. > __attribute__((musttail)) return bar(); > @end smallexample > > -If the compiler cannot generate a @code{musttail} tail call it will report > -an error. On some targets tail calls may never be supported. > -The user asserts for @code{musttail} tail calls that lifetime of automatic > +If the compiler cannot generate a @code{musttail} tail call it reports > +an error. On some targets, tail calls may not be supported at all. > +The @code{musttail} attribute asserts that the lifetime of automatic > variables, function parameters and temporaries (unless they have non-trivial > -destruction) can end before the actual call instruction and that any access > +destruction) can end before the actual call instruction, and that any access > to those from inside of the called function results is considered undefined > behavior. Enabling @option{-O1} or @option{-O2} can improve the success of > tail calls. > @@ -9344,9 +9344,9 @@ baz (int *x) > if (*x == 1) > @{ > int a = 42; > - /* The call will be tail called (would not be without the > - attribute), dereferencing the pointer in the callee is > - undefined behavior and there will be a warning emitted > + /* The call is a tail call (would not be without the > + attribute). Dereferencing the pointer in the callee is > + undefined behavior, and there is a warning emitted > for this by default (@option{-Wmusttail-local-addr}). */ > [[gnu::musttail]] return foo (&a); > @} > @@ -9354,9 +9354,9 @@ baz (int *x) > @{ > int a = 42; > bar (&a); > - /* The call will be tail called (would not be without the > - attribute), if bar stores the pointer anywhere, dereferencing > - it in foo will be undefined behavior and there will be a warning > + /* The call is a tail call (would not be without the > + attribute). If bar stores the pointer anywhere, dereferencing > + it in foo is undefined behavior. There is a warning > emitted for this with @option{-Wextra}, which implies > @option{-Wmaybe-musttail-local-addr}. */ > [[gnu::musttail]] return foo (nullptr); > @@ -9365,8 +9365,8 @@ baz (int *x) > @{ > S s; > /* The s variable requires non-trivial destruction which ought > - to be performed after the foo call returns, so this will > - be rejected. */ > + to be performed after the foo call returns, so this is > + rejected. */ > [[gnu::musttail]] return foo (&s.s); > @} > @} > @@ -9374,9 +9374,9 @@ baz (int *x) > > To avoid the @option{-Wmaybe-musttail-local-addr} warning in the > above @code{*x == 2} case and similar code, consider defining the > -maybe escaped variables in a separate scope which will end before the > -return statement if possible to make it clear that the variable is not > -live during the call. So > +maybe-escaped variables in a separate scope that ends before the > +return statement, if that is possible, to make it clear that the > +variable is not live during the call. So: > > @smallexample > else if (*x == 2) > @@ -9385,17 +9385,17 @@ live during the call. So > int a = 42; > bar (&a); > @} > - /* The call will be tail called (would not be without the > - attribute), if bar stores the pointer anywhere, dereferencing > - it in foo will be undefined behavior and there will be a warning > - emitted for this with @option{-Wextra}, which implies > - @option{-Wmaybe-musttail-local-addr}. */ > + /* The call is a tail call (would not be without the > + attribute). If bar stores the pointer anywhere, dereferencing > + it in foo is undefined behavior even without tail call > + optimization, and there is no warning. */ > [[gnu::musttail]] return foo (nullptr); > @} > @end smallexample > > -in this case. That is not possible if it is function argument which > -is address taken because those are in scope for the whole function. > +It is not possible to avoid the warning in this way if the maybe-escaped > +variable is a function argument, because those are in scope > +for the whole function. > @end table > > @node Attribute Syntax > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)