]> git.ipfire.org Git - thirdparty/gnulib.git/commitdiff
Fix [[unsequenced]] and [[reproducible]] confusion
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 20 Dec 2025 18:37:30 +0000 (10:37 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 20 Dec 2025 18:39:02 +0000 (10:39 -0800)
* m4/gnulib-common.m4 (_GL_ATTRIBUTE_CONST, _GL_ATTRIBUTE_PURE):
Default to empty, not to _GL_ATTRIBUTE_UNSEQUENCED and
_GL_ATTRIBUTE_REPRODUCIBLE respectively, because unfortunately
__attribute__ ((const)) does not imply [[unsequenced]] and
__attribute__ ((pure)) does not imply [[reproducible]].

ChangeLog
m4/gnulib-common.m4

index 891c2edb67d77ace3598a120cb051f658398a930..161f0ce585334115c8bcbaa0573ac3c75b88f180 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2025-12-20  Paul Eggert  <eggert@cs.ucla.edu>
 
+       Fix [[unsequenced]] and [[reproducible]] confusion
+       * m4/gnulib-common.m4 (_GL_ATTRIBUTE_CONST, _GL_ATTRIBUTE_PURE):
+       Default to empty, not to _GL_ATTRIBUTE_UNSEQUENCED and
+       _GL_ATTRIBUTE_REPRODUCIBLE respectively, because unfortunately
+       __attribute__ ((const)) does not imply [[unsequenced]] and
+       __attribute__ ((pure)) does not imply [[reproducible]].
+
        timespec: tweak timespec_sign
        * lib/timespec.h (timespec_cmp, timespec_sign):
        These functions are const, not merely pure.
index 7ec965c0e45a78d3311fdf6f738d660ae2f8ad8a..9cdb21ac26536b7bfa1665204016702769e71237 100644 (file)
@@ -422,15 +422,17 @@ AC_DEFUN([gl_COMMON_BODY], [
    without examining state, and always returns exactly once -
    e.g., does not raise an exception, call longjmp, or loop forever.
    (This attribute is stricter than _GL_ATTRIBUTE_PURE because the
-   function cannot observe state.  It is stricter than
-   _GL_ATTRIBUTE_UNSEQUENCED because the function must return exactly
-   once and cannot access state addressed by its arguments.)  */
+   function cannot observe state.  Unlike _GL_ATTRIBUTE_UNSEQUENCED
+   the function must return exactly once and cannot access state
+   addressed by its pointer arguments or that happens to have the same
+   value for all calls to the function, but the function is allowed to
+   return a pointer to storage that can be modified later.  */
 /* Applies to: functions.  */
 #ifndef _GL_ATTRIBUTE_CONST
 # if _GL_HAS_ATTRIBUTE (const)
 #  define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
 # else
-#  define _GL_ATTRIBUTE_CONST _GL_ATTRIBUTE_UNSEQUENCED
+#  define _GL_ATTRIBUTE_CONST
 # endif
 #endif
 
@@ -752,30 +754,31 @@ AC_DEFUN([gl_COMMON_BODY], [
    returns a value determined solely by its arguments's values
    together with observable state, and always returns exactly once.
    (This attribute is looser than _GL_ATTRIBUTE_CONST because the function
-   can depend on observable state.  It is stricter than
-   _GL_ATTRIBUTE_REPRODUCIBLE because the function must return exactly
-   once and cannot change state addressed by its arguments.)  */
+   can depend on observable state.
+   Unlike _GL_ATTRIBUTE_REPRODUCIBLE the function must return exactly
+   once and cannot change state addressed by its arguments, but the
+   function can return a pointer to storage whose contents change later.)  */
 /* Applies to: functions.  */
 #ifndef _GL_ATTRIBUTE_PURE
 # if _GL_HAS_ATTRIBUTE (pure)
 #  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
 # else
-#  define _GL_ATTRIBUTE_PURE _GL_ATTRIBUTE_REPRODUCIBLE
+#  define _GL_ATTRIBUTE_PURE
 # endif
 #endif
 
 /* _GL_ATTRIBUTE_REPRODUCIBLE declares:
    It is OK for a compiler to move a call, or omit a duplicate call
-   and reuse a cached value returned either directly or indirectly
-   via a pointer argument, if other observable state is the same;
-   however, these pointer arguments cannot alias.
+   and reuse a cached value returned either directly or indirectly via
+   a pointer, if other observable state is the same;
+   however, pointer arguments cannot alias.
    This attribute is safe for a function that is effectless and idempotent;
    see ISO C 23 § 6.7.13.8 for a definition of these terms.
    (This attribute is looser than _GL_ATTRIBUTE_UNSEQUENCED because
-   the function need not be stateless or independent.  It is looser
-   from _GL_ATTRIBUTE_PURE because the function need not return
-   exactly once, and it can change state addressed by its pointer arguments
-   that do not alias.)
+   the function need not be stateless or independent.
+   Unlike _GL_ATTRIBUTE_PURE the function need not return exactly once
+   and can change state addressed by its pointer arguments, but the
+   function cannot return a pointer to storage whose contents change later.)
    See also <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
    <https://stackoverflow.com/questions/76847905/>.
    ATTENTION! Efforts are underway to change the meaning of this attribute.
@@ -820,16 +823,19 @@ AC_DEFUN([gl_COMMON_BODY], [
 
 /* _GL_ATTRIBUTE_UNSEQUENCED declares:
    It is OK for a compiler to move a call, or omit a duplicate call
-   and reuse a cached return value, addressed by its arguments is the same.
+   and reuse a cached value returned either directly or indirectly via
+   a pointer, if the state addressed by its pointer arguments is the same;
+   however, pointer arguments cannot alias.
    This attribute is safe for a function that is effectless, idempotent,
    stateless, and independent; see ISO C 23 § 6.7.13.8 for a definition of
    these terms.
    (This attribute is stricter than _GL_ATTRIBUTE_REPRODUCIBLE because
-   the function must be stateless and independent.  It differs from
-   _GL_ATTRIBUTE_CONST because the function need not return exactly
-   once and can depend on state accessed via its pointer arguments
-   that do not alias, or on other state that happens to have the
-   same value for all calls to the function.)
+   the function must be stateless and independent.  Unlike
+   _GL_ATTRIBUTE_CONST the function need not return exactly once, and
+   can depend on state accessed via its pointer arguments or that
+   happens to have the same value for all calls to the function, but
+   the function cannot return a pointer to storage whose contents
+   change later.)
    See also <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2956.htm> and
    <https://stackoverflow.com/questions/76847905/>.
    ATTENTION! Efforts are underway to change the meaning of this attribute.