Re: [doc,committed] clarify docs for function attribute "const"

2018-12-14 Thread Martin Sebor

On 12/13/18 7:07 PM, Sandra Loosemore wrote:

On 12/13/18 3:52 PM, Martin Sebor wrote:

Ping: https://gcc.gnu.org/ml/gcc-patches/2018-12/msg00426.html

(I have now committed the @code{const} cleanup mentioned below.)


This patch is OK except for one nit.


 @cindex pointer arguments
 Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}.  Likewise, a
-function that calls a non-@code{const} function usually must not be
-@code{const}.  Because a @code{const} function cannot have any side
-effects it does not make sense for such a function to return 
@code{void}.

-Declaring such a function is diagnosed.
+pointed to must @emph{not} be declared @code{const} if the pointed-to
+data might change between successive invocations of the function.  In
+general, since a function cannot distinguish data that might change
+from data that cannot, const functions should never be
+pass-by-reference (take pointer or, in C++, reference arguments).


I'd really rather avoid "pass-by-reference" since it adds nothing with 
the clarification about what it means there, too.  How about just:


...const functions should never take pointer or, in C++, reference 
arguments.


OK to commit with that fixed.


Committed in r267156.

Martin


Re: [doc,committed] clarify docs for function attribute "const"

2018-12-13 Thread Sandra Loosemore

On 12/13/18 3:52 PM, Martin Sebor wrote:

Ping: https://gcc.gnu.org/ml/gcc-patches/2018-12/msg00426.html

(I have now committed the @code{const} cleanup mentioned below.)


This patch is OK except for one nit.


 @cindex pointer arguments
 Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}.  Likewise, a
-function that calls a non-@code{const} function usually must not be
-@code{const}.  Because a @code{const} function cannot have any side
-effects it does not make sense for such a function to return @code{void}.
-Declaring such a function is diagnosed.
+pointed to must @emph{not} be declared @code{const} if the pointed-to
+data might change between successive invocations of the function.  In
+general, since a function cannot distinguish data that might change
+from data that cannot, const functions should never be
+pass-by-reference (take pointer or, in C++, reference arguments).


I'd really rather avoid "pass-by-reference" since it adds nothing with 
the clarification about what it means there, too.  How about just:


...const functions should never take pointer or, in C++, reference 
arguments.


OK to commit with that fixed.

-Sandra


Re: [doc,committed] clarify docs for function attribute "const"

2018-12-13 Thread Martin Sebor

Ping: https://gcc.gnu.org/ml/gcc-patches/2018-12/msg00426.html

(I have now committed the @code{const} cleanup mentioned below.)

On 12/6/18 6:12 PM, Martin Sebor wrote:

On 12/3/18 11:04 PM, Sandra Loosemore wrote:

On 12/3/18 2:47 PM, Martin Sebor wrote:

[snip]

Attached is my proposed update.  The user's email suggested going
into a lot of detail that I'm not sure would be helpful.  I think
it's safer to keep it simple than to try to carefully outline tricky
conditions under which some const or pure functions might get away
with modifying program state.  At the same time, I tried not to
outright prohibit it so I phrased the restrictions in terms of
observable program state (as opposed to reading or writing
"global" variables and such).

I also made a few other changes, like move the example of
the square function from pure to const (since the function is
much more likely const), and made the const restrictions stand
on their own, rather than depending on pure.



Index: /ssd/src/gcc/svn/gcc/doc/extend.texi
===
--- /ssd/src/gcc/svn/gcc/doc/extend.texi    (revision 266760)
+++ /ssd/src/gcc/svn/gcc/doc/extend.texi    (working copy)
@@ -2518,25 +2518,45 @@ are automatically detected and this attribute 
is i

 @item const
 @cindex @code{const} function attribute
 @cindex functions that have no side effects
-Many functions do not examine any values except their arguments, and
-have no effects except to return a value.  Calls to such functions lend
-themselves to optimization such as common subexpression elimination.
-The presence of the @code{const} attribute on a function declaration 
-allows GCC to emit more efficient code for some calls to the 
function. +Calls to functions whose return value is not affected by 
changes to

+the observable state of the program and that have no observable effects
+on such state other than to return a value may lend themselves to
+optimizations such as common subexpression elimination.  Declaring such
+functions with the @code{const} attribute allows GCC to emit more 
efficient

+code for consecutive calls to the function.


I don't think the calls have to be consecutive for GCC to emit more 
efficient code.  I'd kill that last bit.


I added it because I want to make it clear that the attribute
shouldn't be expected to improve the efficiency of any single
call.  It can only improve it for the second (and subsequent)
call with the same argument values as the first.  I've tweaked
the sentence a bit.




+The @code{const} attribute prohibits a function from reading objects
+that affect its return value between successive invocations.  However,
+functions declared with the attribute can safely read objects that do
+not affect their return value, such as non-volatile constants.
 The @code{const} attribute imposes greater restrictions on a function's
-definition than the similar @code{pure} attribute below because it
-additionally prohibits the function from reading memory except for
-constant global variables.  Decorating the same function with
-both the @code{const} and the @code{pure} attribute is diagnosed.
+definition than the similar @code{pure} attribute.  Declaring the same
+function with both the @code{const} and the @code{pure} attribute is
+diagnosed.  Because a const function cannot have any observable side


@code{const}


I actually meant to bring this up separately.

I don't think @code would be appropriate in this context.  It's
not a use of the attribute name but rather a description of
the function.  Analogous to "a const pointer" or "a volatile
access" vs "a @code{const}-qualified pointer or
"the @code{volatile} qualifier."  I think the manual already
uses this style, albeit not completely consistently.  The C
and C++ standards aren't 100% consistent either, but I believe
the editors follow this principle when they think of it.  Unless
you really do think GCC should go the other way around I would
like to add this to the GCC style guidelines and fix
the inconsistencies.

I thought I was consistent in this in my own changes but I see
I was not.  I've changed the @code{const} to just const according
to the above.


+effects it does not make sense for it to return @code{void}.  Declaring
+such a function is diagnosed.

+For example,
+
+@smallexample
+int square (int) __attribute__ ((const));
+@end smallexample
+
+@noindent
+tells GCC that subsequent calls to function @code{square} with the same
+argument value can be replaced by the result of the first call 
regardless

+of the statements in between.
+


I think it would be better to move this example immediately after the 
first paragraph, before you digress about the diagnostics and such like.


Done.




 @cindex pointer arguments
 Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}.  Likewise, a
-function that calls a non-@code{const} function usually must not be

Re: [doc,committed] clarify docs for function attribute "const"

2018-12-06 Thread Martin Sebor

On 12/3/18 11:04 PM, Sandra Loosemore wrote:

On 12/3/18 2:47 PM, Martin Sebor wrote:

[snip]

Attached is my proposed update.  The user's email suggested going
into a lot of detail that I'm not sure would be helpful.  I think
it's safer to keep it simple than to try to carefully outline tricky
conditions under which some const or pure functions might get away
with modifying program state.  At the same time, I tried not to
outright prohibit it so I phrased the restrictions in terms of
observable program state (as opposed to reading or writing
"global" variables and such).

I also made a few other changes, like move the example of
the square function from pure to const (since the function is
much more likely const), and made the const restrictions stand
on their own, rather than depending on pure.



Index: /ssd/src/gcc/svn/gcc/doc/extend.texi
===
--- /ssd/src/gcc/svn/gcc/doc/extend.texi    (revision 266760)
+++ /ssd/src/gcc/svn/gcc/doc/extend.texi    (working copy)
@@ -2518,25 +2518,45 @@ are automatically detected and this attribute 
is i

 @item const
 @cindex @code{const} function attribute
 @cindex functions that have no side effects
-Many functions do not examine any values except their arguments, and
-have no effects except to return a value.  Calls to such functions lend
-themselves to optimization such as common subexpression elimination.
-The presence of the @code{const} attribute on a function declaration 
-allows GCC to emit more efficient code for some calls to the 
function. +Calls to functions whose return value is not affected by 
changes to

+the observable state of the program and that have no observable effects
+on such state other than to return a value may lend themselves to
+optimizations such as common subexpression elimination.  Declaring such
+functions with the @code{const} attribute allows GCC to emit more 
efficient

+code for consecutive calls to the function.


I don't think the calls have to be consecutive for GCC to emit more 
efficient code.  I'd kill that last bit.


I added it because I want to make it clear that the attribute
shouldn't be expected to improve the efficiency of any single
call.  It can only improve it for the second (and subsequent)
call with the same argument values as the first.  I've tweaked
the sentence a bit.




+The @code{const} attribute prohibits a function from reading objects
+that affect its return value between successive invocations.  However,
+functions declared with the attribute can safely read objects that do
+not affect their return value, such as non-volatile constants.
 The @code{const} attribute imposes greater restrictions on a function's
-definition than the similar @code{pure} attribute below because it
-additionally prohibits the function from reading memory except for
-constant global variables.  Decorating the same function with
-both the @code{const} and the @code{pure} attribute is diagnosed.
+definition than the similar @code{pure} attribute.  Declaring the same
+function with both the @code{const} and the @code{pure} attribute is
+diagnosed.  Because a const function cannot have any observable side


@code{const}


I actually meant to bring this up separately.

I don't think @code would be appropriate in this context.  It's
not a use of the attribute name but rather a description of
the function.  Analogous to "a const pointer" or "a volatile
access" vs "a @code{const}-qualified pointer or
"the @code{volatile} qualifier."  I think the manual already
uses this style, albeit not completely consistently.  The C
and C++ standards aren't 100% consistent either, but I believe
the editors follow this principle when they think of it.  Unless
you really do think GCC should go the other way around I would
like to add this to the GCC style guidelines and fix
the inconsistencies.

I thought I was consistent in this in my own changes but I see
I was not.  I've changed the @code{const} to just const according
to the above.


+effects it does not make sense for it to return @code{void}.  Declaring
+such a function is diagnosed.

+For example,
+
+@smallexample
+int square (int) __attribute__ ((const));
+@end smallexample
+
+@noindent
+tells GCC that subsequent calls to function @code{square} with the same
+argument value can be replaced by the result of the first call 
regardless

+of the statements in between.
+


I think it would be better to move this example immediately after the 
first paragraph, before you digress about the diagnostics and such like.


Done.




 @cindex pointer arguments
 Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}.  Likewise, a
-function that calls a non-@code{const} function usually must not be
-@code{const}.  Because a @code{const} function cannot have any side
-effects it does not make sense for such a function to return 
@code{void}.

-Declaring such a function is 

Re: [doc,committed] clarify docs for function attribute "const"

2018-12-03 Thread Sandra Loosemore

On 12/3/18 2:47 PM, Martin Sebor wrote:

[snip]

Attached is my proposed update.  The user's email suggested going
into a lot of detail that I'm not sure would be helpful.  I think
it's safer to keep it simple than to try to carefully outline tricky
conditions under which some const or pure functions might get away
with modifying program state.  At the same time, I tried not to
outright prohibit it so I phrased the restrictions in terms of
observable program state (as opposed to reading or writing
"global" variables and such).

I also made a few other changes, like move the example of
the square function from pure to const (since the function is
much more likely const), and made the const restrictions stand
on their own, rather than depending on pure.



Index: /ssd/src/gcc/svn/gcc/doc/extend.texi
===
--- /ssd/src/gcc/svn/gcc/doc/extend.texi(revision 266760)
+++ /ssd/src/gcc/svn/gcc/doc/extend.texi(working copy)
@@ -2518,25 +2518,45 @@ are automatically detected and this attribute is i
 @item const
 @cindex @code{const} function attribute
 @cindex functions that have no side effects
-Many functions do not examine any values except their arguments, and
-have no effects except to return a value.  Calls to such functions lend
-themselves to optimization such as common subexpression elimination.
-The presence of the @code{const} attribute on a function declaration 
-allows GCC to emit more efficient code for some calls to the function.  
+Calls to functions whose return value is not affected by changes to

+the observable state of the program and that have no observable effects
+on such state other than to return a value may lend themselves to
+optimizations such as common subexpression elimination.  Declaring such
+functions with the @code{const} attribute allows GCC to emit more efficient
+code for consecutive calls to the function.


I don't think the calls have to be consecutive for GCC to emit more 
efficient code.  I'd kill that last bit.



+The @code{const} attribute prohibits a function from reading objects
+that affect its return value between successive invocations.  However,
+functions declared with the attribute can safely read objects that do
+not affect their return value, such as non-volatile constants.
 The @code{const} attribute imposes greater restrictions on a function's
-definition than the similar @code{pure} attribute below because it
-additionally prohibits the function from reading memory except for
-constant global variables.  Decorating the same function with
-both the @code{const} and the @code{pure} attribute is diagnosed.
+definition than the similar @code{pure} attribute.  Declaring the same
+function with both the @code{const} and the @code{pure} attribute is
+diagnosed.  Because a const function cannot have any observable side


@code{const}


+effects it does not make sense for it to return @code{void}.  Declaring
+such a function is diagnosed.
 
+For example,

+
+@smallexample
+int square (int) __attribute__ ((const));
+@end smallexample
+
+@noindent
+tells GCC that subsequent calls to function @code{square} with the same
+argument value can be replaced by the result of the first call regardless
+of the statements in between.
+


I think it would be better to move this example immediately after the 
first paragraph, before you digress about the diagnostics and such like.



 @cindex pointer arguments
 Note that a function that has pointer arguments and examines the data
-pointed to must @emph{not} be declared @code{const}.  Likewise, a
-function that calls a non-@code{const} function usually must not be
-@code{const}.  Because a @code{const} function cannot have any side
-effects it does not make sense for such a function to return @code{void}.
-Declaring such a function is diagnosed.
+pointed to must @emph{not} be declared @code{const} if the pointed-to
+data might change between successive invocations of the function.  In
+general, since a function cannot distinguish data that might change
+from data that cannot, @code{const} functions should never be
+pass-by-reference.  Likewise, a function that calls a non-@code{const}


I don't understand what a pass-by-reference function might be.  Do you 
mean it should not have reference parameters in C++?



+function usually must not be @code{const}.  Because a @code{const}
+function cannot have any side effects it does not make sense for such
+a function to return @code{void}. Declaring such a function is diagnosed.


The last two sentences duplicate what you say a couple paragraphs 
earlier.  We only need to say this once.  :-)


 
 @item constructor

 @itemx destructor
@@ -3301,34 +3321,51 @@ to prevent recursion.
 @item pure
 @cindex @code{pure} function attribute
 @cindex functions that have no side effects
-Many functions have no effects except the return value and their
-return value depends only on the parameters and/or global variables.

Re: [doc,committed] clarify docs for function attribute "const"

2018-12-03 Thread Martin Sebor

On 11/26/18 8:45 PM, Sandra Loosemore wrote:

On 11/26/18 8:32 PM, Martin Sebor wrote:

On 11/26/18 11:13 AM, Sandra Loosemore wrote:

On 11/26/18 10:17 AM, Martin Sebor wrote:

On 11/25/18 6:40 PM, Sandra Loosemore wrote:

I've checked in the attached patch for PR79738.


I think we have lost something important with the clarification
of attribute const:

   The @code{const} attribute imposes greater restrictions on
   a function's definition than the similar @code{pure} attribute
   below because it additionally prohibits the function from reading
   memory except for constant global variables.

Permitting a const function to only read global constants means
it can't read local variables (including static const locals).
Something like the following should fix that:

   The @code{const} attribute prohibits a function from accessing
   objects whose value can change between successive invocations of
   the function.  Functions declared with the @code{const} attribute
   may access non-volatile constant objects with any storage duration.
   The attribute imposes greater restrictions on a function's 
definition

   than the similar @code{pure} attribute.

I have also removed the mention of global variables (since objects
at other scopes, including static locals or thread-local variables,
are also included) and instead of "reading" used the term "accessing"
since const functions can neither read nor write such objects.
  Finally, I've avoided describing the attribute in terms of pure
("additionally") and instead only mentioned pure for reference.

Let me know how this sounds.


Hmmm.  If we go with this wording, then the description of "pure" 
needs to be updated too, since it also uses the "constant global 
variables" language now to describe how it differs from "pure".  I 
think we do need some succinct summary of exactly how the two 
attributes differ to explain why it is an error to provide both 
attributes and help users choose which is more appropriate.  Using 
parallel language except in the particulars that differ is one way to 
accomplish that.


I admit I really struggled with the wording in coming up with the 
previous patch  :-(  I thought I understood the difference, but I 
guess not.  :-(


I agree that both const and pure should be updated as well.  Let
me put together a patch for both.


Thanks.  I was going to take another stab at it myself after finishing 
some other stuff in my queue, but I'll wait and see what you suggest.


Attached is my proposed update.  The user's email suggested going
into a lot of detail that I'm not sure would be helpful.  I think
it's safer to keep it simple than to try to carefully outline tricky
conditions under which some const or pure functions might get away
with modifying program state.  At the same time, I tried not to
outright prohibit it so I phrased the restrictions in terms of
observable program state (as opposed to reading or writing
"global" variables and such).

I also made a few other changes, like move the example of
the square function from pure to const (since the function is
much more likely const), and made the const restrictions stand
on their own, rather than depending on pure.

Martin
PR 79738 - Documentation for __attribute__((const)) slightly misleading

	* doc/extend.texi (attribute const, pure): Clarify.

Index: /ssd/src/gcc/svn/gcc/doc/extend.texi
===
--- /ssd/src/gcc/svn/gcc/doc/extend.texi	(revision 266760)
+++ /ssd/src/gcc/svn/gcc/doc/extend.texi	(working copy)
@@ -2518,25 +2518,45 @@ are automatically detected and this attribute is i
 @item const
 @cindex @code{const} function attribute
 @cindex functions that have no side effects
-Many functions do not examine any values except their arguments, and
-have no effects except to return a value.  Calls to such functions lend
-themselves to optimization such as common subexpression elimination.
-The presence of the @code{const} attribute on a function declaration 
-allows GCC to emit more efficient code for some calls to the function.  
+Calls to functions whose return value is not affected by changes to
+the observable state of the program and that have no observable effects
+on such state other than to return a value may lend themselves to
+optimizations such as common subexpression elimination.  Declaring such
+functions with the @code{const} attribute allows GCC to emit more efficient
+code for consecutive calls to the function.
 
+The @code{const} attribute prohibits a function from reading objects
+that affect its return value between successive invocations.  However,
+functions declared with the attribute can safely read objects that do
+not affect their return value, such as non-volatile constants.
 The @code{const} attribute imposes greater restrictions on a function's
-definition than the similar @code{pure} attribute below because it
-additionally prohibits the function from reading memory except for

Re: [doc,committed] clarify docs for function attribute "const"

2018-11-26 Thread Sandra Loosemore

On 11/26/18 8:32 PM, Martin Sebor wrote:

On 11/26/18 11:13 AM, Sandra Loosemore wrote:

On 11/26/18 10:17 AM, Martin Sebor wrote:

On 11/25/18 6:40 PM, Sandra Loosemore wrote:

I've checked in the attached patch for PR79738.


I think we have lost something important with the clarification
of attribute const:

   The @code{const} attribute imposes greater restrictions on
   a function's definition than the similar @code{pure} attribute
   below because it additionally prohibits the function from reading
   memory except for constant global variables.

Permitting a const function to only read global constants means
it can't read local variables (including static const locals).
Something like the following should fix that:

   The @code{const} attribute prohibits a function from accessing
   objects whose value can change between successive invocations of
   the function.  Functions declared with the @code{const} attribute
   may access non-volatile constant objects with any storage duration.
   The attribute imposes greater restrictions on a function's definition
   than the similar @code{pure} attribute.

I have also removed the mention of global variables (since objects
at other scopes, including static locals or thread-local variables,
are also included) and instead of "reading" used the term "accessing"
since const functions can neither read nor write such objects.
  Finally, I've avoided describing the attribute in terms of pure
("additionally") and instead only mentioned pure for reference.

Let me know how this sounds.


Hmmm.  If we go with this wording, then the description of "pure" 
needs to be updated too, since it also uses the "constant global 
variables" language now to describe how it differs from "pure".  I 
think we do need some succinct summary of exactly how the two 
attributes differ to explain why it is an error to provide both 
attributes and help users choose which is more appropriate.  Using 
parallel language except in the particulars that differ is one way to 
accomplish that.


I admit I really struggled with the wording in coming up with the 
previous patch  :-(  I thought I understood the difference, but I 
guess not.  :-(


I agree that both const and pure should be updated as well.  Let
me put together a patch for both.


Thanks.  I was going to take another stab at it myself after finishing 
some other stuff in my queue, but I'll wait and see what you suggest.


-Sandra


Re: [doc,committed] clarify docs for function attribute "const"

2018-11-26 Thread Martin Sebor

On 11/26/18 11:13 AM, Sandra Loosemore wrote:

On 11/26/18 10:17 AM, Martin Sebor wrote:

On 11/25/18 6:40 PM, Sandra Loosemore wrote:

I've checked in the attached patch for PR79738.


I think we have lost something important with the clarification
of attribute const:

   The @code{const} attribute imposes greater restrictions on
   a function's definition than the similar @code{pure} attribute
   below because it additionally prohibits the function from reading
   memory except for constant global variables.

Permitting a const function to only read global constants means
it can't read local variables (including static const locals).
Something like the following should fix that:

   The @code{const} attribute prohibits a function from accessing
   objects whose value can change between successive invocations of
   the function.  Functions declared with the @code{const} attribute
   may access non-volatile constant objects with any storage duration.
   The attribute imposes greater restrictions on a function's definition
   than the similar @code{pure} attribute.

I have also removed the mention of global variables (since objects
at other scopes, including static locals or thread-local variables,
are also included) and instead of "reading" used the term "accessing"
since const functions can neither read nor write such objects.
  Finally, I've avoided describing the attribute in terms of pure
("additionally") and instead only mentioned pure for reference.

Let me know how this sounds.


Hmmm.  If we go with this wording, then the description of "pure" needs 
to be updated too, since it also uses the "constant global variables" 
language now to describe how it differs from "pure".  I think we do need 
some succinct summary of exactly how the two attributes differ to 
explain why it is an error to provide both attributes and help users 
choose which is more appropriate.  Using parallel language except in the 
particulars that differ is one way to accomplish that.


I admit I really struggled with the wording in coming up with the 
previous patch  :-(  I thought I understood the difference, but I 
guess not.  :-(


I agree that both const and pure should be updated as well.  Let
me put together a patch for both.

Martin


Re: [doc,committed] clarify docs for function attribute "const"

2018-11-26 Thread Sandra Loosemore

On 11/26/18 10:17 AM, Martin Sebor wrote:

On 11/25/18 6:40 PM, Sandra Loosemore wrote:

I've checked in the attached patch for PR79738.


I think we have lost something important with the clarification
of attribute const:

   The @code{const} attribute imposes greater restrictions on
   a function's definition than the similar @code{pure} attribute
   below because it additionally prohibits the function from reading
   memory except for constant global variables.

Permitting a const function to only read global constants means
it can't read local variables (including static const locals).
Something like the following should fix that:

   The @code{const} attribute prohibits a function from accessing
   objects whose value can change between successive invocations of
   the function.  Functions declared with the @code{const} attribute
   may access non-volatile constant objects with any storage duration.
   The attribute imposes greater restrictions on a function's definition
   than the similar @code{pure} attribute.

I have also removed the mention of global variables (since objects
at other scopes, including static locals or thread-local variables,
are also included) and instead of "reading" used the term "accessing"
since const functions can neither read nor write such objects.
  Finally, I've avoided describing the attribute in terms of pure
("additionally") and instead only mentioned pure for reference.

Let me know how this sounds.


Hmmm.  If we go with this wording, then the description of "pure" needs 
to be updated too, since it also uses the "constant global variables" 
language now to describe how it differs from "pure".  I think we do need 
some succinct summary of exactly how the two attributes differ to 
explain why it is an error to provide both attributes and help users 
choose which is more appropriate.  Using parallel language except in the 
particulars that differ is one way to accomplish that.


I admit I really struggled with the wording in coming up with the 
previous patch  :-(  I thought I understood the difference, but I 
guess not.  :-(


-Sandra


Re: [doc,committed] clarify docs for function attribute "const"

2018-11-26 Thread Martin Sebor

On 11/25/18 6:40 PM, Sandra Loosemore wrote:

I've checked in the attached patch for PR79738.


I think we have lost something important with the clarification
of attribute const:

  The @code{const} attribute imposes greater restrictions on
  a function's definition than the similar @code{pure} attribute
  below because it additionally prohibits the function from reading
  memory except for constant global variables.

Permitting a const function to only read global constants means
it can't read local variables (including static const locals).
Something like the following should fix that:

  The @code{const} attribute prohibits a function from accessing
  objects whose value can change between successive invocations of
  the function.  Functions declared with the @code{const} attribute
  may access non-volatile constant objects with any storage duration.
  The attribute imposes greater restrictions on a function's definition
  than the similar @code{pure} attribute.

I have also removed the mention of global variables (since objects
at other scopes, including static locals or thread-local variables,
are also included) and instead of "reading" used the term "accessing"
since const functions can neither read nor write such objects.
 Finally, I've avoided describing the attribute in terms of pure
("additionally") and instead only mentioned pure for reference.

Let me know how this sounds.

Martin


[doc,committed] clarify docs for function attribute "const"

2018-11-25 Thread Sandra Loosemore

I've checked in the attached patch for PR79738.

-Sandra
2018-11-25  Sandra Loosemore  

	PR web/79738

	gcc/
	* doc/extend.texi (Common Function Attributes): Clarify that
	functions with "const" attribute can read const global variables.
Index: gcc/doc/extend.texi
===
--- gcc/doc/extend.texi	(revision 266441)
+++ gcc/doc/extend.texi	(working copy)
@@ -2521,11 +2521,13 @@ are automatically detected and this attr
 Many functions do not examine any values except their arguments, and
 have no effects except to return a value.  Calls to such functions lend
 themselves to optimization such as common subexpression elimination.
+The presence of the @code{const} attribute on a function declaration 
+allows GCC to emit more efficient code for some calls to the function.  
+
 The @code{const} attribute imposes greater restrictions on a function's
-definition than the similar @code{pure} attribute below because it prohibits
-the function from reading global variables.  Consequently, the presence of
-the attribute on a function declaration allows GCC to emit more efficient
-code for some calls to the function.  Decorating the same function with
+definition than the similar @code{pure} attribute below because it
+additionally prohibits the function from reading memory except for
+constant global variables.  Decorating the same function with
 both the @code{const} and the @code{pure} attribute is diagnosed.
 
 @cindex pointer arguments
@@ -3315,8 +3317,9 @@ depending on volatile memory or other sy
 two consecutive calls (such as @code{feof} in a multithreading environment).
 
 The @code{pure} attribute imposes similar but looser restrictions on
-a function's defintion than the @code{const} attribute: it allows the
-function to read global variables.  Decorating the same function with
+a function's definition than the @code{const} attribute: @code{pure}
+allows the function to read any non-volatile memory, not just
+constant global variables.  Decorating the same function with
 both the @code{pure} and the @code{const} attribute is diagnosed.
 Because a @code{pure} function cannot have any side effects it does not
 make sense for such a function to return @code{void}.  Declaring such