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