ISO/ IEC JTC1/SC22/WG14 N824

                    Document Number:  WG14 N824/X3J11 98-023


   WG14/N824            C9X Public Comment            WG14/N824
                        ==================


Sponsoring National Body: J11                 Date: 98/05/15
Author: Tom MacDonald
Author Affiliation: Silicon Graphics Inc.
Postal Address: 655F Lone Oak Drive, Eagan, MN 55409 USA
E-mail Address: tam@cray.com
Telephone Number: +1 612 6835818
Fax Number: +1 612 6835307
Number of individual comments: 2


        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%                                      %%
        %% Improved Words for Function Inlining %%
        %%                                      %%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


     6.5  Declarations

       Syntax

       [#1]

               declaration:
                       declaration-specifiers init-declarator-list-opt ;

               declaration-specifiers:
                       storage-class-specifier declaration-specifiers-opt
                       type-specifier declaration-specifiers-opt
                       type-qualifier declaration-specifiers-opt
                       function-specifiers
                       ^^^^^^^^^^^^^^^^^^^
                       function-specifier declaration-specifiers-opt


===================================================================

       6.5.4  Function specifiers

       Syntax

       [#1]

               function-specifier:
                       inline

       Constraints

       [#2]  Function  specifiers  shall  be  used  only   in   the
       declaration of an identifier for a function.

       [#3] An inline definition (see below)  of  a  function  with
       external linkage shall not contain a definition of an object
       with static storage duration that can be modified, and shall
       not  contain  a  reference  to  an  identifier with internal
       linkage.

       [#4] The inline function specifier shall  not  appear  in  a
       declaration of main.

       Semantics

       [#5] A function declared with an inline  function  specifier
       is an inline function.  Making a function an inline function
       suggests that calls to the function be as fast  as  possible
       by  using, for example, an alternative to the usual function
       call mechanism known  as  ``inline  substitution''.101   The
       extent  to  which  such   suggestions   are   effective   is
       implementation-defined.102

       [#6] Any function with internal linkage  can  be  an  inline
       function.    For  a  function  with  external  linkage,  the
       following restrictions apply.  If  a  function  is  declared
       with  an  inline  function  specifier, then it shall also be
       defined in the same translation unit.  If all  of  the  file
       scope  declarations  for  a  function  in a translation unit
       include the inline function specifier without  extern,  then
       the  definition  in  that  translation  unit  is  an  inline
       definition.   An  inline  definition  does  not  provide  an
       external definition for the function, and does not forbid an
       external definition in another translation unit.  An  inline
       definition   provides   an   alternative   to   an  external
       definition, which a translator may use to implement any call
       to  the  function  in  the  same  translation  unit.   It is
       unspecified whether a call to the function uses  the  inline
       definition or the external definition.
                                             ^
                                             ** add a footnote here


       101. Inline substitution is not  textual  substitution,  nor
           does  it create a new function.  Therefore, for example,
           the expansion of a macro used within  the  body  of  the


       ** Since an inline definition of a function is distinct from
          the corresponding external definition, and any other
          corresponding inline definition in another translation unit,
          all corresponding objects with static storage duration are
          also distinct in each of these definitions.


===============================================================

The ** footnote clarifies a point made by Hugh Redelmeier in an Email he
sent last March.  The intent of the current proposal is that an "inline
definition of function with external linkage" is distinct from the
"external definition of the function".  The implementation is at liberty
to choose which one it wants to call, but it's calling a different
definition of the function.  Thus, an static objects inside the function
(that cannot be be modified) are distinct, and do not share the same
memory as the corresponding static object in either the external definition
or a different inline function in another TU.


From: "D. Hugh Redelmeier" <hugh@mimosa.com>
Date:   Fri, 27 Mar 1998 13:55:51 -0500
To: Thomas MacDonald <tam@cray.com>
cc: Standard C <SC22WG14@dkuug.dk>
Subject: Re: (SC22WG14.5346) static objects in inline functions

I now see how this is supposed to work, but I don't think that the
words achieve this.

| The Draft says the following about string literals:
| 
|      These arrays need not be distinct provided their
|      elements have the appropriate values.

I guess that the required words are sort of the opposite:
implementations are allowed to collapse distinct instances of strings,
but are allowed to create multiple instances of the same static in an
inline function.

I suggest words something like:

        Each invocation of an inline function may or may not have distinct
        instances of its static objects.

Without these words or something like them, I don't see that the standard
allows an implementation to instantiate these statics multiple times.  By
"its static objects" I meant function statics and string literals -- does
this need to be spelled out?