[doc PATCH] update attribute docs for C++

Sandra Loosemore sandra@codesourcery.com
Tue Dec 4 07:10:00 GMT 2018


On 12/3/18 4:23 PM, Martin Sebor wrote:
> 
> gcc/ChangeLog:
> 
> 	* doc/extend.texi (attribute const, pure): Clarify.
> 
> Index: gcc/doc/extend.texi
> ===================================================================
> --- gcc/doc/extend.texi	(revision 266766)
> +++ gcc/doc/extend.texi	(working copy)
> @@ -2276,12 +2276,13 @@ the enclosing block.
>  @cindex @code{volatile} applied to function
>  @cindex @code{const} applied to function
>  
> -In GNU C, you can use function attributes to declare certain things
> -about functions called in your program which help the compiler
> -optimize calls and check your code more carefully.  For example, you
> +In GNU C and C++, you can use function attributes to declare certain
> +function properties that may help the compiler optimize calls or
> +check code more carefully for correctness.  For example, you
>  can use attributes to declare that a function never returns
> -(@code{noreturn}), returns a value depending only on its arguments
> -(@code{pure}), or has @code{printf}-style arguments (@code{format}).
> +(@code{noreturn}), returns a value depending only on the values of
> +its arguments (@code{const}), or has @code{printf}-style arguments
> +(@code{format}).
>  
>  You can also use attributes to control memory placement, code
>  generation options or call/return conventions within the function
> @@ -2288,12 +2289,15 @@ generation options or call/return conventions with
>  being annotated.  Many of these attributes are target-specific.  For
>  example, many targets support attributes for defining interrupt
>  handler functions, which typically must follow special register usage
> -and return conventions.
> +and return conventions.  Such attributes are described in the subsection
> +for each target.  However, a considerable number of attributes are
> +supported by most, if not all targets.  Those are described in
> +the @ref{Common Function Attributes} section.
>  
>  Function attributes are introduced by the @code{__attribute__} keyword
> -on a declaration, followed by an attribute specification inside double
> -parentheses.  You can specify multiple attributes in a declaration by
> -separating them by commas within the double parentheses or by
> +on a declaration, followed by an attribute specification enclosed in
> +double parentheses.  You can specify multiple attributes in a declaration
> +by separating them by commas within the double parentheses or by
>  immediately following an attribute declaration with another attribute
>  declaration.  @xref{Attribute Syntax}, for the exact rules on attribute
>  syntax and placement.  Compatible attribute specifications on distinct
> @@ -2301,6 +2305,15 @@ declarations of the same function are merged.  An
>  that is not compatible with attributes already applied to a declaration
>  of the same function is ignored with a warning.
>  
> +Unless specified otherwise, function attributes that apply to function
> +parameters of pointer types also apply to the implicit C++ @code{this}
> +argument in non-constant member functions, and to parameters of reference

I'm confused by this.  Function attributes apply to functions, not 
parameters.  Even if they did apply to parameters, why the restriction 
against constant member functions?

> +type.  In attributes that refer to function parameters by their position
> +in the argument list the first pararameter is at position one.  In C++

s/pararameter/parameter

Again, I'm confused.  Is this about the format attribute?  It would be 
far less obscure to just move this explanation to the discussion of that 
attribute, because nobody trying to understand how the format attribute 
works would be able to tie this discussion in another section into it.

> +non-static member functions position one refers to the implicit @code{this}
> +pointer.  The same restrictions and effects apply to function attributes
> +used with ordinary functions or C++ member functions.
> +
>  GCC also supports attributes on
>  variable declarations (@pxref{Variable Attributes}),
>  labels (@pxref{Label Attributes}),
> @@ -6067,18 +6080,23 @@ when this attribute is present.
>  @cindex attribute of variables
>  @cindex variable attributes
>  
> -The keyword @code{__attribute__} allows you to specify special
> -attributes of variables or structure fields.  This keyword is followed
> -by an attribute specification inside double parentheses.  Some
> -attributes are currently defined generically for variables.
> -Other attributes are defined for variables on particular target
> -systems.  Other attributes are available for functions
> -(@pxref{Function Attributes}), labels (@pxref{Label Attributes}),
> +The keyword @code{__attribute__} allows you to specify special properties
> +of variables, function parameters, or structure, union, and, in C++, class
> +members.  This @code{__attribute__} keyword is followed by an attribute
> +specification enclosed in double parentheses.  Some attributes are currently
> +defined generically for variables. Other attributes are defined for
> +variables on particular target systems.  Other attributes are available
> +for functions (@pxref{Function Attributes}), labels (@pxref{Label Attributes}),
>  enumerators (@pxref{Enumerator Attributes}), statements
>  (@pxref{Statement Attributes}), and for types (@pxref{Type Attributes}).
>  Other front ends might define more attributes
>  (@pxref{C++ Extensions,,Extensions to the C++ Language}).
>  
> +Unless specified otherwise, function attributes that apply to variables
> +or function parameters of pointer types also apply to the implicit C++ @code
> +{this} argument in non-constant member functions, and to arguments of reference

Please don't put a line break between the @code and its following "{".

> +type.
> +

Again, why are constant member functions special?  Do you really mean to 
say "non-static member functions" instead?

>  @xref{Attribute Syntax}, for details of the exact syntax for using
>  attributes.
>  
> @@ -7026,17 +7044,21 @@ placed in either the @code{.bss_below100} section
>  @cindex attribute of types
>  @cindex type attributes
>  
> -The keyword @code{__attribute__} allows you to specify special
> -attributes of types.  Some type attributes apply only to @code{struct}
> -and @code{union} types, while others can apply to any type defined
> -via a @code{typedef} declaration.  Other attributes are defined for
> -functions (@pxref{Function Attributes}), labels (@pxref{Label 
> -Attributes}), enumerators (@pxref{Enumerator Attributes}), 
> -statements (@pxref{Statement Attributes}), and for
> -variables (@pxref{Variable Attributes}).
> +The keyword @code{__attribute__} allows you to specify various special
> +properties of types.  Some type attributes apply only to structure and
> +and types, and in C++, also class types, while others can apply to any

s/structure and and types/structure and union types/

> +type defined via a @code{typedef} declaration.  Unless otherwise
> +specified, the same restrictions and effects apply to attributes regardless
> +of whether a type is a trivial structure or a C++ class with user-defined
> +constructors, destructors, or a copy assignment.

Why pick out constructors, destructors, and copy assignment?  Maybe you 
are trying to say "whether or not a class is a POD type"?
>  
> +Other attributes are defined for functions (@pxref{Function Attributes}),
> +labels (@pxref{Label  Attributes}), enumerators (@pxref{Enumerator
> +Attributes}), statements (@pxref{Statement Attributes}), and for variables
> +(@pxref{Variable Attributes}).
> +
>  The @code{__attribute__} keyword is followed by an attribute specification
> -inside double parentheses.  
> +eclosed in double parentheses.

s/eclosed/enclosed/

>  
>  You may specify type attributes in an enum, struct or union type
>  declaration or definition by placing them immediately after the

-Sandra



More information about the Gcc-patches mailing list