Changes in / [fbfde843:540de412]


Ignore:
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • doc/LaTeXmacros/common.tex

    rfbfde843 r540de412  
    1111%% Created On       : Sat Apr  9 10:06:17 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sat Apr 30 13:52:12 2016
    14 %% Update Count     : 41
     13%% Last Modified On : Sat Apr  9 10:06:39 2016
     14%% Update Count     : 1
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    1919% Names used in the document.
    2020
    21 \newcommand{\CFA}{C$\mathbf\forall$\xspace}              % set language symbolic name
    22 \newcommand{\CFL}{Cforall\xspace}                        % set language text name
     21\newcommand{\CFA}{C$\mathbf\forall$\xspace}                             % set language symbolic name
     22\newcommand{\CFL}{Cforall\xspace}                                               % set language text name
    2323\newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
    2424\def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
     
    4343   \belowdisplayskip \abovedisplayskip
    4444}
    45 \usepackage{relsize}                                    % must be after change to small or selects old size
     45\usepackage{relsize}                                                                    % must be after change to small or selects old size
    4646
    4747% reduce size of chapter/section titles
     
    6666    \vskip 50\p@
    6767  }}
    68 \renewcommand\section{\@startsection{section}{1}{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus .2ex}{\normalfont\large\bfseries}}
    69 \renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-3.25ex \@plus -1ex \@minus -.2ex}{1.5ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
     68\renewcommand\section{\@startsection{section}{1}{\z@}{-3.0ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\large\bfseries}}
     69\renewcommand\subsection{\@startsection{subsection}{2}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    7070\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex \@plus -1ex \@minus -.2ex}{1.0ex \@plus .2ex}{\normalfont\normalsize\bfseries}}
    7171\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{-2.0ex \@plus -1ex \@minus -.2ex}{-1em}{\normalfont\normalsize\bfseries}}
     
    109109\newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
    110110
    111 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
    112 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
    113 
    114111\newcommand{\newtermFontInline}{\emph}
    115112\newcommand{\newterm}{\@ifstar\@snewterm\@newterm}
     
    182179                fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
    183180                _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
     181        moredelim=**[is][\color{red}]{`}{`}, % red highlighting of program text
    184182}%
    185183
     
    188186columns=flexible,
    189187basicstyle=\sf\relsize{-1},
    190 stringstyle=\tt,
    191188tabsize=4,
    192189xleftmargin=\parindent,
    193 extendedchars=true,
    194 escapechar=§,
     190escapechar=@,
    195191mathescape=true,
    196192keepspaces=true,
    197193showstringspaces=false,
    198194showlines=true,
    199 aboveskip=4pt,
    200 belowskip=2pt,
    201 moredelim=**[is][\color{red}]{®}{®}, % red highlighting
    202 moredelim=**[is][\color{blue}]{©}{©}, % blue highlighting
    203 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords
    204 % literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting
     195aboveskip=6pt,
     196belowskip=4pt,
     197literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting
    205198}%
    206199
     
    210203\lst@ProcessOther{"22}{\lst@ttfamily{"}{\raisebox{0.3ex}{\ttfamily\upshape "}}} % replace double quote
    211204\lst@ProcessOther{"27}{\lst@ttfamily{'}{\raisebox{0.3ex}{\ttfamily\upshape '\hspace*{-2pt}}}} % replace single quote
    212 \lst@ProcessOther{"2D}{\lst@ttfamily{-}{\textbf{\texttt{-}}}} % replace minus
    213 \lst@ProcessOther{"3C}{\lst@ttfamily{<}{\textbf{\texttt{<}}}} % replace less than
    214 \lst@ProcessOther{"3E}{\lst@ttfamily{>}{\textbf{\texttt{>}}}} % replace greater than
     205\lst@ProcessOther{"2D}{\lst@ttfamily{-}{\ttfamily\upshape -}} % replace minus
     206\lst@ProcessOther{"3C}{\lst@ttfamily{<}{\texttt{<}}} % replace less than
     207\lst@ProcessOther{"3E}{\lst@ttfamily{<}{\texttt{>}}} % replace greater than
    215208\lst@ProcessOther{"5E}{\raisebox{0.4ex}{$\scriptstyle\land\,$}} % replace circumflex
    216209\lst@ProcessOther{"5F}{\lst@ttfamily{\char95}{{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}}} % replace underscore
  • doc/refrat/refrat.tex

    rfbfde843 r540de412  
    1111%% Created On       : Wed Apr  6 14:52:25 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sat Apr 30 13:45:40 2016
    14 %% Update Count     : 29
     13%% Last Modified On : Sat Apr  9 10:19:12 2016
     14%% Update Count     : 8
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
    1717% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    18 
    19 % red highlighting ®...® (registered trademark sumbol)
    20 % blue highlighting ©...© (copyright symbol)
    21 % latex escape §...§ (section symbol)
    22 % keyword escape ¶...¶ (pilcrow symbol)
    23 % math escape $...$ (dollar symbol)
    2418
    2519\documentclass[openright,twoside]{report}
     
    131125\CFA's scope rules differ from C's in one major respect: a declaration of an identifier may overload\index{overloading} outer declarations of lexically identical identifiers in the same
    132126\Index{name space}, instead of hiding them.
    133 The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline@type@\use{type} or
    134 \lstinline@typedef@\use{typedef} declaration and the other is not.  The outer declaration becomes
     127The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline$type$\use{type} or
     128\lstinline$typedef$\use{typedef} declaration and the other is not.  The outer declaration becomes
    135129\Index{visible} when the scope of the inner declaration terminates.
    136130\begin{rationale}
    137 Hence, a \CFA program can declare an \lstinline@int v@ and a \lstinline@float v@ in the same scope;
     131Hence, a \CFA program can declare an \lstinline$int v$ and a \lstinline$float v$ in the same scope;
    138132a {\CC} program can not.
    139133\end{rationale}
     
    149143Identifiers with \Index{no linkage} always denote unique entities.
    150144\begin{rationale}
    151 A \CFA program can declare an \lstinline@extern int v@ and an \lstinline@extern float v@;
     145A \CFA program can declare an \lstinline$extern int v$ and an \lstinline$extern float v$;
    152146a C program cannot.
    153147\end{rationale}
     
    172166\end{lstlisting}
    173167
    174 The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline@sumable@.
     168The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline$sumable$.
    175169The instantiation then has the semantics that would result if the type parameters were substituted into the type generator declaration by macro substitution.
    176170
     
    233227In \CFA, these conversions play a role in overload resolution, and collectively are called the \define{safe arithmetic conversion}s.
    234228
    235 Let \lstinline@int$_r$@ and \lstinline@unsigned$_r$@ be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.
    236 Let \lstinline@unsigned$_{mr}$@ be the unsigned integer type with maximal rank.
     229Let \(int_r\) and \(unsigned_r\) be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.
     230Let \(unsigned_{mr}\) be the unsigned integer type with maximal rank.
    237231
    238232The following conversions are \emph{direct} safe arithmetic conversions.
     
    241235The \Index{integer promotion}s.
    242236\item
    243 For every rank $r$ greater than or equal to the rank of \lstinline@int@, conversion from \lstinline@int$_r$@ to \lstinline@unsigned$_r$@.
    244 \item
    245 For every rank $r$ greater than or equal to the rank of \lstinline@int@, where \lstinline@int$_{r+1}$@ exists and can represent all values of \lstinline@unsigned$_r$@, conversion from \lstinline@unsigned$_r$@ to \lstinline@int$_{r+1}$@.
    246 \item
    247 Conversion from \lstinline@unsigned$_{mr}$@ to \lstinline@float@.
     237For every rank $r$ greater than or equal to the rank of \lstinline$int$, conversion from \(int_r\) to \(unsigned_r\).
     238\item
     239For every rank $r$ greater than or equal to the rank of \lstinline$int$, where \(int_{r+1}\) exists and can represent all values of \(unsigned_r\), conversion from \(unsigned_r\) to \(int_{r+1}\).
     240\item
     241Conversion from \(unsigned_{mr}\) to \lstinline$float$.
    248242\item
    249243Conversion from an enumerated type to its compatible integer type.
    250244\item
    251 Conversion from \lstinline@float@ to \lstinline@double@, and from \lstinline@double@ to \lstinline@long double@.
    252 \item
    253 Conversion from \lstinline@float _Complex@ to \lstinline@double _Complex@, and from \lstinline@double _Complex@ to \lstinline@long double _Complex@.
     245Conversion from \lstinline$float$ to \lstinline$double$, and from \lstinline$double$ to \lstinline$long double$.
     246\item
     247Conversion from \lstinline$float _Complex$ to \lstinline$double _Complex$, and from \lstinline$double _Complex$ to \lstinline$long double _Complex$.
    254248\begin{sloppypar}
    255249\item
    256 Conversion from \lstinline@float _Imaginary@ to \lstinline@double _Imaginary@, and from \lstinline@double _Imaginary@ to \lstinline@long double _Imaginary@, if the implementation supports imaginary types.
     250Conversion from \lstinline$float _Imaginary$ to \lstinline$double _Imaginary$, and from \lstinline$double _Imaginary$ to \lstinline$long double$ \lstinline$_Imaginary$, if the implementation supports imaginary types.
    257251\end{sloppypar}
    258252\end{itemize}
    259253
    260 If type \lstinline@T@ can be converted to type \lstinline@U@ by a safe direct arithmetic conversion and type \lstinline@U@ can be converted to type \lstinline@V@ by a safe arithmetic conversion, then the conversion from \lstinline@T@ to type \lstinline@V@ is an \emph{indirect} safe arithmetic conversion.
     254If type \lstinline$T$ can be converted to type \lstinline$U$ by a safe direct arithmetic conversion and type \lstinline$U$ can be converted to type \lstinline$V$ by a safe arithmetic conversion, then the conversion from \lstinline$T$ to type \lstinline$V$ is an \emph{indirect} safe arithmetic conversion.
    261255
    262256\begin{rationale}
     
    281275        int x, y;
    282276};
    283 void move_by( struct point * p1, struct point * p2 ) {§\impl{move_by}§
     277void move_by( struct point * p1, struct point * p2 ) {@\impl{move_by}@
    284278        p1->x += p2.x;
    285279        p1->y += p2.y;
     
    291285move_to( &cp1, &cp2 );
    292286\end{lstlisting}
    293 Thanks to implicit conversion, the two arguments that \lstinline@move_by()@ receives are pointers to
    294 \lstinline@cp1@'s second member and \lstinline@cp2@'s second member.
     287Thanks to implicit conversion, the two arguments that \lstinline$move_by()$ receives are pointers to
     288\lstinline$cp1$'s second member and \lstinline$cp2$'s second member.
    295289
    296290
     
    334328a direct safe arithmetic conversion;
    335329\item
    336 from any object type or incomplete type to \lstinline@void@;
    337 \item
    338 from a pointer to any non-\lstinline@void@ type to a pointer to \lstinline@void@;
     330from any object type or incomplete type to \lstinline$void$;
     331\item
     332from a pointer to any non-\lstinline$void$ type to a pointer to \lstinline$void$;
    339333\item
    340334from a pointer to any type to a pointer to a more qualified version of the type\index{qualified type};
     
    347341Conversions that are not safe conversions are \define{unsafe conversion}s.
    348342\begin{rationale}
    349 As in C, there is an implicit conversion from \lstinline@void *@ to any pointer type.
     343As in C, there is an implicit conversion from \lstinline$void *$ to any pointer type.
    350344This is clearly dangerous, and {\CC} does not have this implicit conversion.
    351345\CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a superset of C as possible, but discourages it by making it unsafe.
     
    373367\begin{itemize}
    374368\item
    375 The cost of an implicit conversion from \lstinline@int@ to \lstinline@long@ is 1.
    376 The cost of an implicit conversion from \lstinline@long@ to \lstinline@double@ is 3, because it is defined in terms of conversions from \lstinline@long@ to \lstinline@unsigned long@, then to \lstinline@float@, and then to \lstinline@double@.
    377 
    378 \item
    379 If \lstinline@int@ can represent all the values of \lstinline@unsigned short@, then the cost of an implicit conversion from \lstinline@unsigned short@ to \lstinline@unsigned@ is 2:
    380 \lstinline@unsigned short@ to \lstinline@int@ to \lstinline@unsigned@.
    381 Otherwise, \lstinline@unsigned short@ is converted directly to \lstinline@unsigned@, and the cost is 1.
    382 
    383 \item
    384 If \lstinline@long@ can represent all the values of \lstinline@unsigned@, then the conversion cost of \lstinline@unsigned@ to \lstinline@long@ is 1.
     369The cost of an implicit conversion from \lstinline$int$ to \lstinline$long$ is 1.
     370The cost of an implicit conversion from \lstinline$long$ to \lstinline$double$ is 3, because it is defined in terms of conversions from \lstinline$long$ to \lstinline$unsigned long$, then to \lstinline$float$, and then to \lstinline$double$.
     371
     372\item
     373If \lstinline$int$ can represent all the values of \lstinline$unsigned short$, then the cost of an implicit conversion from \lstinline$unsigned short$ to \lstinline$unsigned$ is 2:
     374\lstinline$unsigned short$ to \lstinline$int$ to \lstinline$unsigned$.
     375Otherwise, \lstinline$unsigned short$ is converted directly to \lstinline$unsigned$, and the cost is 1.
     376
     377\item
     378If \lstinline$long$ can represent all the values of \lstinline$unsigned$, then the conversion cost of \lstinline$unsigned$ to \lstinline$long$ is 1.
    385379Otherwise, the conversion is an unsafe conversion, and its conversion cost is undefined.
    386380\end{itemize}
     
    390384\begin{syntax}
    391385\oldlhs{keyword}
    392         \rhs \lstinline@forall@
    393         \rhs \lstinline@lvalue@
    394         \rhs \lstinline@trait@
    395         \rhs \lstinline@dtype@
    396         \rhs \lstinline@ftype@
    397         \rhs \lstinline@otype@
     386        \rhs \lstinline$forall$
     387        \rhs \lstinline$lvalue$
     388        \rhs \lstinline$trait$
     389        \rhs \lstinline$dtype$
     390        \rhs \lstinline$ftype$
     391        \rhs \lstinline$type$
    398392\end{syntax}
    399393
     
    402396
    403397\CFA allows operator \Index{overloading} by associating operators with special function identifiers.
    404 Furthermore, the constants ``\lstinline@0@'' and ``\lstinline@1@'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.
     398Furthermore, the constants ``\lstinline$0$'' and ``\lstinline$1$'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.
    405399Programmers can use these identifiers to declare functions and objects that implement operators and constants for their own types.
    406400
     
    411405\begin{syntax}
    412406\oldlhs{identifier}
    413 \rhs \lstinline@0@
    414 \rhs \lstinline@1@
     407\rhs \lstinline$0$
     408\rhs \lstinline$1$
    415409\end{syntax}
    416410
    417 \index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline@0@''\impl{0} and ``\lstinline@1@''\impl{1} are identifiers.
     411\index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline$0$''\impl{0} and ``\lstinline$1$''\impl{1} are identifiers.
    418412No other tokens defined by the rules for integer constants are considered to be identifiers.
    419413\begin{rationale}
    420 Why ``\lstinline@0@'' and ``\lstinline@1@''? Those integers have special status in C.
     414Why ``\lstinline$0$'' and ``\lstinline$1$''? Those integers have special status in C.
    421415All scalar types can be incremented and decremented, which is defined in terms of adding or subtracting 1.
    422 The operations ``\lstinline@&&@'', ``\lstinline@||@'', and ``\lstinline@!@'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.
     416The operations ``\lstinline$&&$'', ``\lstinline$||$'', and ``\lstinline$!$'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.
    423417A \nonterm{constant-expression} that evaluates to 0 is effectively compatible with every pointer type.
    424418
    425419In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case.
    426420However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
    427 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline@_Bool@.
    428 
    429 Why \emph{just} ``\lstinline@0@'' and ``\lstinline@1@''? Why not other integers? No other integers have special status in C.
    430 A facility that let programmers declare specific constants---``\lstinline@const Rational 12@'', for instance---would not be much of an improvement.
     421Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline$_Bool$.
     422
     423Why \emph{just} ``\lstinline$0$'' and ``\lstinline$1$''? Why not other integers? No other integers have special status in C.
     424A facility that let programmers declare specific constants---``\lstinline$const Rational 12$'', for instance---would not be much of an improvement.
    431425Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed.
    432426The complexity of such a feature doesn't seem worth the gain.
     
    444438\begin{tabular}[t]{ll}
    445439%identifier & operation \\ \hline
    446 \lstinline@?[?]@ & subscripting \impl{?[?]}\\
    447 \lstinline@?()@ & function call \impl{?()}\\
    448 \lstinline@?++@ & postfix increment \impl{?++}\\
    449 \lstinline@?--@ & postfix decrement \impl{?--}\\
    450 \lstinline@++?@ & prefix increment \impl{++?}\\
    451 \lstinline@--?@ & prefix decrement \impl{--?}\\
    452 \lstinline@*?@ & dereference \impl{*?}\\
    453 \lstinline@+?@ & unary plus \impl{+?}\\
    454 \lstinline@-?@ & arithmetic negation \impl{-?}\\
    455 \lstinline@~?@ & bitwise negation \impl{~?}\\
    456 \lstinline@!?@ & logical complement \impl{"!?}\\
    457 \lstinline@?*?@ & multiplication \impl{?*?}\\
    458 \lstinline@?/?@ & division \impl{?/?}\\
     440\lstinline$?[?]$ & subscripting \impl{?[?]}\\
     441\lstinline$?()$ & function call \impl{?()}\\
     442\lstinline$?++$ & postfix increment \impl{?++}\\
     443\lstinline$?--$ & postfix decrement \impl{?--}\\
     444\lstinline$++?$ & prefix increment \impl{++?}\\
     445\lstinline$--?$ & prefix decrement \impl{--?}\\
     446\lstinline$*?$ & dereference \impl{*?}\\
     447\lstinline$+?$ & unary plus \impl{+?}\\
     448\lstinline$-?$ & arithmetic negation \impl{-?}\\
     449\lstinline$~?$ & bitwise negation \impl{~?}\\
     450\lstinline$!?$ & logical complement \impl{"!?}\\
     451\lstinline$?*?$ & multiplication \impl{?*?}\\
     452\lstinline$?/?$ & division \impl{?/?}\\
    459453\end{tabular}\hfil
    460454\begin{tabular}[t]{ll}
    461455%identifier & operation \\ \hline
    462 \lstinline@?%?@ & remainder \impl{?%?}\\
    463 \lstinline@?+?@ & addition \impl{?+?}\\
    464 \lstinline@?-?@ & subtraction \impl{?-?}\\
    465 \lstinline@?<<?@ & left shift \impl{?<<?}\\
    466 \lstinline@?>>?@ & right shift \impl{?>>?}\\
    467 \lstinline@?<?@ & less than \impl{?<?}\\
    468 \lstinline@?<=?@ & less than or equal \impl{?<=?}\\
    469 \lstinline@?>=?@ & greater than or equal \impl{?>=?}\\
    470 \lstinline@?>?@ & greater than \impl{?>?}\\
    471 \lstinline@?==?@ & equality \impl{?==?}\\
    472 \lstinline@?!=?@ & inequality \impl{?"!=?}\\
    473 \lstinline@?&?@ & bitwise AND \impl{?&?}\\
     456\lstinline$?%?$ & remainder \impl{?%?}\\
     457\lstinline$?+?$ & addition \impl{?+?}\\
     458\lstinline$?-?$ & subtraction \impl{?-?}\\
     459\lstinline$?<<?$ & left shift \impl{?<<?}\\
     460\lstinline$?>>?$ & right shift \impl{?>>?}\\
     461\lstinline$?<?$ & less than \impl{?<?}\\
     462\lstinline$?<=?$ & less than or equal \impl{?<=?}\\
     463\lstinline$?>=?$ & greater than or equal \impl{?>=?}\\
     464\lstinline$?>?$ & greater than \impl{?>?}\\
     465\lstinline$?==?$ & equality \impl{?==?}\\
     466\lstinline$?!=?$ & inequality \impl{?"!=?}\\
     467\lstinline$?&?$ & bitwise AND \impl{?&?}\\
    474468\end{tabular}\hfil
    475469\begin{tabular}[t]{ll}
    476470%identifier & operation \\ \hline
    477 \lstinline@?^?@ & exclusive OR \impl{?^?}\\
    478 \lstinline@?|?@ & inclusive OR \impl{?"|?}\\
    479 \lstinline@?=?@ & simple assignment \impl{?=?}\\
    480 \lstinline@?*=?@ & multiplication assignment \impl{?*=?}\\
    481 \lstinline@?/=?@ & division assignment \impl{?/=?}\\
    482 \lstinline@?%=?@ & remainder assignment \impl{?%=?}\\
    483 \lstinline@?+=?@ & addition assignment \impl{?+=?}\\
    484 \lstinline@?-=?@ & subtraction assignment \impl{?-=?}\\
    485 \lstinline@?<<=?@ & left-shift assignment \impl{?<<=?}\\
    486 \lstinline@?>>=?@ & right-shift assignment \impl{?>>=?}\\
    487 \lstinline@?&=?@ & bitwise AND assignment \impl{?&=?}\\
    488 \lstinline@?^=?@ & exclusive OR assignment \impl{?^=?}\\
    489 \lstinline@?|=?@ & inclusive OR assignment \impl{?"|=?}\\
     471\lstinline$?^?$ & exclusive OR \impl{?^?}\\
     472\lstinline$?|?$ & inclusive OR \impl{?"|?}\\
     473\lstinline$?=?$ & simple assignment \impl{?=?}\\
     474\lstinline$?*=?$ & multiplication assignment \impl{?*=?}\\
     475\lstinline$?/=?$ & division assignment \impl{?/=?}\\
     476\lstinline$?%=?$ & remainder assignment \impl{?%=?}\\
     477\lstinline$?+=?$ & addition assignment \impl{?+=?}\\
     478\lstinline$?-=?$ & subtraction assignment \impl{?-=?}\\
     479\lstinline$?<<=?$ & left-shift assignment \impl{?<<=?}\\
     480\lstinline$?>>=?$ & right-shift assignment \impl{?>>=?}\\
     481\lstinline$?&=?$ & bitwise AND assignment \impl{?&=?}\\
     482\lstinline$?^=?$ & exclusive OR assignment \impl{?^=?}\\
     483\lstinline$?|=?$ & inclusive OR assignment \impl{?"|=?}\\
    490484\end{tabular}
    491485\hfil
     
    502496
    503497\begin{rationale}
    504 The use of ``\lstinline@?@'' in identifiers means that some C programs are not \CFA programs.  For instance, the sequence of characters ``\lstinline@(i < 0)?--i:i@'' is legal in a C program, but a
    505 \CFA compiler detects a syntax error because it treats ``\lstinline@?--@'' as an identifier, not as the two tokens ``\lstinline@?@'' and ``\lstinline@--@''.
     498The use of ``\lstinline$?$'' in identifiers means that some C programs are not \CFA programs.  For instance, the sequence of characters ``\lstinline$(i < 0)?--i:i$'' is legal in a C program, but a
     499\CFA compiler detects a syntax error because it treats ``\lstinline$?--$'' as an identifier, not as the two tokens ``\lstinline$?$'' and ``\lstinline$--$''.
    506500\end{rationale}
    507501
     
    510504\begin{itemize}
    511505\item
    512 The logical operators ``\lstinline@&&@'' and ``\lstinline@||@'', and the conditional operator
    513 ``\lstinline@?:@''.
     506The logical operators ``\lstinline$&&$'' and ``\lstinline$||$'', and the conditional operator
     507``\lstinline$?:$''.
    514508These operators do not always evaluate their operands, and hence can not be properly defined by functions unless some mechanism like call-by-name is added to the language.
    515 Note that the definitions of ``\lstinline@&&@'' and ``\lstinline@||@'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline@!=@'' and ``\lstinline@0@'' for user-defined types is enough to allow them to be used in logical expressions.
     509Note that the definitions of ``\lstinline$&&$'' and ``\lstinline$||$'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline$!=$'' and ``\lstinline$0$'' for user-defined types is enough to allow them to be used in logical expressions.
    516510
    517511\item
     
    522516\item
    523517The ``address of'' operator.
    524 It would seem useful to define a unary ``\lstinline@&@'' operator that returns values of some programmer-defined pointer-like type.
     518It would seem useful to define a unary ``\lstinline$&$'' operator that returns values of some programmer-defined pointer-like type.
    525519The problem lies with the type of the operator.
    526 Consider the expression ``\lstinline@p = &x@'', where \lstinline@x@ is of type
    527 \lstinline@T@ and \lstinline@p@ has the programmer-defined type \lstinline@T_ptr@.
    528 The expression might be treated as a call to the unary function ``\lstinline@&?@''.
    529 Now what is the type of the function's parameter? It can not be \lstinline@T@, because then \lstinline@x@ would be passed by value, and there is no way to create a useful pointer-like result from a value.
    530 Hence the parameter must have type \lstinline@T *@.
    531 But then the expression must be rewritten as ``\lstinline@p = &?( &x )@''
     520Consider the expression ``\lstinline$p = &x$'', where \lstinline$x$ is of type
     521\lstinline$T$ and \lstinline$p$ has the programmer-defined type \lstinline$T_ptr$.
     522The expression might be treated as a call to the unary function ``\lstinline$&?$''.
     523Now what is the type of the function's parameter? It can not be \lstinline$T$, because then \lstinline$x$ would be passed by value, and there is no way to create a useful pointer-like result from a value.
     524Hence the parameter must have type \lstinline$T *$.
     525But then the expression must be rewritten as ``\lstinline$p = &?( &x )$''
    532526---which doesn't seem like progress!
    533527
    534528The rule for address-of expressions would have to be something like ``keep applying address-of functions until you get one that takes a pointer argument, then use the built-in operator and stop''.
    535 It seems simpler to define a conversion function from \lstinline@T *@ to \lstinline@T_ptr@.
    536 
    537 \item
    538 The \lstinline@sizeof@ operator.
     529It seems simpler to define a conversion function from \lstinline$T *$ to \lstinline$T_ptr$.
     530
     531\item
     532The \lstinline$sizeof$ operator.
    539533It is already defined for every object type, and intimately tied into the language's storage allocation model.
    540534Redefining it seems pointless.
    541535
    542536\item
    543 The ``member of'' operators ``\lstinline@.@'' and ``\lstinline@->@''.
     537The ``member of'' operators ``\lstinline$.$'' and ``\lstinline$->$''.
    544538These are not really infix operators, since their right ``operand'' is not a value or object.
    545539
     
    578572The ``fewest unsafe conversions'' rule ensures that the usual conversions are done, if possible.
    579573The ``lowest total expression cost'' rule chooses the proper common type.
    580 The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline@(double)-i@ will be preferred to \lstinline@-(double)i@.
     574The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline$(double)-i$ will be preferred to \lstinline$-(double)i$.
    581575
    582576The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such functions are presumably more expensive than monomorphic functions and since the more specific function is presumably more appropriate.
    583577It also gives preference to monomorphic values (such as the
    584 \lstinline@int@ \lstinline@0@) over polymorphic values (such as the \Index{null pointer}
    585 \lstinline@0@\use{0}).
     578\lstinline$int$ \lstinline$0$) over polymorphic values (such as the \Index{null pointer}
     579\lstinline$0$\use{0}).
    586580However, interpretations that call polymorphic functions are preferred to interpretations that perform unsafe conversions, because those conversions potentially lose accuracy or violate strong typing.
    587581
     
    603597\begin{rationale}
    604598Predefined functions and constants have internal linkage because that simplifies optimization in traditional compile-and-link environments.
    605 For instance, ``\lstinline@an_int + an_int@'' is equivalent to ``\lstinline@?+?(an_int, an_int)@''.
     599For instance, ``\lstinline$an_int + an_int$'' is equivalent to ``\lstinline$?+?(an_int, an_int)$''.
    606600If integer addition has not been redefined in the current scope, a compiler can generate code to perform the addition directly.
    607601If predefined functions had external linkage, this optimization would be difficult.
     
    629623\rhs \nonterm{constant}
    630624\rhs \nonterm{string-literal}
    631 \rhs \lstinline@(@ \nonterm{expression} \lstinline@)@
     625\rhs \lstinline$($ \nonterm{expression} \lstinline$)$
    632626\rhs \nonterm{generic-selection}
    633627\end{syntax}
     
    635629\predefined
    636630\begin{lstlisting}
    637 const int 1;§\use{1}§
    638 const int 0;§\use{0}§
     631const int 1;@\use{1}@
     632const int 0;@\use{0}@
    639633forall( dtype DT ) DT * const 0;
    640634forall( ftype FT ) FT * const 0;
     
    645639
    646640A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type and value defined by {\c11}.
    647 The predefined integer identifiers ``\lstinline@1@'' and ``\lstinline@0@'' have the integer values 1 and 0, respectively.
    648 The other two predefined ``\lstinline@0@'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.
     641The predefined integer identifiers ``\lstinline$1$'' and ``\lstinline$0$'' have the integer values 1 and 0, respectively.
     642The other two predefined ``\lstinline$0$'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.
    649643
    650644A parenthesised expression has the same interpretations as the contained \nonterm{expression}.
    651645
    652646\examples
    653 The expression \lstinline@(void *)0@\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline@void@. \lstinline@(const void *)0@ does the same, and also uses a safe conversion from \lstinline@void *@ to \lstinline@const void *@.
     647The expression \lstinline$(void *)0$\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline$void$. \lstinline$(const void *)0$ does the same, and also uses a safe conversion from \lstinline$void *$ to \lstinline$const void *$.
    654648In each case, the null pointer conversion is better\index{best valid interpretations} than the unsafe conversion of the integer
    655 \lstinline@0@ to a pointer.
     649\lstinline$0$ to a pointer.
    656650
    657651\begin{rationale}
     
    659653
    660654\CFA does not have C's concept of ``null pointer constants'', which are not typed values but special strings of tokens.
    661 The C token ``\lstinline@0@'' is an expression of type \lstinline@int@ with the value ``zero'', and it \emph{also} is a null pointer constant.
     655The C token ``\lstinline$0$'' is an expression of type \lstinline$int$ with the value ``zero'', and it \emph{also} is a null pointer constant.
    662656Similarly,
    663 ``\lstinline@(void *)0@ is an expression of type \lstinline@(void *)@ whose value is a null pointer, and it also is a null pointer constant.
    664 However, in C, ``\lstinline@(void *)(void *)0@'' is
     657``\lstinline$(void *)0$ is an expression of type \lstinline$(void *)$ whose value is a null pointer, and it also is a null pointer constant.
     658However, in C, ``\lstinline$(void *)(void *)0$'' is
    665659\emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The semantics of C expressions contain many special cases to deal with subexpressions that are null pointer constants.
    666660
     
    669663\begin{lstlisting}
    670664forall( dtype DT ) DT * const 0;
    671 \end{lstlisting} means that \lstinline@0@ is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.
     665\end{lstlisting} means that \lstinline$0$ is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.
    672666The only such value is the null pointer.
    673667Therefore the type \emph{alone} is enough to identify a null pointer.
     
    679673
    680674\constraints The best interpretation of the controlling expression shall be unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the types named in its generic association list.
    681 If a generic selection has no \lstinline@default@ generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.
     675If a generic selection has no \lstinline$default$ generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.
    682676
    683677\semantics
     
    690684\lhs{postfix-expression}
    691685\rhs \nonterm{primary-expression}
    692 \rhs \nonterm{postfix-expression} \lstinline@[@ \nonterm{expression} \lstinline@]@
    693 \rhs \nonterm{postfix-expression} \lstinline@(@
    694          \nonterm{argument-expression-list}\opt \lstinline@)@
    695 \rhs \nonterm{postfix-expression} \lstinline@.@ \nonterm{identifier}
    696 \rhs \nonterm{postfix-expression} \lstinline@->@ \nonterm{identifier}
    697 \rhs \nonterm{postfix-expression} \lstinline@++@
    698 \rhs \nonterm{postfix-expression} \lstinline@--@
    699 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@}@
    700 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@,@ \lstinline@}@
     686\rhs \nonterm{postfix-expression} \lstinline$[$ \nonterm{expression} \lstinline$]$
     687\rhs \nonterm{postfix-expression} \lstinline$($
     688         \nonterm{argument-expression-list}\opt \lstinline$)$
     689\rhs \nonterm{postfix-expression} \lstinline$.$ \nonterm{identifier}
     690\rhs \nonterm{postfix-expression} \lstinline$->$ \nonterm{identifier}
     691\rhs \nonterm{postfix-expression} \lstinline$++$
     692\rhs \nonterm{postfix-expression} \lstinline$--$
     693\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$}$
     694\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$,$ \lstinline$}$
    701695\lhs{argument-expression-list}
    702696\rhs \nonterm{assignment-expression}
    703 \rhs \nonterm{argument-expression-list} \lstinline@,@
     697\rhs \nonterm{argument-expression-list} \lstinline$,$
    704698         \nonterm{assignment-expression}
    705699\end{syntax}
     
    707701\rewriterules
    708702\begin{lstlisting}
    709 a[b] §\rewrite§ ?[?]( b, a ) // if a has integer type§\use{?[?]}§
    710 a[b] §\rewrite§ ?[?]( a, b ) // otherwise
    711 a( §\emph{arguments}§ ) §\rewrite§ ?()( a, §\emph{arguments}§ )§\use{?()}§
    712 a++ §\rewrite§ ?++(&( a ))§\use{?++}§
    713 a-- §\rewrite§ ?--(&( a ))§\use{?--}§
     703a[b] @\rewrite@ ?[?]( b, a ) // if a has integer type@\use{?[?]}@
     704a[b] @\rewrite@ ?[?]( a, b ) // otherwise
     705a( @\emph{arguments}@ ) @\rewrite@ ?()( a, @\emph{arguments}@ )@\use{?()}@
     706a++ @\rewrite@ ?++(&( a ))@\use{?++}@
     707a-- @\rewrite@ ?--(&( a ))@\use{?--}@
    714708\end{lstlisting}
    715709
     
    719713\predefined
    720714\begin{lstlisting}
    721 forall( otype T ) lvalue T ?[?]( T *, ptrdiff_t );§\use{ptrdiff_t}§
     715forall( otype T ) lvalue T ?[?]( T *, ptrdiff_t );@\use{ptrdiff_t}@
    722716forall( otype T ) lvalue _Atomic T ?[?]( _Atomic T *, ptrdiff_t );
    723717forall( otype T ) lvalue const T ?[?]( const T *, ptrdiff_t );
     
    739733The interpretations of subscript expressions are the interpretations of the corresponding function call expressions.
    740734\begin{rationale}
    741 C defines subscripting as pointer arithmetic in a way that makes \lstinline@a[i]@ and
    742 \lstinline@i[a]@ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline@?[?]@.
     735C defines subscripting as pointer arithmetic in a way that makes \lstinline$a[i]$ and
     736\lstinline$i[a]$ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline$?[?]$.
    743737
    744738Subscript expressions are rewritten as function calls that pass the first parameter by value.
    745739This is somewhat unfortunate, since array-like types tend to be large.
    746 The alternative is to use the rewrite rule ``\lstinline@a[b]@ \rewrite \lstinline@?[?](&(a), b)@''.
    747 However, C semantics forbid this approach: the \lstinline@a@ in ``\lstinline@a[b]@'' can be an arbitrary pointer value, which does not have an address.
     740The alternative is to use the rewrite rule ``\lstinline$a[b]$ \rewrite \lstinline$?[?](&(a), b)$''.
     741However, C semantics forbid this approach: the \lstinline$a$ in ``\lstinline$a[b]$'' can be an arbitrary pointer value, which does not have an address.
    748742
    749743The repetitive form of the predefined identifiers shows up a deficiency\index{deficiencies!pointers
     
    760754\nonterm{postfix-expression} in a function call may have some interpretations that are function designators and some that are not.
    761755
    762 For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``\lstinline@?()@''.
     756For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``\lstinline$?()$''.
    763757The valid interpretations of the rewritten expression are determined in the manner described below.
    764758
     
    768762\item if the argument corresponds to a parameter in the function designator's prototype, the argument interpretation must have the same type as the corresponding parameter, or be implicitly convertible to the parameter's type
    769763\item if the function designator's type does not include a prototype or if the argument corresponds to
    770 ``\lstinline@...@'' in a prototype, a \Index{default argument promotion} is applied to it.
     764``\lstinline$...$'' in a prototype, a \Index{default argument promotion} is applied to it.
    771765\end{itemize}
    772766The type of the valid interpretation is the return type of the function designator.
     
    776770\begin{itemize}
    777771\item
    778 If the declaration of the implicit parameter uses \Index{type-class} \lstinline@type@\use{type}, the implicit argument must be an object type;
    779 if it uses \lstinline@dtype@, the implicit argument must be an object type or an incomplete type;
    780 and if it uses \lstinline@ftype@, the implicit argument must be a function type.
     772If the declaration of the implicit parameter uses \Index{type-class} \lstinline$type$\use{type}, the implicit argument must be an object type;
     773if it uses \lstinline$dtype$, the implicit argument must be an object type or an incomplete type;
     774and if it uses \lstinline$ftype$, the implicit argument must be a function type.
    781775
    782776\item if an explicit parameter's type uses any implicit parameters, then the corresponding explicit argument must have a type that is (or can be safely converted\index{safe conversion} to) the type produced by substituting the implicit arguments for the implicit parameters in the explicit parameter type.
     
    797791\begin{rationale}
    798792One desirable property of a polymorphic programming language is \define{generalizability}: the ability to replace an abstraction with a more general but equivalent abstraction without requiring changes in any of the uses of the original\cite{Cormack90}.
    799 For instance, it should be possible to replace a function ``\lstinline@int f( int );@'' with ``\lstinline@forall( otype T ) T f( T );@'' without affecting any calls of \lstinline@f@.
     793For instance, it should be possible to replace a function ``\lstinline$int f( int );$'' with ``\lstinline$forall( otype T ) T f( T );$'' without affecting any calls of \lstinline$f$.
    800794
    801795\CFA\index{deficiencies!generalizability} does not fully possess this property, because
     
    811805f = g( d, f );          // (3) (unsafe conversion to float)
    812806\end{lstlisting}
    813 If \lstinline@g@ was replaced by ``\lstinline@forall( otype T ) T g( T, T );@'', the first and second calls would be unaffected, but the third would change: \lstinline@f@ would be converted to
    814 \lstinline@double@, and the result would be a \lstinline@double@.
    815 
    816 Another example is the function ``\lstinline@void h( int *);@''.
     807If \lstinline$g$ was replaced by ``\lstinline$forall( otype T ) T g( T, T );$'', the first and second calls would be unaffected, but the third would change: \lstinline$f$ would be converted to
     808\lstinline$double$, and the result would be a \lstinline$double$.
     809
     810Another example is the function ``\lstinline$void h( int *);$''.
    817811This function can be passed a
    818 \lstinline@void *@ argument, but the generalization ``\lstinline@forall( otype T ) void h( T *);@'' can not.
    819 In this case, \lstinline@void@ is not a valid value for \lstinline@T@ because it is not an object type.
    820 If unsafe conversions were allowed, \lstinline@T@ could be inferred to be \emph{any} object type, which is undesirable.
     812\lstinline$void *$ argument, but the generalization ``\lstinline$forall( otype T ) void h( T *);$'' can not.
     813In this case, \lstinline$void$ is not a valid value for \lstinline$T$ because it is not an object type.
     814If unsafe conversions were allowed, \lstinline$T$ could be inferred to be \emph{any} object type, which is undesirable.
    821815\end{rationale}
    822816
    823817\examples
    824 A function called ``\lstinline@?()@'' might be part of a numerical differentiation package.
     818A function called ``\lstinline$?()$'' might be part of a numerical differentiation package.
    825819\begin{lstlisting}
    826820extern otype Derivative;
     
    833827d = sin_dx( 12.9 );
    834828\end{lstlisting}
    835 Here, the only interpretation of \lstinline@sin_dx@ is as an object of type \lstinline@Derivative@.
    836 For that interpretation, the function call is treated as ``\lstinline@?()( sin_dx, 12.9 )@''.
     829Here, the only interpretation of \lstinline$sin_dx$ is as an object of type \lstinline$Derivative$.
     830For that interpretation, the function call is treated as ``\lstinline$?()( sin_dx, 12.9 )$''.
    837831\begin{lstlisting}
    838832int f( long );          // (1)
     
    841835int i = f( 5 );         // calls (1)
    842836\end{lstlisting}
    843 Function (1) provides a valid interpretation of ``\lstinline@f( 5 )@'', using an implicit \lstinline@int@ to \lstinline@long@ conversion.
    844 The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline@int@ to \lstinline@int *@ that could be used with the third function.
     837Function (1) provides a valid interpretation of ``\lstinline$f( 5 )$'', using an implicit \lstinline$int$ to \lstinline$long$ conversion.
     838The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline$int$ to \lstinline$int *$ that could be used with the third function.
    845839
    846840\begin{lstlisting}
     
    848842double d = h( 1.5 );
    849843\end{lstlisting}
    850 ``\lstinline@1.5@'' is a \lstinline@double@ constant, so \lstinline@T@ is inferred to be
    851 \lstinline@double@, and the result of the function call is a \lstinline@double@.
     844``\lstinline$1.5$'' is a \lstinline$double$ constant, so \lstinline$T$ is inferred to be
     845\lstinline$double$, and the result of the function call is a \lstinline$double$.
    852846
    853847\begin{lstlisting}
     
    864858g( i, p );                      // calls (4)
    865859\end{lstlisting}
    866 The first call has valid interpretations for all four versions of \lstinline@g@. (6) and (7) are discarded because they involve unsafe \lstinline@double@-to-\lstinline@long@ conversions. (5) is chosen because it is less polymorphic than (4).
     860The first call has valid interpretations for all four versions of \lstinline$g$. (6) and (7) are discarded because they involve unsafe \lstinline$double$-to-\lstinline$long$ conversions. (5) is chosen because it is less polymorphic than (4).
    867861
    868862For the second call, (7) is again discarded.
    869 Of the remaining interpretations for (4), (5), and (6) (with \lstinline@i@ converted to \lstinline@long@), (6) is chosen because it is the least polymorphic.
     863Of the remaining interpretations for (4), (5), and (6) (with \lstinline$i$ converted to \lstinline$long$), (6) is chosen because it is the least polymorphic.
    870864
    871865The third call has valid interpretations for all of the functions;
     
    876870forall( otype T ) T min( T, T );
    877871double max( double, double );
    878 trait min_max( T ) {§\impl{min_max}§
     872trait min_max( T ) {@\impl{min_max}@
    879873        T min( T, T );
    880874        T max( T, T );
     
    883877shuffle( 9, 10 );
    884878\end{lstlisting}
    885 The only possibility for \lstinline@U@ is \lstinline@double@, because that is the type used in the only visible \lstinline@max@ function. 9 and 10 must be converted to \lstinline@double@, and
    886 \lstinline@min@ must be specialized with \lstinline@T@ bound to \lstinline@double@.
     879The only possibility for \lstinline$U$ is \lstinline$double$, because that is the type used in the only visible \lstinline$max$ function. 9 and 10 must be converted to \lstinline$double$, and
     880\lstinline$min$ must be specialized with \lstinline$T$ bound to \lstinline$double$.
    887881\begin{lstlisting}
    888882extern void q( int );           // (8)
     
    892886r( 0 );
    893887\end{lstlisting}
    894 The \lstinline@int 0@ could be passed to (8), or the \lstinline@(void *)@ \Index{specialization} of the null pointer\index{null pointer} \lstinline@0@\use{0} could be passed to (9).
    895 The former is chosen because the \lstinline@int@ \lstinline@0@ is \Index{less polymorphic}.
    896 For the same reason, \lstinline@int@ \lstinline@0@ is passed to \lstinline@r()@, even though it has \emph{no} declared parameter types.
     888The \lstinline$int 0$ could be passed to (8), or the \lstinline$(void *)$ \Index{specialization} of the null pointer\index{null pointer} \lstinline$0$\use{0} could be passed to (9).
     889The former is chosen because the \lstinline$int$ \lstinline$0$ is \Index{less polymorphic}.
     890For the same reason, \lstinline$int$ \lstinline$0$ is passed to \lstinline$r()$, even though it has \emph{no} declared parameter types.
    897891
    898892
    899893\subsubsection{Structure and union members}
    900894
    901 \semantics In the member selection expression ``\lstinline@s@.\lstinline@m@'', there shall be at least one interpretation of \lstinline@s@ whose type is a structure type or union type containing a member named \lstinline@m@.
    902 If two or more interpretations of \lstinline@s@ have members named
    903 \lstinline@m@ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members.
    904 If an interpretation of \lstinline@s@ has a member \lstinline@m@ whose type is not compatible with any other
    905 \lstinline@s@'s \lstinline@m@, then the expression has an interpretation with the member's type.
     895\semantics In the member selection expression ``\lstinline$s$.\lstinline$m$'', there shall be at least one interpretation of \lstinline$s$ whose type is a structure type or union type containing a member named \lstinline$m$.
     896If two or more interpretations of \lstinline$s$ have members named
     897\lstinline$m$ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members.
     898If an interpretation of \lstinline$s$ has a member \lstinline$m$ whose type is not compatible with any other
     899\lstinline$s$'s \lstinline$m$, then the expression has an interpretation with the member's type.
    906900The expression has no other interpretations.
    907901
    908 The expression ``\lstinline@p->m@'' has the same interpretations as the expression ``\lstinline@(*p).m@''.
     902The expression ``\lstinline$p->m$'' has the same interpretations as the expression
     903``\lstinline$(*p).m$''.
    909904
    910905
     
    1001996        * ?--( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    1002997\end{lstlisting}
    1003 For every extended integer type \lstinline@X@ there exist
     998For every extended integer type \lstinline$X$ there exist
    1004999% Don't use predefined: keep this out of prelude.cf.
    10051000\begin{lstlisting}
     
    10071002  ?--( volatile X * ), ?--( _Atomic volatile X * );
    10081003\end{lstlisting}
    1009 For every complete enumerated type \lstinline@E@ there exist
     1004For every complete enumerated type \lstinline$E$ there exist
    10101005% Don't use predefined: keep this out of prelude.cf.
    10111006\begin{lstlisting}
     
    10151010
    10161011\begin{rationale}
    1017 Note that ``\lstinline@++@'' and ``\lstinline@--@'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.
     1012Note that ``\lstinline$++$'' and ``\lstinline$--$'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.
    10181013This partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues.
    10191014\end{rationale}
     
    10211016\begin{rationale}
    10221017In C, a semantic rule requires that pointer operands of increment and decrement be pointers to object types.
    1023 Hence, \lstinline@void *@ objects cannot be incremented.
    1024 In \CFA, the restriction follows from the use of a \lstinline@type@ parameter in the predefined function definitions, as opposed to \lstinline@dtype@, since only object types can be inferred arguments corresponding to the type parameter \lstinline@T@.
     1018Hence, \lstinline$void *$ objects cannot be incremented.
     1019In \CFA, the restriction follows from the use of a \lstinline$type$ parameter in the predefined function definitions, as opposed to \lstinline$dtype$, since only object types can be inferred arguments corresponding to the type parameter \lstinline$T$.
    10251020\end{rationale}
    10261021
    10271022\semantics
    10281023First, each interpretation of the operand of an increment or decrement expression is considered separately.
    1029 For each interpretation that is a bit-field or is declared with the \Indexc{register}\index{storage-class specifier}, the expression has one valid interpretation, with the type of the operand, and the expression is ambiguous if the operand is.
     1024For each interpretation that is a bit-field or is declared with the
     1025\lstinline$register$\index{register@{\lstinline$register$}} \index{Itorage-class specifier}, the expression has one valid interpretation, with the type of the operand, and the expression is ambiguous if the operand is.
    10301026
    10311027For the remaining interpretations, the expression is rewritten, and the interpretations of the expression are the interpretations of the corresponding function call.
     
    10401036\end{lstlisting}
    10411037\begin{sloppypar}
    1042 Since \lstinline@&(vs)@ has type \lstinline@volatile short int *@, the best valid interpretation of
    1043 \lstinline@vs++@ calls the \lstinline@?++@ function with the \lstinline@volatile short *@ parameter.
    1044 \lstinline@s++@ does the same, applying the safe conversion from \lstinline@short int *@ to \lstinline@volatile short int *@.
    1045 Note that there is no conversion that adds an \lstinline@_Atomic@ qualifier, so the \lstinline@_Atomic volatile short int@ overloading does not provide a valid interpretation.
     1038Since \lstinline$&(vs)$ has type \lstinline$volatile short int *$, the best valid interpretation of
     1039\lstinline$vs++$ calls the \lstinline$?++$ function with the \lstinline$volatile short *$ parameter.
     1040\lstinline$s++$ does the same, applying the safe conversion from \lstinline$short int *$ to
     1041\lstinline$volatile short int *$.
     1042Note that there is no conversion that adds an \lstinline$_Atomic$ qualifier, so the \lstinline$_Atomic volatile short int$ overloading does not provide a valid interpretation.
    10461043\end{sloppypar}
    10471044
    1048 There is no safe conversion from \lstinline@const short int *@ to \lstinline@volatile short int *@, and no \lstinline@?++@ function that accepts a \lstinline@const *@ parameter, so \lstinline@cs++@ has no valid interpretations.
    1049 
    1050 The best valid interpretation of \lstinline@as++@ calls the \lstinline@short ?++@ function with the \lstinline@_Atomic volatile short int *@ parameter, applying a safe conversion to add the \lstinline@volatile@ qualifier.
     1045There is no safe conversion from \lstinline$const short int *$ to \lstinline$volatile short int *$, and no \lstinline$?++$ function that accepts a \lstinline$const *$ parameter, so \lstinline$cs++$ has no valid interpretations.
     1046
     1047The best valid interpretation of \lstinline$as++$ calls the \lstinline$short ?++$ function with the \lstinline$_Atomic volatile short int *$ parameter, applying a safe conversion to add the \lstinline$volatile$ qualifier.
    10511048\begin{lstlisting}
    10521049char * const restrict volatile * restrict volatile pqpc;
     
    10551052ppc++;
    10561053\end{lstlisting}
    1057 Since \lstinline@&(pqpc)@ has type \lstinline@char * const restrict volatile * restrict volatile *@, the best valid interpretation of \lstinline@pqpc++@ calls the polymorphic \lstinline@?++@ function with the \lstinline@const restrict volatile T * restrict volatile *@ parameter, inferring \lstinline@T@ to be \lstinline@char *@.
    1058 
    1059 \lstinline@ppc++@ calls the same function, again inferring \lstinline@T@ to be \lstinline@char *@, and using the safe conversions from \lstinline@T@ to \lstinline@T const@ \lstinline@restrict volatile@.
     1054Since \lstinline$&(pqpc)$ has type \lstinline$char * const restrict volatile * restrict volatile *$, the best valid interpretation of \lstinline$pqpc++$ calls the polymorphic \lstinline$?++$ function with the \lstinline$const restrict volatile T * restrict volatile *$ parameter, inferring \lstinline$T$ to be \lstinline$char *$.
     1055
     1056\lstinline$ppc++$ calls the same function, again inferring \lstinline$T$ to be \lstinline$char *$, and using the safe conversions from \lstinline$T$ to \lstinline$T const$ \lstinline$restrict volatile$.
    10601057
    10611058\begin{rationale}
     
    10711068\begin{enumerate}
    10721069\item
    1073 ``\lstinline@char * p; p++;@''.
    1074 The argument to \lstinline@?++@ has type \lstinline@char * *@, and the result has type \lstinline@char *@.
    1075 The expression would be valid if \lstinline@?++@ were declared by
     1070``\lstinline$char * p; p++;$''.
     1071The argument to \lstinline$?++$ has type \lstinline$char * *$, and the result has type \lstinline$char *$.
     1072The expression would be valid if \lstinline$?++$ were declared by
    10761073\begin{lstlisting}
    10771074forall( otype T ) T * ?++( T * * );
    1078 \end{lstlisting} with \lstinline@T@ inferred to be \lstinline@char@.
    1079 
    1080 \item
    1081 ``\lstinline@char *restrict volatile qp; qp++@''.
    1082 The result again has type \lstinline@char *@, but the argument now has type \lstinline@char *restrict volatile *@, so it cannot be passed to the hypothetical function declared in point 1.
     1075\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$char$.
     1076
     1077\item
     1078``\lstinline$char *restrict volatile qp; qp++$''.
     1079The result again has type \lstinline$char *$, but the argument now has type \lstinline$char *restrict volatile *$, so it cannot be passed to the hypothetical function declared in point 1.
    10831080Hence the actual predefined function is
    10841081\begin{lstlisting}
    10851082forall( otype T ) T * ?++( T * restrict volatile * );
    1086 \end{lstlisting} which also accepts a \lstinline@char * *@ argument, because of the safe conversions that add
    1087 \lstinline@volatile@ and \lstinline@restrict@ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.)
    1088 
    1089 \item
    1090 ``\lstinline@char *_Atomic ap; ap++@''.
    1091 The result again has type \lstinline@char *@, but no safe conversion adds an \lstinline@_Atomic@ qualifier, so the function in point 2 is not applicable.
    1092 A separate overloading of \lstinline@?++@ is required.
    1093 
    1094 \item
    1095 ``\lstinline@char const volatile * pq; pq++@''.
     1083\end{lstlisting} which also accepts a \lstinline$char * *$ argument, because of the safe conversions that add
     1084\lstinline$volatile$ and \lstinline$restrict$ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.)
     1085
     1086\item
     1087``\lstinline$char *_Atomic ap; ap++$''.
     1088The result again has type \lstinline$char *$, but no safe conversion adds an \lstinline$_Atomic$ qualifier, so the function in point 2 is not applicable.
     1089A separate overloading of \lstinline$?++$ is required.
     1090
     1091\item
     1092``\lstinline$char const volatile * pq; pq++$''.
    10961093Here the result has type
    1097 \lstinline@char const volatile *@, so a new overloading is needed:
     1094\lstinline$char const volatile *$, so a new overloading is needed:
    10981095\begin{lstlisting}
    10991096forall( otype T ) T const volatile * ?++( T const volatile *restrict volatile * );
     
    11021099 
    11031100\item
    1104 ``\lstinline@float *restrict * prp; prp++@''.
    1105 The \lstinline@restrict@ qualifier is handled just like \lstinline@const@ and \lstinline@volatile@ in the previous case:
     1101``\lstinline$float *restrict * prp; prp++$''.
     1102The \lstinline$restrict$ qualifier is handled just like \lstinline$const$ and \lstinline$volatile$ in the previous case:
    11061103\begin{lstlisting}
    11071104forall( otype T ) T restrict * ?++( T restrict *restrict volatile * );
    1108 \end{lstlisting} with \lstinline@T@ inferred to be \lstinline@float *@.
    1109 This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline@T@ is not syntactically a pointer type. \CFA loosens the constraint.
     1105\end{lstlisting} with \lstinline$T$ inferred to be \lstinline$float *$.
     1106This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline$T$ is not syntactically a pointer type. \CFA loosens the constraint.
    11101107\end{enumerate}
    11111108\end{rationale}
     
    11231120\lhs{unary-expression}
    11241121\rhs \nonterm{postfix-expression}
    1125 \rhs \lstinline@++@ \nonterm{unary-expression}
    1126 \rhs \lstinline@--@ \nonterm{unary-expression}
     1122\rhs \lstinline$++$ \nonterm{unary-expression}
     1123\rhs \lstinline$--$ \nonterm{unary-expression}
    11271124\rhs \nonterm{unary-operator} \nonterm{cast-expression}
    1128 \rhs \lstinline@sizeof@ \nonterm{unary-expression}
    1129 \rhs \lstinline@sizeof@ \lstinline@(@ \nonterm{type-name} \lstinline@)@
    1130 \lhs{unary-operator} one of \rhs \lstinline@&@ \lstinline@*@ \lstinline@+@ \lstinline@-@ \lstinline@~@ \lstinline@!@
     1125\rhs \lstinline$sizeof$ \nonterm{unary-expression}
     1126\rhs \lstinline$sizeof$ \lstinline$($ \nonterm{type-name} \lstinline$)$
     1127\lhs{unary-operator} one of \rhs \lstinline$&$ \lstinline$*$ \lstinline$+$ \lstinline$-$ \lstinline$~$ \lstinline$!$
    11311128\end{syntax}
    11321129
    11331130\rewriterules
    11341131\begin{lstlisting}
    1135 *a      §\rewrite§ *?( a ) §\use{*?}§
    1136 +a      §\rewrite§ +?( a ) §\use{+?}§
    1137 -a      §\rewrite§ -?( a ) §\use{-?}§
    1138 ~a      §\rewrite§ ~?( a ) §\use{~?}§
    1139 !a      §\rewrite§ !?( a ) §\use{"!?}§
    1140 ++a     §\rewrite§ ++?(&( a )) §\use{++?}§
    1141 --a     §\rewrite§ --?(&( a )) §\use{--?}§
     1132*a      @\rewrite@ *?( a ) @\use{*?}@
     1133+a      @\rewrite@ +?( a ) @\use{+?}@
     1134-a      @\rewrite@ -?( a ) @\use{-?}@
     1135~a      @\rewrite@ ~?( a ) @\use{~?}@
     1136!a      @\rewrite@ !?( a ) @\use{"!?}@
     1137++a     @\rewrite@ ++?(&( a )) @\use{++?}@
     1138--a     @\rewrite@ --?(&( a )) @\use{--?}@
    11421139\end{lstlisting}
    11431140
     
    12351232        * --?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    12361233\end{lstlisting}
    1237 For every extended integer type \lstinline@X@ there exist
     1234For every extended integer type \lstinline$X$ there exist
    12381235% Don't use predefined: keep this out of prelude.cf.
    12391236\begin{lstlisting}
     
    12431240        --?( _Atomic volatile X * );
    12441241\end{lstlisting}
    1245 For every complete enumerated type \lstinline@E@ there exist
     1242For every complete enumerated type \lstinline$E$ there exist
    12461243% Don't use predefined: keep this out of prelude.cf.
    12471244\begin{lstlisting}
     
    12801277
    12811278\constraints
    1282 The operand of the unary ``\lstinline@&@'' operator shall have exactly one
     1279The operand of the unary ``\lstinline$&$'' operator shall have exactly one
    12831280\Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous.
    12841281
    12851282\semantics
    1286 The ``\lstinline@&@'' expression has one interpretation which is of type \lstinline@T *@, where
    1287 \lstinline@T@ is the type of the operand.
     1283The ``\lstinline$&$'' expression has one interpretation which is of type \lstinline$T *$, where
     1284\lstinline$T$ is the type of the operand.
    12881285
    12891286The interpretations of an indirection expression are the interpretations of the corresponding function call.
     
    13141311forall( ftype FT ) int !?( FT * );
    13151312\end{lstlisting}
    1316 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1313For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    13171314% Don't use predefined: keep this out of prelude.cf.
    13181315\begin{lstlisting}
     
    13271324\begin{lstlisting}
    13281325long int li;
    1329 void eat_double( double );§\use{eat_double}§
    1330 eat_double(-li ); // §\rewrite§ eat_double( -?( li ) );
    1331 \end{lstlisting}
    1332 The valid interpretations of ``\lstinline@-li@'' (assuming no extended integer types exist) are
     1326void eat_double( double );@\use{eat_double}@
     1327eat_double(-li ); // @\rewrite@ eat_double( -?( li ) );
     1328\end{lstlisting}
     1329The valid interpretations of ``\lstinline$-li$'' (assuming no extended integer types exist) are
    13331330\begin{center}
    13341331\begin{tabular}{llc} interpretation & result type & expression conversion cost \\
    13351332\hline
    1336 \lstinline@-?( (int)li )@                                       & \lstinline@int@                                       & (unsafe) \\
    1337 \lstinline@-?( (unsigned)li)@                           & \lstinline@unsigned int@                      & (unsafe) \\
    1338 \lstinline@-?( (long)li)@                                       & \lstinline@long@                                      & 0 \\
    1339 \lstinline@-?( (long unsigned int)li)@          & \lstinline@long unsigned int@         & 1 \\
    1340 \lstinline@-?( (long long int)li)@                      & \lstinline@long long int@                     & 2 \\
    1341 \lstinline@-?( (long long unsigned int)li)@     & \lstinline@long long unsigned int@& 3 \\
    1342 \lstinline@-?( (float)li)@                                      & \lstinline@float@                                     & 4 \\
    1343 \lstinline@-?( (double)li)@                                     & \lstinline@double@                            & 5 \\
    1344 \lstinline@-?( (long double)li)@                        & \lstinline@long double@                       & 6 \\
    1345 \lstinline@-?( (_Complex float)li)@                     & \lstinline@float@                                     & (unsafe) \\
    1346 \lstinline@-?( (_Complex double)li)@            & \lstinline@double@                            & (unsafe) \\
    1347 \lstinline@-?( (_Complex long double)li)@       & \lstinline@long double@                       & (unsafe) \\
     1333\lstinline$-?( (int)li )$                                       & \lstinline$int$                                       & (unsafe) \\
     1334\lstinline$-?( (unsigned)li)$                           & \lstinline$unsigned int$                      & (unsafe) \\
     1335\lstinline$-?( (long)li)$                                       & \lstinline$long$                                      & 0 \\
     1336\lstinline$-?( (long unsigned int)li)$          & \lstinline$long unsigned int$         & 1 \\
     1337\lstinline$-?( (long long int)li)$                      & \lstinline$long long int$                     & 2 \\
     1338\lstinline$-?( (long long unsigned int)li)$     & \lstinline$long long unsigned int$& 3 \\
     1339\lstinline$-?( (float)li)$                                      & \lstinline$float$                                     & 4 \\
     1340\lstinline$-?( (double)li)$                                     & \lstinline$double$                            & 5 \\
     1341\lstinline$-?( (long double)li)$                        & \lstinline$long double$                       & 6 \\
     1342\lstinline$-?( (_Complex float)li)$                     & \lstinline$float$                                     & (unsafe) \\
     1343\lstinline$-?( (_Complex double)li)$            & \lstinline$double$                            & (unsafe) \\
     1344\lstinline$-?( (_Complex long double)li)$       & \lstinline$long double$                       & (unsafe) \\
    13481345\end{tabular}
    13491346\end{center}
    1350 The valid interpretations of the \lstinline@eat_double@ call, with the cost of the argument conversion and the cost of the entire expression, are
     1347The valid interpretations of the \lstinline$eat_double$ call, with the cost of the argument conversion and the cost of the entire expression, are
    13511348\begin{center}
    13521349\begin{tabular}{lcc} interpretation & argument cost & expression cost \\
    13531350\hline
    1354 \lstinline@eat_double( (double)-?( (int)li) )@                                  & 7                     & (unsafe) \\
    1355 \lstinline@eat_double( (double)-?( (unsigned)li) )@                             & 6                     & (unsafe) \\
    1356 \lstinline@eat_double( (double)-?(li) )@                                                & 5                     & \(0+5=5\) \\
    1357 \lstinline@eat_double( (double)-?( (long unsigned int)li) )@    & 4                     & \(1+4=5\) \\
    1358 \lstinline@eat_double( (double)-?( (long long int)li) )@                & 3                     & \(2+3=5\) \\
    1359 \lstinline@eat_double( (double)-?( (long long unsigned int)li) )@& 2            & \(3+2=5\) \\
    1360 \lstinline@eat_double( (double)-?( (float)li) )@                                & 1                     & \(4+1=5\) \\
    1361 \lstinline@eat_double( (double)-?( (double)li) )@                               & 0                     & \(5+0=5\) \\
    1362 \lstinline@eat_double( (double)-?( (long double)li) )@                  & (unsafe)      & (unsafe) \\
    1363 \lstinline@eat_double( (double)-?( (_Complex float)li) )@               & (unsafe)      & (unsafe) \\
    1364 \lstinline@eat_double( (double)-?( (_Complex double)li) )@              & (unsafe)      & (unsafe) \\
    1365 \lstinline@eat_double( (double)-?( (_Complex long double)li) )@ & (unsafe)      & (unsafe) \\
     1351\lstinline$eat_double( (double)-?( (int)li) )$                                  & 7                     & (unsafe) \\
     1352\lstinline$eat_double( (double)-?( (unsigned)li) )$                             & 6                     & (unsafe) \\
     1353\lstinline$eat_double( (double)-?(li) )$                                                & 5                     & \(0+5=5\) \\
     1354\lstinline$eat_double( (double)-?( (long unsigned int)li) )$    & 4                     & \(1+4=5\) \\
     1355\lstinline$eat_double( (double)-?( (long long int)li) )$                & 3                     & \(2+3=5\) \\
     1356\lstinline$eat_double( (double)-?( (long long unsigned int)li) )$& 2            & \(3+2=5\) \\
     1357\lstinline$eat_double( (double)-?( (float)li) )$                                & 1                     & \(4+1=5\) \\
     1358\lstinline$eat_double( (double)-?( (double)li) )$                               & 0                     & \(5+0=5\) \\
     1359\lstinline$eat_double( (double)-?( (long double)li) )$                  & (unsafe)      & (unsafe) \\
     1360\lstinline$eat_double( (double)-?( (_Complex float)li) )$               & (unsafe)      & (unsafe) \\
     1361\lstinline$eat_double( (double)-?( (_Complex double)li) )$              & (unsafe)      & (unsafe) \\
     1362\lstinline$eat_double( (double)-?( (_Complex long double)li) )$ & (unsafe)      & (unsafe) \\
    13661363\end{tabular}
    13671364\end{center}
    1368 Each has result type \lstinline@void@, so the best must be selected.
     1365Each has result type \lstinline$void$, so the best must be selected.
    13691366The interpretations involving unsafe conversions are discarded.
    13701367The remainder have equal expression conversion costs, so the
    13711368``highest argument conversion cost'' rule is invoked, and the chosen interpretation is
    1372 \lstinline@eat_double( (double)-?(li) )@.
    1373 
    1374 
    1375 \subsubsection[The sizeof and \_Alignof operators]{The \lstinline@sizeof@ and \lstinline@_Alignof@ operators}
     1369\lstinline$eat_double( (double)-?(li) )$.
     1370
     1371
     1372\subsubsection{The \lstinline$sizeof$ and \lstinline$_Alignof$ operators}
    13761373
    13771374\constraints
    1378 The operand of \lstinline@sizeof@ or \lstinline@_Alignof@ shall not be \lstinline@type@, \lstinline@dtype@, or \lstinline@ftype@.
    1379 
    1380 When the \lstinline@sizeof@\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline@sizeof@ or \lstinline@_Alignof@ expression has one interpretation, of type \lstinline@size_t@.
    1381 
    1382 When \lstinline@sizeof@ is applied to an identifier declared by a \nonterm{type-declaration} or a
     1375The operand of \lstinline$sizeof$ or \lstinline$_Alignof$ shall not be \lstinline$type$,
     1376\lstinline$dtype$, or \lstinline$ftype$.
     1377
     1378When the \lstinline$sizeof$\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline$sizeof$ or \lstinline$_Alignof$ expression has one interpretation, of type \lstinline$size_t$.
     1379
     1380When \lstinline$sizeof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
    13831381\nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand.
    13841382When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
    13851383
    1386 When \lstinline@_Alignof@ is applied to an identifier declared by a \nonterm{type-declaration} or a
     1384When \lstinline$_Alignof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
    13871385\nonterm{type-parameter}, it yields the alignment requirement of the type that implements the operand.
    13881386When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression.
     
    13911389otype Pair = struct { int first, second; };
    13921390size_t p_size = sizeof(Pair);           // constant expression
    1393 extern otype Rational;§\use{Rational}§
     1391extern otype Rational;@\use{Rational}@
    13941392size_t c_size = sizeof(Rational);       // non-constant expression
    13951393forall(type T) T f(T p1, T p2) {
     
    13981396}
    13991397\end{lstlisting}
    1400 ``\lstinline@sizeof Rational@'', although not statically known, is fixed.
    1401 Within \lstinline@f()@,
    1402 ``\lstinline@sizeof(T)@'' is fixed for each call of \lstinline@f()@, but may vary from call to call.
     1398``\lstinline$sizeof Rational$'', although not statically known, is fixed.
     1399Within \lstinline$f()$,
     1400``\lstinline$sizeof(T)$'' is fixed for each call of \lstinline$f()$, but may vary from call to call.
    14031401\end{rationale}
    14041402
     
    14091407\lhs{cast-expression}
    14101408\rhs \nonterm{unary-expression}
    1411 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \nonterm{cast-expression}
     1409\rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \nonterm{cast-expression}
    14121410\end{syntax}
    14131411
    14141412\constraints
    1415 The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline@type@,
    1416 \lstinline@dtype@, or \lstinline@ftype@.
     1413The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline$type$,
     1414\lstinline$dtype$, or \lstinline$ftype$.
    14171415
    14181416\semantics
    14191417
    1420 In a \Index{cast expression} ``\lstinline@(@\nonterm{type-name}\lstinline@)e@'', if
    1421 \nonterm{type-name} is the type of an interpretation of \lstinline@e@, then that interpretation is the only interpretation of the cast expression;
    1422 otherwise, \lstinline@e@ shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.
     1418In a \Index{cast expression} ``\lstinline$($\nonterm{type-name}\lstinline$)e$'', if
     1419\nonterm{type-name} is the type of an interpretation of \lstinline$e$, then that interpretation is the only interpretation of the cast expression;
     1420otherwise, \lstinline$e$ shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.
    14231421The cast expression's interpretation is ambiguous\index{ambiguous interpretation} if more than one interpretation can be converted at the lowest cost or if the selected interpretation is ambiguous.
    14241422
     
    14331431\lhs{multiplicative-expression}
    14341432\rhs \nonterm{cast-expression}
    1435 \rhs \nonterm{multiplicative-expression} \lstinline@*@ \nonterm{cast-expression}
    1436 \rhs \nonterm{multiplicative-expression} \lstinline@/@ \nonterm{cast-expression}
    1437 \rhs \nonterm{multiplicative-expression} \lstinline@%@ \nonterm{cast-expression}
     1433\rhs \nonterm{multiplicative-expression} \lstinline$*$ \nonterm{cast-expression}
     1434\rhs \nonterm{multiplicative-expression} \lstinline$/$ \nonterm{cast-expression}
     1435\rhs \nonterm{multiplicative-expression} \lstinline$%$ \nonterm{cast-expression}
    14381436\end{syntax}
    14391437
    14401438\rewriterules
    14411439\begin{lstlisting}
    1442 a * b §\rewrite§ ?*?( a, b )§\use{?*?}§
    1443 a / b §\rewrite§ ?/?( a, b )§\use{?/?}§
    1444 a % b §\rewrite§ ?%?( a, b )§\use{?%?}§
     1440a * b @\rewrite@ ?*?( a, b )@\use{?*?}@
     1441a / b @\rewrite@ ?/?( a, b )@\use{?/?}@
     1442a % b @\rewrite@ ?%?( a, b )@\use{?%?}@
    14451443\end{lstlisting}
    14461444
     
    14691467        ?*?( _Complex long double, _Complex long double ), ?/?( _Complex long double, _Complex long double );
    14701468\end{lstlisting}
    1471 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1469For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    14721470% Don't use predefined: keep this out of prelude.cf.
    14731471\begin{lstlisting}
     
    14871485int i;
    14881486long li;
    1489 void eat_double( double );§\use{eat_double}§
     1487void eat_double( double );@\use{eat_double}@
    14901488eat_double( li % i );
    14911489\end{lstlisting}
    1492 ``\lstinline@li % i@'' is rewritten as ``\lstinline@?%?(li, i )@''.
    1493 The valid interpretations of \lstinline@?%?(li, i )@, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline@double@ (assuming no extended integer types are present ) are
     1490``\lstinline$li % i$'' is rewritten as ``\lstinline$?%?(li, i )$''.
     1491The valid interpretations of \lstinline$?%?(li, i )$, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline$double$ (assuming no extended integer types are present ) are
    14941492\begin{center}
    14951493\begin{tabular}{lcc} interpretation & argument cost & result cost \\
    14961494\hline
    1497 \lstinline@ ?%?( (int)li, i )@                                                                          & (unsafe)      & 6     \\
    1498 \lstinline@ ?%?( (unsigned)li,(unsigned)i )@                                            & (unsafe)      & 5     \\
    1499 \lstinline@ ?%?( li, (long)i )@                                                                         & 1                     & 4     \\
    1500 \lstinline@ ?%?( (long unsigned)li,(long unsigned)i )@                          & 3                     & 3     \\
    1501 \lstinline@ ?%?( (long long)li,(long long)i )@                                          & 5                     & 2     \\
    1502 \lstinline@ ?%?( (long long unsigned)li, (long long unsigned)i )@       & 7                     & 1     \\
     1495\lstinline$ ?%?( (int)li, i )$                                                                          & (unsafe)      & 6     \\
     1496\lstinline$ ?%?( (unsigned)li,(unsigned)i )$                                            & (unsafe)      & 5     \\
     1497\lstinline$ ?%?( li, (long)i )$                                                                         & 1                     & 4     \\
     1498\lstinline$ ?%?( (long unsigned)li,(long unsigned)i )$                          & 3                     & 3     \\
     1499\lstinline$ ?%?( (long long)li,(long long)i )$                                          & 5                     & 2     \\
     1500\lstinline$ ?%?( (long long unsigned)li, (long long unsigned)i )$       & 7                     & 1     \\
    15031501\end{tabular}
    15041502\end{center}
    1505 The best interpretation of \lstinline@eat_double( li, i )@ is
    1506 \lstinline@eat_double( (double)?%?(li, (long)i ))@, which has no unsafe conversions and the lowest total cost.
    1507 
    1508 \begin{rationale}
    1509 {\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline@int@.If
    1510 \lstinline@s@ is a \lstinline@short int@, ``\lstinline@s *s@'' does not have type \lstinline@short int@;
    1511 it is treated as ``\lstinline@( (int)s ) * ( (int)s )@'', and has type \lstinline@int@. \CFA matches that pattern;
    1512 it does not predefine ``\lstinline@short ?*?( short, short )@''.
     1503The best interpretation of \lstinline$eat_double( li, i )$ is
     1504\lstinline$eat_double( (double)?%?(li, (long)i ))$, which has no unsafe conversions and the lowest total cost.
     1505
     1506\begin{rationale}
     1507{\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline$int$.If
     1508\lstinline$s$ is a \lstinline$short int$, ``\lstinline$s *s$'' does not have type \lstinline$short int$;
     1509it is treated as ``\lstinline$( (int)s ) * ( (int)s )$'', and has type \lstinline$int$. \CFA matches that pattern;
     1510it does not predefine ``\lstinline$short ?*?( short, short )$''.
    15131511
    15141512These ``missing'' operators limit polymorphism.
     
    15191517square( s );
    15201518\end{lstlisting}
    1521 Since \CFA does not define a multiplication operator for \lstinline@short int@,
    1522 \lstinline@square( s )@ is treated as \lstinline@square( (int)s )@, and the result has type
    1523 \lstinline@int@.
     1519Since \CFA does not define a multiplication operator for \lstinline$short int$,
     1520\lstinline$square( s )$ is treated as \lstinline$square( (int)s )$, and the result has type
     1521\lstinline$int$.
    15241522This is mildly surprising, but it follows the {\c11} operator pattern.
    15251523
     
    15311529\end{lstlisting}
    15321530This has no valid interpretations, because \CFA has no conversion from ``array of
    1533 \lstinline@short int@'' to ``array of \lstinline@int@''.
     1531\lstinline$short int$'' to ``array of \lstinline$int$''.
    15341532The alternatives in such situations include
    15351533\begin{itemize}
    15361534\item
    1537 Defining monomorphic overloadings of \lstinline@product@ for \lstinline@short@ and the other
     1535Defining monomorphic overloadings of \lstinline$product$ for \lstinline$short$ and the other
    15381536``small'' types.
    15391537\item
    1540 Defining ``\lstinline@short ?*?( short, short )@'' within the scope containing the call to
    1541 \lstinline@product@.
    1542 \item
    1543 Defining \lstinline@product@ to take as an argument a conversion function from the ``small'' type to the operator's argument type.
     1538Defining ``\lstinline$short ?*?( short, short )$'' within the scope containing the call to
     1539\lstinline$product$.
     1540\item
     1541Defining \lstinline$product$ to take as an argument a conversion function from the ``small'' type to the operator's argument type.
    15441542\end{itemize}
    15451543\end{rationale}
     
    15511549\lhs{additive-expression}
    15521550\rhs \nonterm{multiplicative-expression}
    1553 \rhs \nonterm{additive-expression} \lstinline@+@ \nonterm{multiplicative-expression}
    1554 \rhs \nonterm{additive-expression} \lstinline@-@ \nonterm{multiplicative-expression}
     1551\rhs \nonterm{additive-expression} \lstinline$+$ \nonterm{multiplicative-expression}
     1552\rhs \nonterm{additive-expression} \lstinline$-$ \nonterm{multiplicative-expression}
    15551553\end{syntax}
    15561554
    15571555\rewriterules
    15581556\begin{lstlisting}
    1559 a + b §\rewrite§ ?+?( a, b )§\use{?+?}§
    1560 a - b §\rewrite§ ?-?( a, b )§\use{?-?}§
     1557a + b @\rewrite@ ?+?( a, b )@\use{?+?}@
     1558a - b @\rewrite@ ?-?( a, b )@\use{?-?}@
    15611559\end{lstlisting}
    15621560
     
    16111609        * ?-?( _Atomic const restrict volatile T *, _Atomic const restrict volatile T * );
    16121610\end{lstlisting}
    1613 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1611For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    16141612% Don't use predefined: keep this out of prelude.cf.
    16151613\begin{lstlisting}
     
    16211619
    16221620\begin{rationale}
    1623 \lstinline@ptrdiff_t@ is an implementation-defined identifier defined in \lstinline@<stddef.h>@ that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.
     1621\lstinline$ptrdiff_t$ is an implementation-defined identifier defined in \lstinline$<stddef.h>$ that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.
    16241622It seems reasonable to use it for pointer addition as well. (This is technically a difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral} argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition.
    1625 The {\c11} standard uses \lstinline@size_t@ in several cases where a library function takes an argument that is used as a subscript, but \lstinline@size_t@ is unsuitable here because it is an unsigned type.
     1623The {\c11} standard uses \lstinline$size_t$ in several cases where a library function takes an argument that is used as a subscript, but \lstinline$size_t$ is unsuitable here because it is an unsigned type.
    16261624\end{rationale}
    16271625
     
    16321630\lhs{shift-expression}
    16331631\rhs \nonterm{additive-expression}
    1634 \rhs \nonterm{shift-expression} \lstinline@<<@ \nonterm{additive-expression}
    1635 \rhs \nonterm{shift-expression} \lstinline@>>@ \nonterm{additive-expression}
     1632\rhs \nonterm{shift-expression} \lstinline$<<$ \nonterm{additive-expression}
     1633\rhs \nonterm{shift-expression} \lstinline$>>$ \nonterm{additive-expression}
    16361634\end{syntax}
    16371635
    16381636\rewriterules \use{?>>?}%use{?<<?}
    16391637\begin{lstlisting}
    1640 a << b §\rewrite§ ?<<?( a, b )
    1641 a >> b §\rewrite§ ?>>?( a, b )
     1638a << b @\rewrite@ ?<<?( a, b )
     1639a >> b @\rewrite@ ?>>?( a, b )
    16421640\end{lstlisting}
    16431641
     
    16511649long long unsigned int ?<<?( long long unsigned int, int ), ?>>?( long long unsigned int, int);
    16521650\end{lstlisting}
    1653 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1651For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    16541652% Don't use predefined: keep this out of prelude.cf.
    16551653\begin{lstlisting}
     
    16711669\lhs{relational-expression}
    16721670\rhs \nonterm{shift-expression}
    1673 \rhs \nonterm{relational-expression} \lstinline@< @ \nonterm{shift-expression}
    1674 \rhs \nonterm{relational-expression} \lstinline@> @ \nonterm{shift-expression}
    1675 \rhs \nonterm{relational-expression} \lstinline@<=@ \nonterm{shift-expression}
    1676 \rhs \nonterm{relational-expression} \lstinline@>=@ \nonterm{shift-expression}
     1671\rhs \nonterm{relational-expression} \lstinline$< $ \nonterm{shift-expression}
     1672\rhs \nonterm{relational-expression} \lstinline$> $ \nonterm{shift-expression}
     1673\rhs \nonterm{relational-expression} \lstinline$<=$ \nonterm{shift-expression}
     1674\rhs \nonterm{relational-expression} \lstinline$>=$ \nonterm{shift-expression}
    16771675\end{syntax}
    16781676
    16791677\rewriterules\use{?>?}\use{?>=?}%use{?<?}%use{?<=?}
    16801678\begin{lstlisting}
    1681 a < b §\rewrite§ ?<?( a, b )
    1682 a > b §\rewrite§ ?>?( a, b )
    1683 a <= b §\rewrite§ ?<=?( a, b )
    1684 a >= b §\rewrite§ ?>=?( a, b )
     1679a < b @\rewrite@ ?<?( a, b )
     1680a > b @\rewrite@ ?>?( a, b )
     1681a <= b @\rewrite@ ?<=?( a, b )
     1682a >= b @\rewrite@ ?>=?( a, b )
    16851683\end{lstlisting}
    16861684
     
    17141712        ?>=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * );
    17151713\end{lstlisting}
    1716 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1714For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    17171715% Don't use predefined: keep this out of prelude.cf.
    17181716\begin{lstlisting}
     
    17321730\lhs{equality-expression}
    17331731\rhs \nonterm{relational-expression}
    1734 \rhs \nonterm{equality-expression} \lstinline@==@ \nonterm{relational-expression}
    1735 \rhs \nonterm{equality-expression} \lstinline@!=@ \nonterm{relational-expression}
     1732\rhs \nonterm{equality-expression} \lstinline$==$ \nonterm{relational-expression}
     1733\rhs \nonterm{equality-expression} \lstinline$!=$ \nonterm{relational-expression}
    17361734\end{syntax}
    17371735
    17381736\rewriterules
    17391737\begin{lstlisting}
    1740 a == b §\rewrite§ ?==?( a, b )§\use{?==?}§
    1741 a != b §\rewrite§ ?!=?( a, b )§\use{?"!=?}§
     1738a == b @\rewrite@ ?==?( a, b )@\use{?==?}@
     1739a != b @\rewrite@ ?!=?( a, b )@\use{?"!=?}@
    17421740\end{lstlisting}
    17431741
     
    17921790        ?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ), ?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * );
    17931791\end{lstlisting}
    1794 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1792For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    17951793% Don't use predefined: keep this out of prelude.cf.
    17961794\begin{lstlisting}
     
    18001798
    18011799\begin{rationale}
    1802 The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline@void@ and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.
     1800The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline$void$ and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.
    18031801In the last case, a special constraint rule for null pointer constant operands has been replaced by a consequence of the \CFA type system.
    18041802\end{rationale}
     
    18211819\lhs{AND-expression}
    18221820\rhs \nonterm{equality-expression}
    1823 \rhs \nonterm{AND-expression} \lstinline@&@ \nonterm{equality-expression}
     1821\rhs \nonterm{AND-expression} \lstinline$&$ \nonterm{equality-expression}
    18241822\end{syntax}
    18251823
    18261824\rewriterules
    18271825\begin{lstlisting}
    1828 a & b §\rewrite§ ?&?( a, b )§\use{?&?}§
     1826a & b @\rewrite@ ?&?( a, b )@\use{?&?}@
    18291827\end{lstlisting}
    18301828
     
    18381836long long unsigned int ?&?( long long unsigned int, long long unsigned int );
    18391837\end{lstlisting}
    1840 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1838For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    18411839% Don't use predefined: keep this out of prelude.cf.
    18421840\begin{lstlisting}
     
    18531851\lhs{exclusive-OR-expression}
    18541852\rhs \nonterm{AND-expression}
    1855 \rhs \nonterm{exclusive-OR-expression} \lstinline@^@ \nonterm{AND-expression}
     1853\rhs \nonterm{exclusive-OR-expression} \lstinline$^$ \nonterm{AND-expression}
    18561854\end{syntax}
    18571855
    18581856\rewriterules
    18591857\begin{lstlisting}
    1860 a ^ b §\rewrite§ ?^?( a, b )§\use{?^?}§
     1858a ^ b @\rewrite@ ?^?( a, b )@\use{?^?}@
    18611859\end{lstlisting}
    18621860
     
    18701868long long unsigned int ?^?( long long unsigned int, long long unsigned int );
    18711869\end{lstlisting}
    1872 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1870For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    18731871% Don't use predefined: keep this out of prelude.cf.
    18741872\begin{lstlisting}
     
    18851883\lhs{inclusive-OR-expression}
    18861884\rhs \nonterm{exclusive-OR-expression}
    1887 \rhs \nonterm{inclusive-OR-expression} \lstinline@|@ \nonterm{exclusive-OR-expression}
     1885\rhs \nonterm{inclusive-OR-expression} \lstinline$|$ \nonterm{exclusive-OR-expression}
    18881886\end{syntax}
    18891887
    18901888\rewriterules\use{?"|?}
    18911889\begin{lstlisting}
    1892 a | b §\rewrite§ ?|?( a, b )
     1890a | b @\rewrite@ ?|?( a, b )
    18931891\end{lstlisting}
    18941892
     
    19021900long long unsigned int ?|?( long long unsigned int, long long unsigned int );
    19031901\end{lstlisting}
    1904 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@ there exist
     1902For every extended integer type \lstinline$X$ with \Index{integer conversion rank} greater than the rank of \lstinline$int$ there exist
    19051903% Don't use predefined: keep this out of prelude.cf.
    19061904\begin{lstlisting}
     
    19171915\lhs{logical-AND-expression}
    19181916\rhs \nonterm{inclusive-OR-expression}
    1919 \rhs \nonterm{logical-AND-expression} \lstinline@&&@ \nonterm{inclusive-OR-expression}
     1917\rhs \nonterm{logical-AND-expression} \lstinline$&&$ \nonterm{inclusive-OR-expression}
    19201918\end{syntax}
    19211919
    1922 \semantics The operands of the expression ``\lstinline@a && b@'' are treated as
    1923 ``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b)!=0)@'', which shall both be unambiguous.
    1924 The expression has only one interpretation, which is of type \lstinline@int@.
    1925 \begin{rationale}
    1926 When the operands of a logical expression are values of built-in types, and ``\lstinline@!=@'' has not been redefined for those types, the compiler can optimize away the function calls.
    1927 
    1928 A common C idiom omits comparisons to \lstinline@0@ in the controlling expressions of loops and
    1929 \lstinline@if@ statements.
    1930 For instance, the loop below iterates as long as \lstinline@rp@ points at a \lstinline@Rational@ value that is non-zero.
    1931 
    1932 \begin{lstlisting}
    1933 extern otype Rational;§\use{Rational}§
    1934 extern const Rational 0;§\use{0}§
     1920\semantics The operands of the expression ``\lstinline$a && b$'' are treated as
     1921``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b)!=0)$'', which shall both be unambiguous.
     1922The expression has only one interpretation, which is of type \lstinline$int$.
     1923\begin{rationale}
     1924When the operands of a logical expression are values of built-in types, and ``\lstinline$!=$'' has not been redefined for those types, the compiler can optimize away the function calls.
     1925
     1926A common C idiom omits comparisons to \lstinline$0$ in the controlling expressions of loops and
     1927\lstinline$if$ statements.
     1928For instance, the loop below iterates as long as \lstinline$rp$ points at a \lstinline$Rational$ value that is non-zero.
     1929
     1930\begin{lstlisting}
     1931extern otype Rational;@\use{Rational}@
     1932extern const Rational 0;@\use{0}@
    19351933extern int ?!=?( Rational, Rational );
    19361934Rational *rp;
    19371935while ( rp && *rp ) { ... }
    19381936\end{lstlisting}
    1939 The logical expression calls the \lstinline@Rational@ inequality operator, passing it \lstinline@*rp@ and the \lstinline@Rational 0@, and getting a 1 or 0 as a result.
    1940 In contrast, {\CC} would apply a programmer-defined \lstinline@Rational@-to-\lstinline@int@ conversion to \lstinline@*rp@ in the equivalent situation.
    1941 The conversion to \lstinline@int@ would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.
     1937The logical expression calls the \lstinline$Rational$ inequality operator, passing it \lstinline$*rp$ and the \lstinline$Rational 0$, and getting a 1 or 0 as a result.
     1938In contrast, {\CC} would apply a programmer-defined \lstinline$Rational$-to-\lstinline$int$ conversion to \lstinline$*rp$ in the equivalent situation.
     1939The conversion to \lstinline$int$ would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.
    19421940\end{rationale}
    19431941
     
    19481946\lhs{logical-OR-expression}
    19491947\rhs \nonterm{logical-AND-expression}
    1950 \rhs \nonterm{logical-OR-expression} \lstinline@||@ \nonterm{logical-AND-expression}
     1948\rhs \nonterm{logical-OR-expression} \lstinline$||$ \nonterm{logical-AND-expression}
    19511949\end{syntax}
    19521950
    19531951\semantics
    19541952
    1955 The operands of the expression ``\lstinline@a || b@'' are treated as ``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b))!=0)@'', which shall both be unambiguous.
    1956 The expression has only one interpretation, which is of type \lstinline@int@.
     1953The operands of the expression ``\lstinline$a || b$'' are treated as ``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b))!=0)$'', which shall both be unambiguous.
     1954The expression has only one interpretation, which is of type \lstinline$int$.
    19571955
    19581956
     
    19621960\lhs{conditional-expression}
    19631961\rhs \nonterm{logical-OR-expression}
    1964 \rhs \nonterm{logical-OR-expression} \lstinline@?@ \nonterm{expression}
    1965          \lstinline@:@ \nonterm{conditional-expression}
     1962\rhs \nonterm{logical-OR-expression} \lstinline$?$ \nonterm{expression}
     1963         \lstinline$:$ \nonterm{conditional-expression}
    19661964\end{syntax}
    19671965
    19681966\semantics
    1969 In the conditional expression\use{?:} ``\lstinline@a?b:c@'', if the second and third operands both have an interpretation with \lstinline@void@ type, then the expression has an interpretation with type \lstinline@void@, equivalent to
     1967In the conditional expression\use{?:} ``\lstinline$a?b:c$'', if the second and third operands both have an interpretation with \lstinline$void$ type, then the expression has an interpretation with type \lstinline$void$, equivalent to
    19701968\begin{lstlisting}
    19711969( int)(( a)!=0) ? ( void)( b) : ( void)( c)
    19721970\end{lstlisting}
    19731971
    1974 If the second and third operands both have interpretations with non-\lstinline@void@ types, the expression is treated as if it were the call ``\lstinline@cond((a)!=0, b, c)@'', with \lstinline@cond@ declared as
     1972If the second and third operands both have interpretations with non-\lstinline$void$ types, the expression is treated as if it were the call ``\lstinline$cond((a)!=0, b, c)$'', with \lstinline$cond$ declared as
    19751973\begin{lstlisting}
    19761974forall( otype T ) T cond( int, T, T );
     
    20242022rand() ? i : l;
    20252023\end{lstlisting}
    2026 The best interpretation infers the expression's type to be \lstinline@long@ and applies the safe
    2027 \lstinline@int@-to-\lstinline@long@ conversion to \lstinline@i@.
     2024The best interpretation infers the expression's type to be \lstinline$long$ and applies the safe
     2025\lstinline$int$-to-\lstinline$long$ conversion to \lstinline$i$.
    20282026
    20292027\begin{lstlisting}
     
    20322030rand() ? cip : vip;
    20332031\end{lstlisting}
    2034 The expression has type \lstinline@const volatile int *@, with safe conversions applied to the second and third operands to add \lstinline@volatile@ and \lstinline@const@ qualifiers, respectively.
     2032The expression has type \lstinline$const volatile int *$, with safe conversions applied to the second and third operands to add \lstinline$volatile$ and \lstinline$const$ qualifiers, respectively.
    20352033
    20362034\begin{lstlisting}
    20372035rand() ? cip : 0;
    20382036\end{lstlisting}
    2039 The expression has type \lstinline@const int *@, with a specialization conversion applied to
    2040 \lstinline@0@.
     2037The expression has type \lstinline$const int *$, with a specialization conversion applied to
     2038\lstinline$0$.
    20412039
    20422040
     
    20492047         \nonterm{assignment-expression}
    20502048\lhs{assignment-operator} one of
    2051 \rhs \lstinline@=@\ \ \lstinline@*=@\ \ \lstinline@/=@\ \ \lstinline@%=@\ \ \lstinline@+=@\ \ \lstinline@-=@\ \ 
    2052          \lstinline@<<=@\ \ \lstinline@>>=@\ \ \lstinline@&=@\ \ \lstinline@^=@\ \ \lstinline@|=@
     2049\rhs \lstinline$=$\ \ \lstinline$*=$\ \ \lstinline$/=$\ \ \lstinline$%=$\ \ \lstinline$+=$\ \ \lstinline$-=$\ \ 
     2050         \lstinline$<<=$\ \ \lstinline$>>=$\ \ \lstinline$&=$\ \ \lstinline$^=$\ \ \lstinline$|=$
    20532051\end{syntax}
    20542052
     
    20592057\use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?}
    20602058\begin{lstlisting}
    2061 a §$\leftarrow$§ b §\rewrite§ ?§$\leftarrow$§?( &( a ), b )
     2059a @$\leftarrow$@ b @\rewrite@ ?@$\leftarrow$@?( &( a ), b )
    20622060\end{lstlisting}
    20632061
    20642062\semantics
    20652063Each interpretation of the left operand of an assignment expression is considered separately.
    2066 For each interpretation that is a bit-field or is declared with the \lstinline@register@ storage class specifier, the expression has one valid interpretation, with the type of the left operand.
     2064For each interpretation that is a bit-field or is declared with the \lstinline$register$ storage class specifier, the expression has one valid interpretation, with the type of the left operand.
    20672065The right operand is cast to that type, and the assignment expression is ambiguous if either operand is.
    20682066For the remaining interpretations, the expression is rewritten, and the interpretations of the assignment expression are the interpretations of the corresponding function call.
     
    22972295\end{lstlisting}
    22982296\begin{rationale}
    2299 The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline@dtype@ parameter, instead of a \lstinline@type@ parameter, because the left operand may be a pointer to an incomplete type.
    2300 \end{rationale}
    2301 
    2302 For every complete structure or union type \lstinline@S@ there exist
     2297The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline$dtype$ parameter, instead of a \lstinline$type$ parameter, because the left operand may be a pointer to an incomplete type.
     2298\end{rationale}
     2299
     2300For every complete structure or union type \lstinline$S$ there exist
    23032301% Don't use predefined: keep this out of prelude.cf.
    23042302\begin{lstlisting}
     
    23062304\end{lstlisting}
    23072305
    2308 For every extended integer type \lstinline@X@ there exist
     2306For every extended integer type \lstinline$X$ there exist
    23092307% Don't use predefined: keep this out of prelude.cf.
    23102308\begin{lstlisting}
     
    23122310\end{lstlisting}
    23132311
    2314 For every complete enumerated type \lstinline@E@ there exist
     2312For every complete enumerated type \lstinline$E$ there exist
    23152313% Don't use predefined: keep this out of prelude.cf.
    23162314\begin{lstlisting}
     
    23182316\end{lstlisting}
    23192317\begin{rationale}
    2320 The right-hand argument is \lstinline@int@ because enumeration constants have type \lstinline@int@.
     2318The right-hand argument is \lstinline$int$ because enumeration constants have type \lstinline$int$.
    23212319\end{rationale}
    23222320
     
    25792577\end{lstlisting}
    25802578
    2581 For every extended integer type \lstinline@X@ there exist
     2579For every extended integer type \lstinline$X$ there exist
    25822580% Don't use predefined: keep this out of prelude.cf.
    25832581\begin{lstlisting}
     
    25942592\end{lstlisting}
    25952593
    2596 For every complete enumerated type \lstinline@E@ there exist
     2594For every complete enumerated type \lstinline$E$ there exist
    25972595% Don't use predefined: keep this out of prelude.cf.
    25982596\begin{lstlisting}
     
    26152613\lhs{expression}
    26162614\rhs \nonterm{assignment-expression}
    2617 \rhs \nonterm{expression} \lstinline@,@ \nonterm{assignment-expression}
     2615\rhs \nonterm{expression} \lstinline$,$ \nonterm{assignment-expression}
    26182616\end{syntax}
    26192617
    26202618\semantics
    2621 In the comma expression ``\lstinline@a, b@'', the first operand is interpreted as
    2622 ``\lstinline@( void )(a)@'', which shall be unambiguous\index{ambiguous interpretation}.
     2619In the comma expression ``\lstinline$a, b$'', the first operand is interpreted as
     2620``\lstinline$( void )(a)$'', which shall be unambiguous\index{ambiguous interpretation}.
    26232621The interpretations of the expression are the interpretations of the second operand.
    26242622
     
    26552653{ ... }
    26562654\end{lstlisting}
    2657 Without the rule, \lstinline@Complex@ would be a type in the first case, and a parameter name in the second.
     2655Without the rule, \lstinline$Complex$ would be a type in the first case, and a parameter name in the second.
    26582656\end{rationale}
    26592657
     
    26812679\examples
    26822680\begin{lstlisting}
    2683 struct point {§\impl{point}§
     2681struct point {@\impl{point}@
    26842682        int x, y;
    26852683};
    2686 struct color_point {§\impl{color_point}§
     2684struct color_point {@\impl{color_point}@
    26872685        enum { RED, BLUE, GREEN } color;
    26882686        struct point;
     
    26912689cp.x = 0;
    26922690cp.color = RED;
    2693 struct literal {§\impl{literal}§
     2691struct literal {@\impl{literal}@
    26942692        enum { NUMBER, STRING } tag;
    26952693        union {
     
    27122710\begin{syntax}
    27132711\lhs{forall-specifier}
    2714 \rhs \lstinline@forall@ \lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@
     2712\rhs \lstinline$forall$ \lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
    27152713\end{syntax}
    27162714
     
    27242722} mkPair( T, T ); // illegal
    27252723\end{lstlisting}
    2726 If an instance of \lstinline@struct Pair@ was declared later in the current scope, what would the members' type be?
     2724If an instance of \lstinline$struct Pair$ was declared later in the current scope, what would the members' type be?
    27272725\end{rationale}
    27282726\end{comment}
     
    27312729The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type identifiers, function and object identifiers with \Index{no linkage}.
    27322730
    2733 If, in the declaration ``\lstinline@T D@'', \lstinline@T@ contains \nonterm{forall-specifier}s and
    2734 \lstinline@D@ has the form
    2735 \begin{lstlisting}
    2736 D( §\normalsize\nonterm{parameter-type-list}§ )
    2737 \end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline@D@, and it is used in the type of a parameter in the following
     2731If, in the declaration ``\lstinline$T D$'', \lstinline$T$ contains \nonterm{forall-specifier}s and
     2732\lstinline$D$ has the form
     2733\begin{lstlisting}
     2734D( @\normalsize\nonterm{parameter-type-list}@ )
     2735\end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline$D$, and it is used in the type of a parameter in the following
    27382736\nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a
    27392737\Index{specification} in one of the \nonterm{forall-specifier}s.
     
    27462744If this restriction were lifted, it would be possible to write
    27472745\begin{lstlisting}
    2748 forall( otype T ) T * alloc( void );§\use{alloc}§ int *p = alloc();
    2749 \end{lstlisting}
    2750 Here \lstinline@alloc()@ would receive \lstinline@int@ as an inferred argument, and return an
    2751 \lstinline@int *@.
    2752 In general, if a call to \lstinline@alloc()@ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline@T@ to be bound.
    2753 
    2754 With the current restriction, \lstinline@alloc()@ must be given an argument that determines
    2755 \lstinline@T@:
    2756 \begin{lstlisting}
    2757 forall( otype T ) T * alloc( T initial_value );§\use{alloc}§
     2746forall( otype T ) T * alloc( void );@\use{alloc}@ int *p = alloc();
     2747\end{lstlisting}
     2748Here \lstinline$alloc()$ would receive \lstinline$int$ as an inferred argument, and return an
     2749\lstinline$int *$.
     2750In general, if a call to \lstinline$alloc()$ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline$T$ to be bound.
     2751
     2752With the current restriction, \lstinline$alloc()$ must be given an argument that determines
     2753\lstinline$T$:
     2754\begin{lstlisting}
     2755forall( otype T ) T * alloc( T initial_value );@\use{alloc}@
    27582756\end{lstlisting}
    27592757\end{rationale}
     
    27802778forall( otype T ) T fT( T );
    27812779\end{lstlisting}
    2782 \lstinline@fi()@ takes an \lstinline@int@ and returns an \lstinline@int@. \lstinline@fT()@ takes a
    2783 \lstinline@T@ and returns a \lstinline@T@, for any type \lstinline@T@.
     2780\lstinline$fi()$ takes an \lstinline$int$ and returns an \lstinline$int$. \lstinline$fT()$ takes a
     2781\lstinline$T$ and returns a \lstinline$T$, for any type \lstinline$T$.
    27842782\begin{lstlisting}
    27852783int (*pfi )( int ) = fi;
    27862784forall( otype T ) T (*pfT )( T ) = fT;
    27872785\end{lstlisting}
    2788 \lstinline@pfi@ and \lstinline@pfT@ are pointers to functions. \lstinline@pfT@ is not polymorphic, but the function it points at is.
     2786\lstinline$pfi$ and \lstinline$pfT$ are pointers to functions. \lstinline$pfT$ is not polymorphic, but the function it points at is.
    27892787\begin{lstlisting}
    27902788int (*fvpfi( void ))( int ) {
     
    27952793}
    27962794\end{lstlisting}
    2797 \lstinline@fvpfi()@ and \lstinline@fvpfT()@ are functions taking no arguments and returning pointers to functions. \lstinline@fvpfT()@ is monomorphic, but the function that its return value points at is polymorphic.
     2795\lstinline$fvpfi()$ and \lstinline$fvpfT()$ are functions taking no arguments and returning pointers to functions. \lstinline$fvpfT()$ is monomorphic, but the function that its return value points at is polymorphic.
    27982796\begin{lstlisting}
    27992797forall( otype T ) int ( *fTpfi( T ) )( int );
     
    28012799forall( otype T, otype U ) U ( *fTpfU( T ) )( U );
    28022800\end{lstlisting}
    2803 \lstinline@fTpfi()@ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer.
    2804 It could return \lstinline@pfi@. \lstinline@fTpfT()@ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
    2805 \lstinline@T@, where \lstinline@T@ is an inferred parameter of \lstinline@fTpfT()@.
    2806 For instance, in the expression ``\lstinline@fTpfT(17)@'', \lstinline@T@ is inferred to be \lstinline@int@, and the returned value would have type \lstinline@int ( * )( int )@. ``\lstinline@fTpfT(17)(13)@'' and
    2807 ``\lstinline@fTpfT("yes")("no")@'' are legal, but ``\lstinline@fTpfT(17)("no")@'' is illegal.
    2808 \lstinline@fTpfU()@ is polymorphic ( in type \lstinline@T@), and returns a pointer to a function that is polymorphic ( in type \lstinline@U@). ``\lstinline@f5(17)("no")@'' is a legal expression of type
    2809 \lstinline@char *@.
     2801\lstinline$fTpfi()$ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer.
     2802It could return \lstinline$pfi$. \lstinline$fTpfT()$ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
     2803\lstinline$T$, where \lstinline$T$ is an inferred parameter of \lstinline$fTpfT()$.
     2804For instance, in the expression ``\lstinline$fTpfT(17)$'', \lstinline$T$ is inferred to be \lstinline$int$, and the returned value would have type \lstinline$int ( * )( int )$. ``\lstinline$fTpfT(17)(13)$'' and
     2805``\lstinline$fTpfT("yes")("no")$'' are legal, but ``\lstinline$fTpfT(17)("no")$'' is illegal.
     2806\lstinline$fTpfU()$ is polymorphic ( in type \lstinline$T$), and returns a pointer to a function that is polymorphic ( in type \lstinline$U$). ``\lstinline$f5(17)("no")$'' is a legal expression of type
     2807\lstinline$char *$.
    28102808\begin{lstlisting}
    28112809forall( otype T, otype U, otype V ) U * f( T *, U, V * const );
    28122810forall( otype U, otype V, otype W ) U * g( V *, U, W * const );
    28132811\end{lstlisting}
    2814 The functions \lstinline@f()@ and \lstinline@g()@ have compatible types.
     2812The functions \lstinline$f()$ and \lstinline$g()$ have compatible types.
    28152813Let \(f\) and \(g\) be their types;
    2816 then \(f_1\) = \lstinline@T@, \(f_2\) = \lstinline@U@, \(f_3\) = \lstinline@V@, \(g_1\)
    2817 = \lstinline@V@, \(g_2\) = \lstinline@U@, and \(g_3\) = \lstinline@W@.
     2814then \(f_1\) = \lstinline$T$, \(f_2\) = \lstinline$U$, \(f_3\) = \lstinline$V$, \(g_1\)
     2815= \lstinline$V$, \(g_2\) = \lstinline$U$, and \(g_3\) = \lstinline$W$.
    28182816Replacing every \(f_i\) by \(g_i\) in \(f\) gives
    28192817\begin{lstlisting}
     
    28212819\end{lstlisting} which has a return type and parameter list that is compatible with \(g\).
    28222820\begin{rationale}
    2823 The word ``\lstinline@type@'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.
     2821The word ``\lstinline$type$'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.
    28242822
    28252823Even without parameterized types, I might try to allow
     
    28472845\subsection{Type qualifiers}
    28482846
    2849 \CFA defines a new type qualifier \lstinline@lvalue@\impl{lvalue}\index{lvalue}.
     2847\CFA defines a new type qualifier \lstinline$lvalue$\impl{lvalue}\index{lvalue}.
    28502848\begin{syntax}
    28512849\oldlhs{type-qualifier}
    2852 \rhs \lstinline@lvalue@
     2850\rhs \lstinline$lvalue$
    28532851\end{syntax}
    28542852
    28552853\constraints
    2856 \Indexc{restrict} Types other than type parameters and pointer types whose referenced type is an object type shall not be restrict-qualified.
     2854\lstinline$restrict$\index{register@{\lstinline$restrict$}} Types other than type parameters and pointer types whose referenced type is an object type shall not be restrict-qualified.
    28572855
    28582856\semantics
    2859 An object's type may be a restrict-qualified type parameter.
    2860 \lstinline@restrict@ does not establish any special semantics in that case.
     2857An object's type may be a restrict-qualified type parameter. \lstinline$restrict$ does not establish any special semantics in that case.
    28612858
    28622859\begin{rationale}
     
    28642861\end{rationale}
    28652862
    2866 \lstinline@lvalue@ may be used to qualify the return type of a function type.
    2867 Let \lstinline@T@ be an unqualified version of a type;
     2863\lstinline$lvalue$ may be used to qualify the return type of a function type.
     2864Let \lstinline$T$ be an unqualified version of a type;
    28682865then the result of calling a function with return type
    2869 \lstinline@lvalue T@ is a \Index{modifiable lvalue} of type \lstinline@T@.
    2870 \lstinline@const@\use{const} and \lstinline@volatile@\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue.
    2871 \begin{rationale}
    2872 The \lstinline@const@ and \lstinline@volatile@ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline@lvalue@ qualifier is also used.
     2866\lstinline$lvalue T$ is a \Index{modifiable lvalue} of type \lstinline$T$.
     2867\lstinline$const$\use{const} and \lstinline$volatile$\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue.
     2868\begin{rationale}
     2869The \lstinline$const$ and \lstinline$volatile$ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline$lvalue$ qualifier is also used.
    28732870\end{rationale}
    28742871
     
    28772874
    28782875\begin{rationale}
    2879 \lstinline@lvalue@ provides some of the functionality of {\CC}'s ``\lstinline@T&@'' ( reference to object of type \lstinline@T@) type.
     2876\lstinline$lvalue$ provides some of the functionality of {\CC}'s ``\lstinline$T&$'' ( reference to object of type \lstinline$T$) type.
    28802877Reference types have four uses in {\CC}.
    28812878\begin{itemize}
    28822879\item
    2883 They are necessary for user-defined operators that return lvalues, such as ``subscript'' and ``dereference''.
    2884 
    2885 \item
    2886 A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline@with@ statement.
     2880They are necessary for user-defined operators that return lvalues, such as ``subscript'' and
     2881``dereference''.
     2882
     2883\item
     2884A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline$with$ statement.
    28872885The following {\CC} code gives an example.
    28882886\begin{lstlisting}
     
    28972895A reference parameter can be used to allow a function to modify an argument without forcing the caller to pass the address of the argument.
    28982896This is most useful for user-defined assignment operators.
    2899 In {\CC}, plain assignment is done by a function called ``\lstinline@operator=@'', and the two expressions
     2897In {\CC}, plain assignment is done by a function called ``\lstinline$operator=$'', and the two expressions
    29002898\begin{lstlisting}
    29012899a = b;
    29022900operator=( a, b );
    29032901\end{lstlisting} are equivalent.
    2904 If \lstinline@a@ and \lstinline@b@ are of type \lstinline@T@, then the first parameter of \lstinline@operator=@ must have type ``\lstinline@T&@''.
     2902If \lstinline$a$ and \lstinline$b$ are of type \lstinline$T$, then the first parameter of \lstinline$operator=$ must have type ``\lstinline$T&$''.
    29052903It cannot have type
    2906 \lstinline@T@, because then assignment couldn't alter the variable, and it can't have type
    2907 ``\lstinline@T *@'', because the assignment would have to be written ``\lstinline@&a = b;@''.
    2908 
    2909 In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline@a = b;@'' is equivalent to
    2910 ``\lstinline@operator=(&( a), b )@''.
    2911 Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline@&@''.
     2904\lstinline$T$, because then assignment couldn't alter the variable, and it can't have type
     2905``\lstinline$T *$'', because the assignment would have to be written ``\lstinline$&a = b;$''.
     2906
     2907In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline$a = b;$'' is equivalent to
     2908``\lstinline$operator=(&( a), b )$''.
     2909Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline$&$''.
    29122910
    29132911\item
    29142912References to \Index{const-qualified} types can be used instead of value parameters.  Given the
    2915 {\CC} function call ``\lstinline@fiddle( a_thing )@'', where the type of \lstinline@a_thing@ is
    2916 \lstinline@Thing@, the type of \lstinline@fiddle@ could be either of
     2913{\CC} function call ``\lstinline$fiddle( a_thing )$'', where the type of \lstinline$a_thing$ is
     2914\lstinline$Thing$, the type of \lstinline$fiddle$ could be either of
    29172915\begin{lstlisting}
    29182916void fiddle( Thing );
    29192917void fiddle( const Thing & );
    29202918\end{lstlisting}
    2921 If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline@fiddle@ the parameter is subject to the usual problems caused by aliases.
    2922 The reference form might be chosen for efficiency's sake if \lstinline@Thing@s are too large or their constructors or destructors are too expensive.
     2919If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline$fiddle$ the parameter is subject to the usual problems caused by aliases.
     2920The reference form might be chosen for efficiency's sake if \lstinline$Thing$s are too large or their constructors or destructors are too expensive.
    29232921An implementation may switch between them without causing trouble for well-behaved clients.
    29242922This leaves the implementor to define ``too large'' and ``too expensive''.
     
    29282926void fiddle( const volatile Thing );
    29292927\end{lstlisting} with call-by-reference.
    2930 Since it knows all about the size of \lstinline@Thing@s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.
     2928Since it knows all about the size of \lstinline$Thing$s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.
    29312929\end{itemize}
    29322930
     
    29482946\begin{syntax}
    29492947\lhs{spec-definition}
    2950 \rhs \lstinline@spec@ \nonterm{identifier}
    2951         \lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@
    2952         \lstinline@{@ \nonterm{spec-declaration-list}\opt \lstinline@}@
     2948\rhs \lstinline$spec$ \nonterm{identifier}
     2949        \lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
     2950        \lstinline${$ \nonterm{spec-declaration-list}\opt \lstinline$}$
    29532951\lhs{spec-declaration-list}
    2954 \rhs \nonterm{spec-declaration} \lstinline@;@
    2955 \rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline@;@
     2952\rhs \nonterm{spec-declaration} \lstinline$;$
     2953\rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline$;$
    29562954\lhs{spec-declaration}
    29572955\rhs \nonterm{specifier-qualifier-list} \nonterm{declarator-list}
    29582956\lhs{declarator-list}
    29592957\rhs \nonterm{declarator}
    2960 \rhs \nonterm{declarator-list} \lstinline@,@ \nonterm{declarator}
     2958\rhs \nonterm{declarator-list} \lstinline$,$ \nonterm{declarator}
    29612959\end{syntax}
    29622960\begin{rationale}
     
    29802978\rhs \nonterm{assertion-list} \nonterm{assertion}
    29812979\lhs{assertion}
    2982 \rhs \lstinline@|@ \nonterm{identifier} \lstinline@(@ \nonterm{type-name-list} \lstinline@)@
    2983 \rhs \lstinline@|@ \nonterm{spec-declaration}
     2980\rhs \lstinline$|$ \nonterm{identifier} \lstinline$($ \nonterm{type-name-list} \lstinline$)$
     2981\rhs \lstinline$|$ \nonterm{spec-declaration}
    29842982\lhs{type-name-list}
    29852983\rhs \nonterm{type-name}
    2986 \rhs \nonterm{type-name-list} \lstinline@,@ \nonterm{type-name}
     2984\rhs \nonterm{type-name-list} \lstinline$,$ \nonterm{type-name}
    29872985\end{syntax}
    29882986
     
    29912989The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}.
    29922990If the
    2993 \nonterm{type-parameter} uses type-class \lstinline@type@\use{type}, the argument shall be the type name of an \Index{object type};
    2994 if it uses \lstinline@dtype@, the argument shall be the type name of an object type or an \Index{incomplete type};
    2995 and if it uses \lstinline@ftype@, the argument shall be the type name of a \Index{function type}.
     2991\nonterm{type-parameter} uses type-class \lstinline$type$\use{type}, the argument shall be the type name of an \Index{object type};
     2992if it uses \lstinline$dtype$, the argument shall be the type name of an object type or an \Index{incomplete type};
     2993and if it uses \lstinline$ftype$, the argument shall be the type name of a \Index{function type}.
    29962994
    29972995\semantics
     
    30063004\examples
    30073005\begin{lstlisting}
    3008 forall( otype T | T ?*?( T, T ))§\use{?*?}§
    3009 T square( T val ) {§\impl{square}§
     3006forall( otype T | T ?*?( T, T ))@\use{?*?}@
     3007T square( T val ) {@\impl{square}@
    30103008        return val + val;
    30113009}
    3012 trait summable( otype T ) {§\impl{summable}§
    3013         T ?+=?( T *, T );§\use{?+=?}§
    3014         const T 0;§\use{0}§
     3010trait summable( otype T ) {@\impl{summable}@
     3011        T ?+=?( T *, T );@\use{?+=?}@
     3012        const T 0;@\use{0}@
    30153013};
    3016 trait list_of( otype List, otype Element ) {§\impl{list_of}§
     3014trait list_of( otype List, otype Element ) {@\impl{list_of}@
    30173015        Element car( List );
    30183016        List cdr( List );
     
    30233021trait sum_list( otype List, otype Element | summable( Element ) | list_of( List, Element ) ) {};
    30243022\end{lstlisting}
    3025 \lstinline@sum_list@ contains seven declarations, which describe a list whose elements can be added up.
    3026 The assertion ``\lstinline@|sum_list( i_list, int )@''\use{sum_list} produces the assertion parameters
     3023\lstinline$sum_list$ contains seven declarations, which describe a list whose elements can be added up.
     3024The assertion ``\lstinline$|sum_list( i_list, int )$''\use{sum_list} produces the assertion parameters
    30273025\begin{lstlisting}
    30283026int ?+=?( int *, int );
     
    30413039\lhs{type-parameter-list}
    30423040\rhs \nonterm{type-parameter}
    3043 \rhs \nonterm{type-parameter-list} \lstinline@,@ \nonterm{type-parameter}
     3041\rhs \nonterm{type-parameter-list} \lstinline$,$ \nonterm{type-parameter}
    30443042\lhs{type-parameter}
    30453043\rhs \nonterm{type-class} \nonterm{identifier} \nonterm{assertion-list}\opt
    30463044\lhs{type-class}
    3047 \rhs \lstinline@type@
    3048 \rhs \lstinline@dtype@
    3049 \rhs \lstinline@ftype@
     3045\rhs \lstinline$type$
     3046\rhs \lstinline$dtype$
     3047\rhs \lstinline$ftype$
    30503048\lhs{type-declaration}
    3051 \rhs \nonterm{storage-class-specifier}\opt \lstinline@type@ \nonterm{type-declarator-list} \verb|;|
     3049\rhs \nonterm{storage-class-specifier}\opt \lstinline$type$ \nonterm{type-declarator-list} \verb|;|
    30523050\lhs{type-declarator-list}
    30533051\rhs \nonterm{type-declarator}
    3054 \rhs \nonterm{type-declarator-list} \lstinline@,@ \nonterm{type-declarator}
     3052\rhs \nonterm{type-declarator-list} \lstinline$,$ \nonterm{type-declarator}
    30553053\lhs{type-declarator}
    3056 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline@=@ \nonterm{type-name}
     3054\rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline$=$ \nonterm{type-name}
    30573055\rhs \nonterm{identifier} \nonterm{assertion-list}\opt
    30583056\end{syntax}
     
    30653063
    30663064An identifier declared by a \nonterm{type-parameter} has \Index{no linkage}.
    3067 Identifiers declared with type-class \lstinline@type@\use{type} are \Index{object type}s;
     3065Identifiers declared with type-class \lstinline$type$\use{type} are \Index{object type}s;
    30683066those declared with type-class
    3069 \lstinline@dtype@\use{dtype} are \Index{incomplete type}s;
     3067\lstinline$dtype$\use{dtype} are \Index{incomplete type}s;
    30703068and those declared with type-class
    3071 \lstinline@ftype@\use{ftype} are \Index{function type}s.
     3069\lstinline$ftype$\use{ftype} are \Index{function type}s.
    30723070The identifier has \Index{block scope} that terminates at the end of the \nonterm{spec-declaration-list} or polymorphic function that contains the \nonterm{type-parameter}.
    30733071
     
    30773075Within the scope of the declaration, \Index{implicit conversion}s can be performed between the defined type and the implementation type, and between pointers to the defined type and pointers to the implementation type.
    30783076
    3079 A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline@static@\use{static} defines an \Index{incomplete type}.
     3077A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline$static$\use{static} defines an \Index{incomplete type}.
    30803078If a
    30813079\Index{translation unit} or \Index{block} contains one or more such declarations for an identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block, which would define a new type known only within that block).
     
    30973095
    30983096A type declaration without an initializer and with \Index{storage-class specifier}
    3099 \lstinline@extern@\use{extern} is an \define{opaque type declaration}.
     3097\lstinline$extern$\use{extern} is an \define{opaque type declaration}.
    31003098Opaque types are
    31013099\Index{object type}s.
     
    31123110\end{rationale}
    31133111
    3114 An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline@dtype@.
    3115 An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline@type@ and \lstinline@dtype@.
     3112An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline$dtype$.
     3113An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline$type$ and \lstinline$dtype$.
    31163114A
    3117 \Index{function type} is a value of type-class \lstinline@ftype@.
     3115\Index{function type} is a value of type-class \lstinline$ftype$.
    31183116\begin{rationale}
    31193117Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which omits the identifier being declared.
     
    31253123Type qualifiers are a weak point of C's type system.
    31263124Consider the standard library function
    3127 \lstinline@strchr()@ which, given a string and a character, returns a pointer to the first occurrence of the character in the string.
    3128 \begin{lstlisting}
    3129 char *strchr( const char *s, int c ) {§\impl{strchr}§
     3125\lstinline$strchr()$ which, given a string and a character, returns a pointer to the first occurrence of the character in the string.
     3126\begin{lstlisting}
     3127char *strchr( const char *s, int c ) {@\impl{strchr}@
    31303128        char real_c = c; // done because c was declared as int.
    31313129        for ( ; *s != real_c; s++ )
     
    31343132}
    31353133\end{lstlisting}
    3136 The parameter \lstinline@s@ must be \lstinline@const char *@, because \lstinline@strchr()@ might be used to search a constant string, but the return type must be \lstinline@char *@, because the result might be used to modify a non-constant string.
     3134The parameter \lstinline$s$ must be \lstinline$const char *$, because \lstinline$strchr()$ might be used to search a constant string, but the return type must be \lstinline$char *$, because the result might be used to modify a non-constant string.
    31373135Hence the body must perform a cast, and ( even worse)
    3138 \lstinline@strchr()@ provides a type-safe way to attempt to modify constant strings.
    3139 What is needed is some way to say that \lstinline@s@'s type might contain qualifiers, and the result type has exactly the same qualifiers.
     3136\lstinline$strchr()$ provides a type-safe way to attempt to modify constant strings.
     3137What is needed is some way to say that \lstinline$s$'s type might contain qualifiers, and the result type has exactly the same qualifiers.
    31403138Polymorphic functions do not provide a fix for this deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of type values.
    3141 Instead, overloading can be used to define \lstinline@strchr()@ for each combination of qualifiers.
     3139Instead, overloading can be used to define \lstinline$strchr()$ for each combination of qualifiers.
    31423140\end{rationale}
    31433141
     
    31643162\end{lstlisting}
    31653163Without this restriction, \CFA might require ``module initialization'' code ( since
    3166 \lstinline@Rational@ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline@Huge@ and the translation that declares \lstinline@Rational@.
     3164\lstinline$Rational$ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline$Huge$ and the translation that declares \lstinline$Rational$.
    31673165
    31683166A benefit of the restriction is that it prevents the declaration in separate translation units of types that contain each other, which would be hard to prevent otherwise.
     
    31813179\nonterm{struct-declaration}, type declarations can not be structure members.
    31823180The form of
    3183 \nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline@type@.
     3181\nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline$type$.
    31843182Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued expressions.
    31853183It also side-steps the problem of type-valued expressions producing different values in different declarations.
     
    31963194#include <stdlib.h>
    31973195T * new( otype T ) { return ( T * )malloc( sizeof( T) ); };
    3198 §\ldots§ int * ip = new( int );
    3199 \end{lstlisting}
    3200 This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline@T@'' in the function body refers to the parameter, but the ``\lstinline@T@'' in the return type refers to the meaning of \lstinline@T@ in the scope that contains \lstinline@new@;
     3196@\ldots@ int * ip = new( int );
     3197\end{lstlisting}
     3198This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline$T$'' in the function body refers to the parameter, but the ``\lstinline$T$'' in the return type refers to the meaning of \lstinline$T$ in the scope that contains \lstinline$new$;
    32013199it could be undefined, or a type name, or a function or variable name.
    32023200Nothing good can result from such a situation.
     
    32153213f2( v2 );
    32163214\end{lstlisting}
    3217 \lstinline@V1@ is passed by value, so \lstinline@f1()@'s assignment to \lstinline@a[0]@ does not modify v1.  \lstinline@V2@ is converted to a pointer, so \lstinline@f2()@ modifies \lstinline@v2[0]@.
     3215\lstinline$V1$ is passed by value, so \lstinline$f1()$'s assignment to \lstinline$a[0]$ does not modify v1.  \lstinline$V2$ is converted to a pointer, so \lstinline$f2()$ modifies \lstinline$v2[0]$.
    32183216
    32193217A translation unit containing the declarations
    32203218\begin{lstlisting}
    3221 extern type Complex;§\use{Complex}§ // opaque type declaration
    3222 extern float abs( Complex );§\use{abs}§
    3223 \end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline@abs@.
    3224 Some other translation unit must implement \lstinline@Complex@ and \lstinline@abs@.
     3219extern type Complex;@\use{Complex}@ // opaque type declaration
     3220extern float abs( Complex );@\use{abs}@
     3221\end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline$abs$.
     3222Some other translation unit must implement \lstinline$Complex$ and \lstinline$abs$.
    32253223That unit might contain the declarations
    32263224\begin{lstlisting}
    3227 otype Complex = struct { float re, im; };§\impl{Complex}§
    3228 Complex cplx_i = { 0.0, 1.0 };§\impl{cplx_i}§
    3229 float abs( Complex c ) {§\impl{abs( Complex )}§
     3225otype Complex = struct { float re, im; };@\impl{Complex}@
     3226Complex cplx_i = { 0.0, 1.0 };@\impl{cplx_i}@
     3227float abs( Complex c ) {@\impl{abs( Complex )}@
    32303228        return sqrt( c.re * c.re + c.im * c.im );
    32313229}
    32323230\end{lstlisting}
    3233 Note that \lstinline@c@ is implicitly converted to a \lstinline@struct@ so that its components can be retrieved.
    3234 
    3235 \begin{lstlisting}
    3236 otype Time_of_day = int;§\impl{Time_of_day}§ // seconds since midnight.
    3237 Time_of_day ?+?( Time_of_day t1, int seconds ) {§\impl{?+?}§
     3231Note that \lstinline$c$ is implicitly converted to a \lstinline$struct$ so that its components can be retrieved.
     3232
     3233\begin{lstlisting}
     3234otype Time_of_day = int;@\impl{Time_of_day}@ // seconds since midnight.
     3235Time_of_day ?+?( Time_of_day t1, int seconds ) {@\impl{?+?}@
    32383236        return (( int)t1 + seconds ) % 86400;
    32393237}
    32403238\end{lstlisting}
    3241 \lstinline@t1@ must be cast to its implementation type to prevent infinite recursion.
     3239\lstinline$t1$ must be cast to its implementation type to prevent infinite recursion.
    32423240
    32433241\begin{rationale}
    32443242Within the scope of a type definition, an instance of the type can be viewed as having that type or as having the implementation type.
    3245 In the \lstinline@Time_of_day@ example, the difference is important.
     3243In the \lstinline$Time_of_day$ example, the difference is important.
    32463244Different languages have treated the distinction between the abstraction and the implementation in different ways.
    32473245\begin{itemize}
    32483246\item
    32493247Inside a Clu cluster \cite{CLU}, the declaration of an instance states which view applies.
    3250 Two primitives called \lstinline@up@ and \lstinline@down@ can be used to convert between the views.
     3248Two primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
    32513249\item
    32523250The Simula class \cite{SIMULA87} is essentially a record type.
    32533251Since the only operations on a record are member selection and assignment, which can not be overloaded, there is never any ambiguity as to whether the abstraction or the implementation view is being used.
    32543252In {\CC}
    3255 \cite{C++}, operations on class instances include assignment and ``\lstinline@&@'', which can be overloaded.
     3253\cite{C++}, operations on class instances include assignment and ``\lstinline$&$'', which can be overloaded.
    32563254A ``scope resolution'' operator can be used inside the class to specify whether the abstract or implementation version of the operation should be used.
    32573255\item
     
    32663264In this case, explicit conversions between the derived type and the old type can be used.
    32673265\end{itemize}
    3268 \CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline@up@ and \lstinline@down@.
     3266\CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline$up$ and \lstinline$down$.
    32693267\end{rationale}
    32703268
     
    32723270\subsubsection{Default functions and objects}
    32733271
    3274 A declaration\index{type declaration} of a type identifier \lstinline@T@ with type-class
    3275 \lstinline@type@ implicitly declares a \define{default assignment} function
    3276 \lstinline@T ?=?( T *, T )@\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@.
     3272A declaration\index{type declaration} of a type identifier \lstinline$T$ with type-class
     3273\lstinline$type$ implicitly declares a \define{default assignment} function
     3274\lstinline$T ?=?( T *, T )$\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
    32773275\begin{rationale}
    32783276Assignment is central to C's imperative programming style, and every existing C object type has assignment defined for it ( except for array types, which are treated as pointer types for purposes of assignment).
    32793277Without this rule, nearly every inferred type parameter would need an accompanying assignment assertion parameter.
    32803278If a type parameter should not have an assignment operation,
    3281 \lstinline@dtype@ should be used.
     3279\lstinline$dtype$ should be used.
    32823280If a type should not have assignment defined, the user can define an assignment function that causes a run-time error, or provide an external declaration but no definition and thus cause a link-time error.
    32833281\end{rationale}
    32843282
    3285 A definition\index{type definition} of a type identifier \lstinline@T@ with \Index{implementation type} \lstinline@I@ and type-class \lstinline@type@ implicitly defines a default assignment function.
    3286 A definition\index{type definition} of a type identifier \lstinline@T@ with implementation type \lstinline@I@ and an assertion list implicitly defines \define{default function}s and
     3283A definition\index{type definition} of a type identifier \lstinline$T$ with \Index{implementation type} \lstinline$I$ and type-class \lstinline$type$ implicitly defines a default assignment function.
     3284A definition\index{type definition} of a type identifier \lstinline$T$ with implementation type \lstinline$I$ and an assertion list implicitly defines \define{default function}s and
    32873285\define{default object}s as declared by the assertion declarations.
    3288 The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@.
     3286The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline$T$.
    32893287Their values are determined as follows:
    32903288\begin{itemize}
    32913289\item
    3292 If at the definition of \lstinline@T@ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline@I@ replaced by \lstinline@T@ is compatible with the type of the default object, then the default object is initialized with that object.
    3293 Otherwise the scope of the declaration of \lstinline@T@ must contain a definition of the default object.
     3290If at the definition of \lstinline$T$ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default object, then the default object is initialized with that object.
     3291Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default object.
    32943292
    32953293\item
    3296 If at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline@I@ replaced by \lstinline@T@ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.
    3297 
    3298 Otherwise, if \lstinline@I@ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline@T@ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.
    3299 
    3300 Otherwise the scope of the declaration of \lstinline@T@ must contain a definition of the default function.
     3294If at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline$I$ replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.
     3295
     3296Otherwise, if \lstinline$I$ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline$T$ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline$T$ is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.
     3297
     3298Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default function.
    33013299\end{itemize}
    33023300\begin{rationale}
     
    33043302\end{rationale}
    33053303
    3306 A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline@T@ replaces the default function or object.
     3304A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline$T$ replaces the default function or object.
    33073305
    33083306\examples
     
    33143312Pair b = { 1, 1 };
    33153313\end{lstlisting}
    3316 The definition of \lstinline@Pair@ implicitly defines two objects \lstinline@a@ and \lstinline@b@.
    3317 \lstinline@Pair a@ inherits its value from the \lstinline@struct impl a@.
     3314The definition of \lstinline$Pair$ implicitly defines two objects \lstinline$a$ and \lstinline$b$.
     3315\lstinline$Pair a$ inherits its value from the \lstinline$struct impl a$.
    33183316The definition of
    3319 \lstinline@Pair b@ is compulsory because there is no \lstinline@struct impl b@ to construct a value from.
     3317\lstinline$Pair b$ is compulsory because there is no \lstinline$struct impl b$ to construct a value from.
    33203318\begin{lstlisting}
    33213319trait ss( otype T ) {
     
    33233321        void munge( T * );
    33243322}
    3325 otype Whatsit | ss( Whatsit );§\use{Whatsit}§
    3326 otype Doodad | ss( Doodad ) = struct doodad {§\use{Doodad}§
     3323otype Whatsit | ss( Whatsit );@\use{Whatsit}@
     3324otype Doodad | ss( Doodad ) = struct doodad {@\use{Doodad}@
    33273325        Whatsit; // anonymous member
    33283326        int extra;
     
    33303328Doodad clone( Doodad ) { ... }
    33313329\end{lstlisting}
    3332 The definition of \lstinline@Doodad@ implicitly defines three functions:
     3330The definition of \lstinline$Doodad$ implicitly defines three functions:
    33333331\begin{lstlisting}
    33343332Doodad ?=?( Doodad *, Doodad );
     
    33363334void munge( Doodad * );
    33373335\end{lstlisting}
    3338 The assignment function inherits \lstinline@struct doodad@'s assignment function because the types match when \lstinline@struct doodad@ is replaced by \lstinline@Doodad@ throughout.
    3339 \lstinline@munge()@ inherits \lstinline@Whatsit@'s \lstinline@munge()@ because the types match when
    3340 \lstinline@Whatsit@ is replaced by \lstinline@Doodad@ in the parameter list. \lstinline@clone()@ does \emph{not} inherit \lstinline@Whatsit@'s \lstinline@clone()@: replacement in the parameter list yields ``\lstinline@Whatsit clone( Doodad )@'', which is not compatible with
    3341 \lstinline@Doodad@'s \lstinline@clone()@'s type.
     3336The assignment function inherits \lstinline$struct doodad$'s assignment function because the types match when \lstinline$struct doodad$ is replaced by \lstinline$Doodad$ throughout.
     3337\lstinline$munge()$ inherits \lstinline$Whatsit$'s \lstinline$munge()$ because the types match when
     3338\lstinline$Whatsit$ is replaced by \lstinline$Doodad$ in the parameter list. \lstinline$clone()$ does \emph{not} inherit \lstinline$Whatsit$'s \lstinline$clone()$: replacement in the parameter list yields ``\lstinline$Whatsit clone( Doodad )$'', which is not compatible with
     3339\lstinline$Doodad$'s \lstinline$clone()$'s type.
    33423340Hence the definition of
    3343 ``\lstinline@Doodad clone( Doodad )@'' is necessary.
     3341``\lstinline$Doodad clone( Doodad )$'' is necessary.
    33443342
    33453343Default functions and objects are subject to the normal scope rules.
    33463344\begin{lstlisting}
    3347 otype T = §\ldots§;
    3348 T a_T = §\ldots§;               // Default assignment used.
     3345otype T = @\ldots@;
     3346T a_T = @\ldots@;               // Default assignment used.
    33493347T ?=?( T *, T );
    3350 T a_T = §\ldots§;               // Programmer-defined assignment called.
     3348T a_T = @\ldots@;               // Programmer-defined assignment called.
    33513349\end{lstlisting}
    33523350\begin{rationale}
     
    33813379\begin{syntax}
    33823380\oldlhs{labeled-statement}
    3383 \rhs \lstinline@case@ \nonterm{case-value-list} : \nonterm{statement}
     3381\rhs \lstinline$case$ \nonterm{case-value-list} : \nonterm{statement}
    33843382\lhs{case-value-list}
    33853383\rhs \nonterm{case-value}
    3386 \rhs \nonterm{case-value-list} \lstinline@,@ \nonterm{case-value}
     3384\rhs \nonterm{case-value-list} \lstinline$,$ \nonterm{case-value}
    33873385\lhs{case-value}
    33883386\rhs \nonterm{constant-expression}
    33893387\rhs \nonterm{subrange}
    33903388\lhs{subrange}
    3391 \rhs \nonterm{constant-expression} \lstinline@~@ \nonterm{constant-expression}
     3389\rhs \nonterm{constant-expression} \lstinline$~$ \nonterm{constant-expression}
    33923390\end{syntax}
    33933391
     
    34023400case 1~4, 9~14, 27~32:
    34033401\end{lstlisting}
    3404 The \lstinline@case@ and \lstinline@default@ clauses are restricted within the \lstinline@switch@ and \lstinline@choose@ statements, precluding Duff's device.
     3402The \lstinline$case$ and \lstinline$default$ clauses are restricted within the \lstinline$switch$ and \lstinline$choose$ statements, precluding Duff's device.
    34053403
    34063404
    34073405\subsection{Expression and null statements}
    34083406
    3409 The expression in an expression statement is treated as being cast to \lstinline@void@.
     3407The expression in an expression statement is treated as being cast to \lstinline$void$.
    34103408
    34113409
     
    34143412\begin{syntax}
    34153413\oldlhs{selection-statement}
    3416 \rhs \lstinline@choose@ \lstinline@(@ \nonterm{expression} \lstinline@)@ \nonterm{statement}
     3414\rhs \lstinline$choose$ \lstinline$($ \nonterm{expression} \lstinline$)$ \nonterm{statement}
    34173415\end{syntax}
    34183416
    3419 The controlling expression \lstinline@E@ in the \lstinline@switch@ and \lstinline@choose@ statement:
     3417The controlling expression \lstinline$E$ in the \lstinline$switch$ and \lstinline$choose$ statement:
    34203418\begin{lstlisting}
    34213419switch ( E ) ...
     
    34233421\end{lstlisting} may have more than one interpretation, but it shall have only one interpretation with an integral type.
    34243422An \Index{integer promotion} is performed on the expression if necessary.
    3425 The constant expressions in \lstinline@case@ statements with the switch are converted to the promoted type.
     3423The constant expressions in \lstinline$case$ statements with the switch are converted to the promoted type.
    34263424
    34273425
    34283426\setcounter{subsubsection}{3}
    3429 \subsubsection[The choose statement]{The \lstinline@choose@ statement}
    3430 
    3431 The \lstinline@choose@ statement is the same as the \lstinline@switch@ statement except control transfers to the end of the \lstinline@choose@ statement at a \lstinline@case@ or \lstinline@default@ labeled statement.
    3432 The \lstinline@fallthru@ statement is used to fall through to the next \lstinline@case@ or \lstinline@default@ labeled statement.
     3427\subsubsection{The \lstinline$choose$ statement}
     3428
     3429The \lstinline$choose$ statement is the same as the \lstinline$switch$ statement except control transfers to the end of the \lstinline$choose$ statement at a \lstinline$case$ or \lstinline$default$ labeled statement.
     3430The \lstinline$fallthru$ statement is used to fall through to the next \lstinline$case$ or \lstinline$default$ labeled statement.
    34333431The following have identical meaning:
    34343432\begin{flushleft}
     
    34553453\end{tabular}
    34563454\end{flushleft}
    3457 The \lstinline@choose@ statement addresses the problem of accidental fall-through associated with the \lstinline@switch@ statement.
     3455The \lstinline$choose$ statement addresses the problem of accidental fall-through associated with the \lstinline$switch$ statement.
    34583456
    34593457
    34603458\subsection{Iteration statements}
    34613459
    3462 The controlling expression \lstinline@E@ in the loops
     3460The controlling expression \lstinline$E$ in the loops
    34633461\begin{lstlisting}
    34643462if ( E ) ...
    34653463while ( E ) ...
    34663464do ... while ( E );
    3467 \end{lstlisting} is treated as ``\lstinline@( int )((E)!=0)@''.
     3465\end{lstlisting} is treated as ``\lstinline$( int )((E)!=0)$''.
    34683466
    34693467The statement
    34703468\begin{lstlisting}
    3471 for ( a; b; c ) §\ldots§
     3469for ( a; b; c ) @\ldots@
    34723470\end{lstlisting} is treated as
    34733471\begin{lstlisting}
     
    34803478\begin{syntax}
    34813479\oldlhs{jump-statement}
    3482 \rhs \lstinline@continue@ \nonterm{identifier}\opt
    3483 \rhs \lstinline@break@ \nonterm{identifier}\opt
     3480\rhs \lstinline$continue$ \nonterm{identifier}\opt
     3481\rhs \lstinline$break$ \nonterm{identifier}\opt
    34843482\rhs \ldots
    3485 \rhs \lstinline@throw@ \nonterm{assignment-expression}\opt
    3486 \rhs \lstinline@throwResume@ \nonterm{assignment-expression}\opt \nonterm{at-expression}\opt
    3487 \lhs{at-expression} \lstinline@_At@ \nonterm{assignment-expression}
     3483\rhs \lstinline$throw$ \nonterm{assignment-expression}\opt
     3484\rhs \lstinline$throwResume$ \nonterm{assignment-expression}\opt \nonterm{at-expression}\opt
     3485\lhs{at-expression} \lstinline$_At$ \nonterm{assignment-expression}
    34883486\end{syntax}
    34893487
    3490 Labeled \lstinline@continue@ and \lstinline@break@ allow useful but restricted control-flow that reduces the need for the \lstinline@goto@ statement for exiting multiple nested control-structures.
     3488Labeled \lstinline$continue$ and \lstinline$break$ allow useful but restricted control-flow that reduces the need for the \lstinline$goto$ statement for exiting multiple nested control-structures.
    34913489\begin{lstlisting}
    34923490L1: {                                                   // compound
     
    35153513
    35163514\setcounter{subsubsection}{1}
    3517 \subsubsection[The continue statement]{The \lstinline@continue@ statement}
    3518 
    3519 The identifier in a \lstinline@continue@ statement shall name a label located on an enclosing iteration statement.
    3520 
    3521 
    3522 \subsubsection[The break statement]{The \lstinline@break@ statement}
    3523 
    3524 The identifier in a \lstinline@break@ statement shall name a label located on an enclosing compound, selection or iteration statement.
    3525 
    3526 
    3527 \subsubsection[The return statement]{The \lstinline@return@ statement}
    3528 
    3529 An expression in a \lstinline@return@ statement is treated as being cast to the result type of the function.
    3530 
    3531 
    3532 \subsubsection[The throw statement]{The \lstinline@throw@ statement}
     3515\subsubsection{The \lstinline$continue$ statement}
     3516
     3517The identifier in a \lstinline$continue$ statement shall name a label located on an enclosing iteration statement.
     3518
     3519
     3520\subsubsection{The \lstinline$break$ statement}
     3521
     3522The identifier in a \lstinline$break$ statement shall name a label located on an enclosing compound, selection or iteration statement.
     3523
     3524
     3525\subsubsection{The \lstinline$return$ statement}
     3526
     3527An expression in a \lstinline$return$ statement is treated as being cast to the result type of the function.
     3528
     3529
     3530\subsubsection{The \lstinline$throw$ statement}
    35333531
    35343532When an exception is raised, \Index{propagation} directs control from a raise in the source execution to a handler in the faulting execution.
    35353533
    35363534
    3537 \subsubsection[The throwResume statement]{The \lstinline@throwResume@ statement}
     3535\subsubsection{The \lstinline$throwResume$ statement}
    35383536
    35393537
     
    35423540\begin{syntax}
    35433541\lhs{exception-statement}
    3544 \rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{handler-list}
    3545 \rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{finally-clause}
    3546 \rhs \lstinline@try@ \nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause}
     3542\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{handler-list}
     3543\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{finally-clause}
     3544\rhs \lstinline$try$ \nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause}
    35473545\lhs{handler-list}
    35483546\rhs \nonterm{handler-clause}
    3549 \rhs \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
    3550 \rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
    3551 \rhs \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
    3552 \rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@ \nonterm{compound-statement}
     3547\rhs \lstinline$catch$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
     3548\rhs \nonterm{handler-clause} \lstinline$catch$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
     3549\rhs \lstinline$catchResume$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
     3550\rhs \nonterm{handler-clause} \lstinline$catchResume$ \lstinline$($ \ldots \lstinline$)$ \nonterm{compound-statement}
    35533551\lhs{handler-clause}
    3554 \rhs \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
    3555 \rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
    3556 \rhs \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
    3557 \rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@ \nonterm{compound-statement}
     3552\rhs \lstinline$catch$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
     3553\rhs \nonterm{handler-clause} \lstinline$catch$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
     3554\rhs \lstinline$catchResume$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
     3555\rhs \nonterm{handler-clause} \lstinline$catchResume$ \lstinline$($ \nonterm{exception-declaration} \lstinline$)$ \nonterm{compound-statement}
    35583556\lhs{finally-clause}
    3559 \rhs \lstinline@finally@ \nonterm{compound-statement}
     3557\rhs \lstinline$finally$ \nonterm{compound-statement}
    35603558\lhs{exception-declaration}
    35613559\rhs \nonterm{type-specifier}
     
    35653563\rhs \nonterm{new-abstract-declarator-tuple}
    35663564\lhs{asynchronous-statement}
    3567 \rhs \lstinline@enable@ \nonterm{identifier-list} \nonterm{compound-statement}
    3568 \rhs \lstinline@disable@ \nonterm{identifier-list} \nonterm{compound-statement}
     3565\rhs \lstinline$enable$ \nonterm{identifier-list} \nonterm{compound-statement}
     3566\rhs \lstinline$disable$ \nonterm{identifier-list} \nonterm{compound-statement}
    35693567\end{syntax}
    35703568
     
    35723570
    35733571
    3574 \subsubsection[The try statement]{The \lstinline@try@ statement}
    3575 
    3576 The \lstinline@try@ statement is a block with associated handlers, called a \Index{guarded block};
     3572\subsubsection{The \lstinline$try$ statement}
     3573
     3574The \lstinline$try$ statement is a block with associated handlers, called a \Index{guarded block};
    35773575all other blocks are \Index{unguarded block}s.
    3578 A \lstinline@goto@, \lstinline@break@, \lstinline@return@, or \lstinline@continue@ statement can be used to transfer control out of a try block or handler, but not into one.
    3579 
    3580 
    3581 \subsubsection[The enable/disable statements]{The \lstinline@enable@/\lstinline@disable@ statements}
    3582 
    3583 The \lstinline@enable@/\lstinline@disable@ statements toggle delivery of \Index{asynchronous exception}s.
     3576A \lstinline$goto$, \lstinline$break$, \lstinline$return$, or \lstinline$continue$ statement can be used to transfer control out of a try block or handler, but not into one.
     3577
     3578
     3579\subsubsection{The \lstinline$enable$/\lstinline$disable$ statements}
     3580
     3581The \lstinline$enable$/\lstinline$disable$ statements toggle delivery of \Index{asynchronous exception}s.
    35843582
    35853583
     
    35913589\subsection{Predefined macro names}
    35923590
    3593 The implementation shall define the macro names \lstinline@__LINE__@, \lstinline@__FILE__@,
    3594 \lstinline@__DATE__@, and \lstinline@__TIME__@, as in the {\c11} standard.
    3595 It shall not define the macro name \lstinline@__STDC__@.
    3596 
    3597 In addition, the implementation shall define the macro name \lstinline@__CFORALL__@ to be the decimal constant 1.
     3591The implementation shall define the macro names \lstinline$__LINE__$, \lstinline$__FILE__$,
     3592\lstinline$__DATE__$, and \lstinline$__TIME__$, as in the {\c11} standard.
     3593It shall not define the macro name \lstinline$__STDC__$.
     3594
     3595In addition, the implementation shall define the macro name \lstinline$__CFORALL__$ to be the decimal constant 1.
    35983596
    35993597
     
    36123610The pointer, integral, and floating-point types are all \define{scalar types}.
    36133611All of these types can be logically negated and compared.
    3614 The assertion ``\lstinline@scalar( Complex )@'' should be read as ``type \lstinline@Complex@ is scalar''.
    3615 \begin{lstlisting}
    3616 trait scalar( otype T ) {§\impl{scalar}§
     3612The assertion ``\lstinline$scalar( Complex )$'' should be read as ``type \lstinline$Complex$ is scalar''.
     3613\begin{lstlisting}
     3614trait scalar( otype T ) {@\impl{scalar}@
    36173615        int !?( T );
    36183616        int ?<?( T, T ), ?<=?( T, T ), ?==?( T, T ), ?>=?( T, T ), ?>?( T, T ), ?!=?( T, T );
     
    36243622This is equivalent to inheritance of specifications.
    36253623\begin{lstlisting}
    3626 trait arithmetic( otype T | scalar( T ) ) {§\impl{arithmetic}§§\use{scalar}§
     3624trait arithmetic( otype T | scalar( T ) ) {@\impl{arithmetic}@@\use{scalar}@
    36273625        T +?( T ), -?( T );
    36283626        T ?*?( T, T ), ?/?( T, T ), ?+?( T, T ), ?-?( T, T );
     
    36303628\end{lstlisting}
    36313629
    3632 The various flavors of \lstinline@char@ and \lstinline@int@ and the enumerated types make up the
     3630The various flavors of \lstinline$char$ and \lstinline$int$ and the enumerated types make up the
    36333631\define{integral types}.
    36343632\begin{lstlisting}
    3635 trait integral( otype T | arithmetic( T ) ) {§\impl{integral}§§\use{arithmetic}§
     3633trait integral( otype T | arithmetic( T ) ) {@\impl{integral}@@\use{arithmetic}@
    36363634        T ~?( T );
    36373635        T ?&?( T, T ), ?|?( T, T ), ?^?( T, T );
     
    36473645The only operation that can be applied to all modifiable lvalues is simple assignment.
    36483646\begin{lstlisting}
    3649 trait m_lvalue( otype T ) {§\impl{m_lvalue}§
     3647trait m_lvalue( otype T ) {@\impl{m_lvalue}@
    36503648        T ?=?( T *, T );
    36513649};
     
    36573655Scalars can also be incremented and decremented.
    36583656\begin{lstlisting}
    3659 trait m_l_scalar( otype T | scalar( T ) | m_lvalue( T ) ) {§\impl{m_l_scalar}§
    3660         T ?++( T * ), ?--( T * );§\use{scalar}§§\use{m_lvalue}§
     3657trait m_l_scalar( otype T | scalar( T ) | m_lvalue( T ) ) {@\impl{m_l_scalar}@
     3658        T ?++( T * ), ?--( T * );@\use{scalar}@@\use{m_lvalue}@
    36613659        T ++?( T * ), --?( T * );
    36623660};
     
    36643662
    36653663Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic.
    3666 Note that this results in the ``inheritance'' of \lstinline@scalar@ along both paths.
    3667 \begin{lstlisting}
    3668 trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {§\impl{m_l_arithmetic}§
    3669         T ?/=?( T *, T ), ?*=?( T *, T );§\use{m_l_scalar}§§\use{arithmetic}§
     3664Note that this results in the ``inheritance'' of \lstinline$scalar$ along both paths.
     3665\begin{lstlisting}
     3666trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {@\impl{m_l_arithmetic}@
     3667        T ?/=?( T *, T ), ?*=?( T *, T );@\use{m_l_scalar}@@\use{arithmetic}@
    36703668        T ?+=?( T *, T ), ?-=?( T *, T );
    36713669};
    3672 trait m_l_integral( otype T | m_l_arithmetic( T ) | integral( T ) ) {§\impl{m_l_integral}§
    3673         T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );§\use{m_l_arithmetic}§
    3674         T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );§\use{integral}§
     3670trait m_l_integral( otype T | m_l_arithmetic( T ) | integral( T ) ) {@\impl{m_l_integral}@
     3671        T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );@\use{m_l_arithmetic}@
     3672        T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );@\use{integral}@
    36753673};
    36763674\end{lstlisting}
     
    36803678
    36813679Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a constant pointer to the first element of the array, and the subscript expression
    3682 ``\lstinline@a[i]@'' is equivalent to the dereferencing expression ``\lstinline@(*( a+( i )))@''.
    3683 Technically, pointer arithmetic and pointer comparisons other than ``\lstinline@==@'' and
    3684 ``\lstinline@!=@'' are only defined for pointers to array elements, but the type system does not enforce those restrictions.
     3680``\lstinline$a[i]$'' is equivalent to the dereferencing expression ``\lstinline$(*( a+( i )))$''.
     3681Technically, pointer arithmetic and pointer comparisons other than ``\lstinline$==$'' and
     3682``\lstinline$!=$'' are only defined for pointers to array elements, but the type system does not enforce those restrictions.
    36853683Consequently, there is no need for a separate ``array type'' specification.
    36863684
    36873685Pointer types are scalar types.
    3688 Like other scalar types, they have ``\lstinline@+@'' and
    3689 ``\lstinline@-@'' operators, but the types do not match the types of the operations in
    3690 \lstinline@arithmetic@, so these operators cannot be consolidated in \lstinline@scalar@.
    3691 \begin{lstlisting}
    3692 trait pointer( type P | scalar( P ) ) {§\impl{pointer}§§\use{scalar}§
     3686Like other scalar types, they have ``\lstinline$+$'' and
     3687``\lstinline$-$'' operators, but the types do not match the types of the operations in
     3688\lstinline$arithmetic$, so these operators cannot be consolidated in \lstinline$scalar$.
     3689\begin{lstlisting}
     3690trait pointer( type P | scalar( P ) ) {@\impl{pointer}@@\use{scalar}@
    36933691        P ?+?( P, long int ), ?+?( long int, P ), ?-?( P, long int );
    36943692        ptrdiff_t ?-?( P, P );
    36953693};
    3696 trait m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {§\impl{m_l_pointer}§
     3694trait m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {@\impl{m_l_pointer}@
    36973695        P ?+=?( P *, long int ), ?-=?( P *, long int );
    36983696        P ?=?( P *, void * );
     
    37033701Specifications that define the dereference operator ( or subscript operator ) require two parameters, one for the pointer type and one for the pointed-at ( or element ) type.
    37043702Different specifications are needed for each set of \Index{type qualifier}s, because qualifiers are not included in types.
    3705 The assertion ``\lstinline@|ptr_to( Safe_pointer, int )@'' should be read as
    3706 ``\lstinline@Safe_pointer@ acts like a pointer to \lstinline@int@''.
    3707 \begin{lstlisting}
    3708 trait ptr_to( otype P | pointer( P ), otype T ) {§\impl{ptr_to}§§\use{pointer}§
     3703The assertion ``\lstinline$|ptr_to( Safe_pointer, int )$'' should be read as
     3704``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''.
     3705\begin{lstlisting}
     3706trait ptr_to( otype P | pointer( P ), otype T ) {@\impl{ptr_to}@@\use{pointer}@
    37093707        lvalue T *?( P );
    37103708        lvalue T ?[?]( P, long int );
    37113709};
    3712 trait ptr_to_const( otype P | pointer( P ), otype T ) {§\impl{ptr_to_const}§
     3710trait ptr_to_const( otype P | pointer( P ), otype T ) {@\impl{ptr_to_const}@
    37133711        const lvalue T *?( P );
    3714         const lvalue T ?[?]( P, long int );§\use{pointer}§
     3712        const lvalue T ?[?]( P, long int );@\use{pointer}@
    37153713};
    3716 trait ptr_to_volatile( otype P | pointer( P ), otype T ) }§\impl{ptr_to_volatile}§
     3714trait ptr_to_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_volatile}@
    37173715        volatile lvalue T *?( P );
    3718         volatile lvalue T ?[?]( P, long int );§\use{pointer}§
     3716        volatile lvalue T ?[?]( P, long int );@\use{pointer}@
    37193717};
    3720 trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }§\impl{ptr_to_const_volatile}§
    3721         const volatile lvalue T *?( P );§\use{pointer}§
     3718trait ptr_to_const_volatile( otype P | pointer( P ), otype T ) }@\impl{ptr_to_const_volatile}@
     3719        const volatile lvalue T *?( P );@\use{pointer}@
    37223720        const volatile lvalue T ?[?]( P, long int );
    37233721};
    37243722\end{lstlisting}
    37253723
    3726 Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline@T *@'' can be assigned to a ``\lstinline@const T *@'', a ``\lstinline@volatile T *@'', and a ``\lstinline@const volatile T *@''.
     3724Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline$T *$'' can be assigned to a ``\lstinline$const T *$'', a ``\lstinline$volatile T *$'', and a ``\lstinline$const volatile T *$''.
    37273725Again, the pointed-at type is passed in, so that assertions can connect these specifications to the
    3728 ``\lstinline@ptr_to@'' specifications.
    3729 \begin{lstlisting}
    3730 trait m_l_ptr_to( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to}§ otype T | ptr_to( P, T )§\use{ptr_to}§ {
     3726``\lstinline$ptr_to$'' specifications.
     3727\begin{lstlisting}
     3728trait m_l_ptr_to( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ otype T | ptr_to( P, T )@\use{ptr_to}@ {
    37313729        P ?=?( P *, T * );
    37323730        T * ?=?( T **, P );
    37333731};
    3734 trait m_l_ptr_to_const( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to_const}§ otype T | ptr_to_const( P, T )§\use{ptr_to_const}§) {
     3732trait m_l_ptr_to_const( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ otype T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
    37353733        P ?=?( P *, const T * );
    37363734        const T * ?=?( const T **, P );
    37373735};
    3738 trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to_volatile}§ otype T | ptr_to_volatile( P, T )) {§\use{ptr_to_volatile}§
     3736trait m_l_ptr_to_volatile( otype P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ otype T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
    37393737        P ?=?( P *, volatile T * );
    37403738        volatile T * ?=?( volatile T **, P );
    37413739};
    3742 trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),§\use{ptr_to_const_volatile}§§\impl{m_l_ptr_to_const_volatile}§
    3743                 otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {§\use{m_l_ptr_to_const}§§\use{m_l_ptr_to_volatile}§
     3740trait m_l_ptr_to_const_volatile( otype P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
     3741                otype T | m_l_ptr_to_volatile( P, T ) | m_l_ptr_to_const( P )) {@\use{m_l_ptr_to_const}@@\use{m_l_ptr_to_volatile}@
    37443742        P ?=?( P *, const volatile T * );
    37453743        const volatile T * ?=?( const volatile T **, P );
     
    37503748An alternative specification can make use of the fact that qualification of the pointed-at type is part of a pointer type to capture that regularity.
    37513749\begin{lstlisting}
    3752 trait m_l_ptr_like( type MyP | m_l_pointer( MyP ),§\use{m_l_pointer}§§\impl{m_l_ptr_like}§ type CP | m_l_pointer( CP ) ) {
     3750trait m_l_ptr_like( type MyP | m_l_pointer( MyP ),@\use{m_l_pointer}@@\impl{m_l_ptr_like}@ type CP | m_l_pointer( CP ) ) {
    37533751        MyP ?=?( MyP *, CP );
    37543752        CP ?=?( CP *, MyP );
    37553753};
    37563754\end{lstlisting}
    3757 The assertion ``\lstinline@| m_l_ptr_like( Safe_ptr, const int * )@'' should be read as
    3758 ``\lstinline@Safe_ptr@ is a pointer type like \lstinline@const int *@''.
     3755The assertion ``\lstinline$| m_l_ptr_like( Safe_ptr, const int * )$'' should be read as
     3756``\lstinline$Safe_ptr$ is a pointer type like \lstinline$const int *$''.
    37593757This specification has two defects, compared to the original four: there is no automatic assertion that dereferencing a
    3760 \lstinline@MyP@ produces an lvalue of the type that \lstinline@CP@ points at, and the
    3761 ``\lstinline@|m_l_pointer( CP )@'' assertion provides only a weak assurance that the argument passed to \lstinline@CP@ really is a pointer type.
     3758\lstinline$MyP$ produces an lvalue of the type that \lstinline$CP$ points at, and the
     3759``\lstinline$|m_l_pointer( CP )$'' assertion provides only a weak assurance that the argument passed to \lstinline$CP$ really is a pointer type.
    37623760
    37633761
     
    37653763
    37663764Different operators often have related meanings;
    3767 for instance, in C, ``\lstinline@+@'',
    3768 ``\lstinline@+=@'', and the two versions of ``\lstinline@++@'' perform variations of addition.
     3765for instance, in C, ``\lstinline$+$'',
     3766``\lstinline$+=$'', and the two versions of ``\lstinline$++$'' perform variations of addition.
    37693767Languages like {\CC} and Ada allow programmers to define operators for new types, but do not require that these relationships be preserved, or even that all of the operators be implemented.
    37703768Completeness and consistency is left to the good taste and discretion of the programmer.
     
    37793777The different comparison operators have obvious relationships, but there is no obvious subset of the operations to use in the implementation of the others.
    37803778However, it is usually convenient to implement a single comparison function that returns a negative integer, 0, or a positive integer if its first argument is respectively less than, equal to, or greater than its second argument;
    3781 the library function \lstinline@strcmp@ is an example.
    3782 
    3783 C and \CFA have an extra, non-obvious comparison operator: ``\lstinline@!@'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.
     3779the library function \lstinline$strcmp$ is an example.
     3780
     3781C and \CFA have an extra, non-obvious comparison operator: ``\lstinline$!$'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.
    37843782\begin{lstlisting}
    37853783trait comparable( otype T ) {
     
    38303828
    38313829Note that, although an arithmetic type would certainly provide comparison functions, and an integral type would provide arithmetic operations, there does not have to be any relationship among
    3832 \lstinline@int_base@, \lstinline@arith_base@ and \lstinline@comparable@.
     3830\lstinline$int_base$, \lstinline$arith_base$ and \lstinline$comparable$.
    38333831Note also that these declarations provide guidance and assistance, but they do not define an absolutely minimal set of requirements.
    3834 A truly minimal implementation of an arithmetic type might only provide \lstinline@0@, \lstinline@1@, and \lstinline@?-=?@, which would be used by polymorphic \lstinline@?+=?@, \lstinline@?*=?@, and \lstinline@?/=?@ functions.
    3835 
    3836 Note also that \lstinline@short@ is an integer type in C11 terms, but has no operations!
     3832A truly minimal implementation of an arithmetic type might only provide
     3833\lstinline$0$, \lstinline$1$, and \lstinline$?-=?$, which would be used by polymorphic
     3834\lstinline$?+=?$, \lstinline$?*=?$, and \lstinline$?/=?$ functions.
     3835
     3836Note also that \lstinline$short$ is an integer type in C11 terms, but has no operations!
    38373837
    38383838
     
    38413841
    38423842Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers.
    3843 This gets into \lstinline@noalias@ territory.
    3844 Qualifying anything (``\lstinline@short restrict rs@'') means pointer parameters of \lstinline@?++@, etc, would need restrict qualifiers.
     3843This gets into \lstinline$noalias$ territory.
     3844Qualifying anything (``\lstinline$short restrict rs$'') means pointer parameters of \lstinline$?++$, etc, would need restrict qualifiers.
    38453845
    38463846Enumerated types.
     
    38523852Color, enum Color ) really make sense? ?++ does, but it adds (int)1.
    38533853
    3854 Operators on {,signed,unsigned} char and other small types. \lstinline@?<?@ harmless;
     3854Operators on {,signed,unsigned} char and other small types. ?<? harmless;
    38553855?*? questionable for chars.
    38563856Generic selections make these choices visible.
     
    38583858``promotion'' function?
    38593859
    3860 \lstinline@register@ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment.
    3861 
    3862 Don't use \lstinline@ptrdiff_t@ by name in the predefineds.
     3860\lstinline$register$ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment.
     3861
     3862Don't use ptrdiff\_t by name in the predefineds.
    38633863
    38643864Polymorphic objects.
  • doc/user/user.tex

    rfbfde843 r540de412  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sat Apr 30 13:54:32 2016
    14 %% Update Count     : 221
     13%% Last Modified On : Thu Apr 21 08:15:37 2016
     14%% Update Count     : 131
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
    1717% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    18 
    19 % red highlighting ®...® (registered trademark sumbol)
    20 % blue highlighting ©...© (copyright symbol)
    21 % latex escape §...§ (section symbol)
    22 % keyword escape ¶...¶ (pilcrow symbol)
    23 % math escape $...$ (dollar symbol)
    2418
    2519\documentclass[openright,twoside]{article}
     
    232226
    233227
    234 \section[Compiling CFA Program]{Compiling \CFA Program}
     228\section{Compiling \CFA Program}
    235229
    236230The command \lstinline@cfa@ is used to compile \CFA program(s).
    237231This command works like the GNU \lstinline@gcc@\index{gcc} command, e.g.:
    238232\begin{lstlisting}
    239 cfa [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
    240 \end{lstlisting}
    241 \indexc{cfa}\index{compilation!cfa@\lstinline$cfa$}
     233cfa [ gcc-options ] C/@{\CFA}@-files [ assembler/loader-files ]
     234\end{lstlisting}
     235\index{cfa@\lstinline$cfa$}\index{compilation!cfa@\lstinline$cfa$}
    242236By default, \CFA programs having the following \lstinline@gcc@ flags turned on:
    243237\begin{description}
    244 \item\hspace*{-4pt}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{\lstinline$-std=gnu99$}}
     238\item
     239\hspace*{-4pt}\lstinline@-std=gnu99@
     240\index{-std=gnu99@{\lstinline$-std=gnu99$}}\index{compilation option!-std=gnu99@{\lstinline$-std=gnu99$}}
    245241The 1999 C standard plus GNU extensions.
    246 \item\hspace*{-4pt}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{\lstinline$-fgnu89-¶inline¶$}}
     242\item
     243\hspace*{-4pt}\lstinline@-fgnu89-inline@
     244\index{-fgnu89-inline@{\lstinline$-fgnu89-inline$}}\index{compilation option!-fgnu89-inline@{\lstinline$-fgnu89-inline$}}
    247245Use the traditional GNU semantics for inline routines in C99 mode.
    248246\end{description}
    249247The following new \CFA option is available:
    250248\begin{description}
    251 \item\hspace*{-4pt}\Indexc{-CFA}\index{compilation option!-CFA@{\lstinline$-CFA$}}
     249\item
     250\hspace*{-4pt}\lstinline@-CFA@
     251\index{-CFA@{\lstinline$-CFA$}}\index{compilation option!-CFA@{\lstinline$-CFA$}}
    252252Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
    253253\end{description}
     
    255255The following preprocessor variables are available:
    256256\begin{description}
    257 \item\hspace*{-4pt}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{\lstinline$__CFA__$}}
     257\item
     258\hspace*{-4pt}\lstinline$__CFA__$
     259\index{__CFA__@{\lstinline$__CFA__$}}\index{preprocessor variables!__CFA__@{\lstinline$__CFA__$}}
    258260is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{
    259261The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed.
    260262Hence, the need to have three variables for the major, minor and patch version number.}
    261263
    262 \item\hspace*{-4pt}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}
     264\item
     265\hspace*{-4pt}\lstinline$__CFA_MINOR__$
     266\index{__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}\index{preprocessor variables!__CFA_MINOR__@{\lstinline$__CFA_MINOR__$}}
    263267is always available during preprocessing and its value is the current minor \Index{version number} of \CFA.
    264268
    265 \item\hspace*{-4pt}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@\lstinline$__CFA_PATCH__$}
     269\item
     270\hspace*{-4pt}\lstinline$__CFA_PATCH__$
     271\index{__CFA_PATCH__@%(__CFA_PATCH__%)}\index{preprocessor variables!__CFA_PATCH__@%(__CFA_PATCH__%)}
    266272is always available during preprocessing and its value is the current patch \Index{version number} of \CFA.
    267273
    268 \item\hspace*{-4pt}\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@\lstinline$__CFORALL__$}
     274\item
     275\hspace*{-4pt}\lstinline$__CFORALL__$
     276\index{__CFORALL__@%(__CFORALL__%)}\index{preprocessor variables!__CFORALL__@%(__CFORALL__%)}
    269277is always available during preprocessing and it has no value.
    270278\end{description}
     
    274282\begin{lstlisting}
    275283#ifndef __CFORALL__
    276 #include <stdio.h>                      // C header file
     284#include <stdio.h>              // C header file
    277285#else
    278 #include <fstream>                      // §\CFA{}§ header file
     286#include <fstream>              // @\CFA{}@ header file
    279287#endif
    280288\end{lstlisting}
     
    286294Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:
    287295\begin{lstlisting}
    288 2®_®147®_®483®_®648;                            // decimal constant
     2962`_`147`_`483`_`648;                            // decimal constant
    28929756_ul;                                          // decimal unsigned long constant
    2902980_377;                                          // octal constant
     
    352360\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    353361\begin{lstlisting}
    354 ®* int x, y;®
     362`* int x, y;`
    355363\end{lstlisting}
    356364&
     
    480488The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.:
    481489\begin{lstlisting}
    482 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) {
    483         §\emph{routine body}§
     490`[ int o1, int o2, char o3 ]` f( int i1, char i2, char i3 ) {
     491        @\emph{routine body}@
    484492}
    485493\end{lstlisting}
     
    492500Declaration qualifiers can only appear at the start of a routine definition, e.g.:
    493501\begin{lstlisting}
    494 extern [ int x ] g( int y ) {§\,§}
     502extern [ int x ] g( int y ) {@\,@}
    495503\end{lstlisting}
    496504Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified;
    497505in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in:
    498506\begin{lstlisting}
    499 [§\,§] g();                                             // no input or output parameters
     507[@\,@] g(@\,@);                         // no input or output parameters
    500508[ void ] g( void );                     // no input or output parameters
    501509\end{lstlisting}
     
    548556Because the value in the return variable is automatically returned when a \CFA routine terminates, the \lstinline@return@ statement \emph{does not} contain an expression, as in:
    549557\begin{lstlisting}
    550 ®[ int x ]® f() {
     558`[ int x ]` f() {
    551559        ... x = 0; ... x = y; ...
    552         ®return;® // implicitly return x
     560        `return;` // implicitly return x
    553561}
    554562\end{lstlisting}
     
    773781\subsection{Type Nesting}
    774782
    775 \CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
     783\CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type!hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
    776784\begin{quote2}
    777785\begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}}
     
    828836
    829837int fred() {
    830         s.t.c = ®S.®R;  // type qualification
    831         struct ®S.®T t = { ®S.®R, 1, 2 };
    832         enum ®S.®C c;
    833         union ®S.T.®U u;
     838        s.t.c = `S.`R;  // type qualification
     839        struct `S.`T t = { `S.`R, 1, 2 };
     840        enum `S.`C c;
     841        union `S.T.`U u;
    834842}
    835843\end{lstlisting}
     
    855863qsort( ia, size );              // sort ascending order using builtin ?<?
    856864{
    857         ®int ?<?( int x, int y ) { return x > y; }® // nested routine
     865        `int ?<?( int x, int y ) { return x > y; }` // nested routine
    858866        qsort( ia, size );      // sort descending order by local redefinition
    859867}
     
    865873\begin{lstlisting}
    866874[* [int]( int )] foo() {                // int (*foo())( int )
    867         int ®i® = 7;
     875        int `i` = 7;
    868876        int bar( int p ) {
    869                 ®i® += 1;                                       // dependent on local variable
    870                 sout | ®i® | endl;
     877                `i` += 1;                                       // dependent on local variable
     878                sout | `i` | endl;
    871879        }
    872880        return bar;                                     // undefined because of local dependence
     
    889897The general syntax of a tuple is:
    890898\begin{lstlisting}
    891 [ §\emph{exprlist}§ ]
     899[ $\emph{exprlist}$ ]
    892900\end{lstlisting}
    893901where \lstinline@$\emph{exprlist}$@ is a list of one or more expressions separated by commas.
     
    909917The general syntax of a tuple type is:
    910918\begin{lstlisting}
    911 [ §\emph{typelist}§ ]
     919[ @\emph{typelist}@ ]
    912920\end{lstlisting}
    913921where \lstinline@$\emph{typelist}$@ is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.
     
    10391047Mass assignment has the following form:
    10401048\begin{lstlisting}
    1041 [ §\emph{lvalue}§, ..., §\emph{lvalue}§ ] = §\emph{expr}§;
    1042 \end{lstlisting}
    1043 The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
     1049[ @\emph{lvalue}@, ..., @\emph{lvalue}@ ] = @\emph{expr}@;
     1050\end{lstlisting}
     1051The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
    10441052\lstinline@$\emph{expr}$@ is any standard arithmetic expression.
    10451053Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
     
    10781086Multiple assignment has the following form:
    10791087\begin{lstlisting}
    1080 [ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ];
    1081 \end{lstlisting}
    1082 The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s.
    1083 Each \emph{expr} appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment.
     1088[ @\emph{lvalue}@, . . ., @\emph{lvalue}@ ] = [ @\emph{expr}@, . . ., @\emph{expr}@ ];
     1089\end{lstlisting}
     1090The left-hand side is a tuple of \lstinline@$\emph{lvalues}$@, and the right-hand side is a tuple of \lstinline@$\emph{expr}$@s.
     1091Each \lstinline@$\emph{expr}$@ appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \lstinline@$\emph{lvalues}$@ on the left-hand side of the statement using parallel semantics for each assignment.
    10841092An example of multiple assignment is:
    10851093\begin{lstlisting}
     
    11181126Cascade assignment has the following form:
    11191127\begin{lstlisting}
    1120 §\emph{tuple}§ = §\emph{tuple}§ = ... = §\emph{tuple}§;
     1128@\emph{tuple}@ = @\emph{tuple}@ = ... = @\emph{tuple}@;
    11211129\end{lstlisting}
    11221130and it has the same parallel semantics as for mass and multiple assignment.
     
    11361144Its general form is:
    11371145\begin{lstlisting}
    1138 §\emph{expr}§ . [ §\emph{fieldlist}§ ]
    1139 §\emph{expr}§ -> [ §\emph{fieldlist}§ ]
    1140 \end{lstlisting}
    1141 \emph{expr} is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.
    1142 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}.
     1146@\emph{expr}@ . [ @\emph{fieldlist}@ ]
     1147@\emph{expr}@ -> [ @\emph{fieldlist}@ ]
     1148\end{lstlisting}
     1149\lstinline@$\emph{expr}$@ is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.
     1150Each element of \lstinline@$\emph{ fieldlist}$@ is an element of the record specified by \lstinline@$\emph{expr}$@.
    11431151A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
    11441152the following:
     
    11801188\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    11811189\begin{lstlisting}
    1182 ®L1:® for ( ... ) {
    1183         ®L2:® for ( ... ) {
    1184                 ®L3:® for ( ... ) {
    1185                         ... break ®L1®; ...
    1186                         ... break ®L2®; ...
    1187                         ... break ®L3®; // or break
     1190`L1:` for ( ... ) {
     1191        `L2:` for ( ... ) {
     1192                `L3:` for ( ... ) {
     1193                        ... break `L1`; ...
     1194                        ... break `L2`; ...
     1195                        ... break `L3`; // or break
    11881196                }
    11891197        }
     
    12101218\multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}}       & \multicolumn{1}{c}{\textbf{C}}        \\
    12111219\begin{lstlisting}
    1212 ®L1®: for ( ... ) {
    1213         ®L2®: for ( ... ) {
    1214                 ®L3®: for ( ... ) {
    1215                         ... continue ®L1®; ...
    1216                         ... continue ®L2®; ...
    1217                         ... continue ®L3®; ...
     1220`L1`: for ( ... ) {
     1221        `L2`: for ( ... ) {
     1222                `L3`: for ( ... ) {
     1223                        ... continue `L1`; ...
     1224                        ... continue `L2`; ...
     1225                        ... continue `L3`; ...
    12181226
    12191227                }
     
    14511459\begin{lstlisting}
    14521460switch ( i ) {
    1453   ®case 1, 3, 5®:
     1461  `case 1, 3, 5`:
    14541462        ...
    1455   ®case 2, 4, 6®:
     1463  `case 2, 4, 6`:
    14561464        ...
    14571465}
     
    14831491\begin{lstlisting}
    14841492switch ( i ) {
    1485   ®case 1~5:®
     1493  `case 1~5:`
    14861494        ...
    1487   ®case 10~15:®
     1495  `case 10~15:`
    14881496        ...
    14891497}
     
    20402048For example, given
    20412049\begin{lstlisting}
    2042 auto j = ®...®
     2050auto j = `...`
    20432051\end{lstlisting}
    20442052and the need to write a routine to compute using \lstinline@j@
    20452053\begin{lstlisting}
    2046 void rtn( ®...® parm );
     2054void rtn( `...` parm );
    20472055rtn( j );
    20482056\end{lstlisting}
     
    23642372To make this work, a space is required after the field selection:
    23652373\begin{lstlisting}
    2366 ®s.§\textvisiblespace§0® = 0;
    2367 ®s.§\textvisiblespace§1® = 1;
     2374`s.@\textvisiblespace@0` = 0;
     2375`s.@\textvisiblespace@1` = 1;
    23682376\end{lstlisting}
    23692377While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
    2370 Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int®>>®@, this issue can be solved with a more powerful lexer/parser.
     2378Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int`>>`@, this issue can be solved with a more powerful lexer/parser.
    23712379
    23722380There are several ambiguous cases with operator identifiers, e.g., \lstinline@int *?*?()@, where the string \lstinline@*?*?@ can be lexed as \lstinline@*@/\lstinline@?*?@ or \lstinline@*?@/\lstinline@*?@.
     
    23752383The first case is for the function-call identifier \lstinline@?()@:
    23762384\begin{lstlisting}
    2377 int *§\textvisiblespace§?()();  // declaration: space required after '*'
    2378 *§\textvisiblespace§?()();              // expression: space required after '*'
     2385int *@\textvisiblespace@?()();  // declaration: space required after '*'
     2386*@\textvisiblespace@?()();              // expression: space required after '*'
    23792387\end{lstlisting}
    23802388Without the space, the string \lstinline@*?()@ is ambiguous without N character look ahead;
     
    23832391The 4 remaining cases occur in expressions:
    23842392\begin{lstlisting}
    2385 i++§\textvisiblespace§?i:0;             // space required before '?'
    2386 i--§\textvisiblespace§?i:0;             // space required before '?'
    2387 i§\textvisiblespace§?++i:0;             // space required after '?'
    2388 i§\textvisiblespace§?--i:0;             // space required after '?'
     2393i++@\textvisiblespace@?i:0;             // space required before '?'
     2394i--@\textvisiblespace@?i:0;             // space required before '?'
     2395i@\textvisiblespace@?++i:0;             // space required after '?'
     2396i@\textvisiblespace@?--i:0;             // space required after '?'
    23892397\end{lstlisting}
    23902398In the first two cases, the string \lstinline@i++?@ is ambiguous, where this string can be lexed as \lstinline@i@ / \lstinline@++?@ or \lstinline@i++@ / \lstinline@?@;
     
    33173325
    33183326
    3319 \subsection[Comparing Key Features of CFA]{Comparing Key Features of \CFA}
     3327\subsection{Comparing Key Features of \CFA}
    33203328
    33213329
     
    36913699
    36923700\begin{comment}
    3693 \subsubsection{Modules / Packages}
     3701\subsubsection{Modules/Packages}
    36943702
    36953703\begin{lstlisting}
     
    39333941
    39343942
    3935 \subsubsection[C++]{\CC}
     3943\subsubsection{\CC}
    39363944
    39373945\CC is a general-purpose programming language.
     
    40714079Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
    40724080
     4081
    40734082\item
    40744083Change: In C++, the name of a nested class is local to its enclosing class.
     
    40814090struct Y yy; // valid C, invalid C++
    40824091\end{lstlisting}
    4083 Rationale: C++ classes have member functions which require that classes establish scopes.
    4084 The C rule would leave classes as an incomplete scope mechanism which would prevent C++ programmers from maintaining locality within a class. A coherent set of scope rules for C++ based on the C rule would be very complicated and C++ programmers would be unable to predict reliably the meanings of nontrivial examples involving nested or local functions.
    4085 Effect on original feature: Change of semantics of welldefined feature.
    4086 Difficulty of converting: Semantic transformation. To make the struct type name visible in the scope of the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing struct is defined. Example:
     4092Rationale: C++ classes have member functions which require that classes establish scopes. The C rule
     4093would leave classes as an incomplete scope mechanism which would prevent C++ programmers from maintaining
     4094locality within a class. A coherent set of scope rules for C++ based on the C rule would be very
     4095complicated and C++ programmers would be unable to predict reliably the meanings of nontrivial examples
     4096involving nested or local functions.
     4097Effect on original feature: Change of semantics of welldefined
     4098feature.
     4099Difficulty of converting: Semantic transformation. To make the struct type name visible in the scope of
     4100the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing
     4101struct is defined. Example:
    40874102\begin{lstlisting}
    40884103struct Y; // struct Y and struct X are at the same scope
     
    40914106};
    40924107\end{lstlisting}
    4093 All the definitions of C struct types enclosed in other struct definitions and accessed outside the scope of the enclosing struct could be exported to the scope of the enclosing struct.
    4094 Note: this is a consequence of the difference in scope rules, which is documented in 3.3.
     4108All the definitions of C struct types enclosed in other struct definitions and accessed outside the scope of
     4109the enclosing struct could be exported to the scope of the enclosing struct. Note: this is a consequence of
     4110the difference in scope rules, which is documented in 3.3.
    40954111How widely used: Seldom.
    40964112\end{enumerate}
     
    41084124\begin{lstlisting}
    41094125int x = 0, y = 1, z = 2;
    4110 ®sout® ®|® x ®|® y ®|® z ®| endl®;
     4126`sout` `|` x `|` y `|` z `| endl`;
    41114127\end{lstlisting}
    41124128&
     
    41174133\end{tabular}
    41184134\end{quote2}
    4119 The \CFA form is half as many characters, and is similar to \Index{Python} I/O with respect to implicit separators.
     4135The \CFA form is half as many characters, and is similar to Python I/O with respect to implicit separators.
    41204136
    41214137The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment.
     
    41444160A seperator does not appear at the start or end of a line.
    41454161\begin{lstlisting}[belowskip=0pt]
    4146 sout | 1 | 2 | 3 | endl;
     4162sout 1 | 2 | 3 | endl;
    41474163\end{lstlisting}
    41484164\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     
    41634179which is a local mechanism to disable insertion of the separator character.
    41644180\item
    4165 A seperator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@
     4181A seperator does not appear before a C string starting with the \Index{extended ASCII}\index{ASCII} characters: \lstinline[mathescape=off]@([{$£¥¿«@
    41664182%$
    41674183\begin{lstlisting}[mathescape=off]
    4168 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl;
     4184sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¿" | 7 | "x «" | 8 | endl;
    41694185\end{lstlisting}
    41704186%$
    41714187\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4172 x (1 x [2 x {3 x $4 x £5 x ¥6 x ¡7 x ¿8 x «9
     4188x (1 x [2 x {3 x $4 x £5 x ¥6 x ¿7 x «8
    41734189\end{lstlisting}
    41744190%$
    41754191\item
    4176 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline@,.:;!?)]}%¢»@
     4192A seperator does not appear after a C string ending with the extended ASCII characters: \lstinline@,.:;!?)]}%¢»@
    41774193\begin{lstlisting}[belowskip=0pt]
    41784194sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
    4179          | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
     4195         | 10 | "% x" | 11 | L"¢ x" | 12 | L"» x" | endl;
    41804196\end{lstlisting}
    41814197\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     
    41834199\end{lstlisting}
    41844200\item
    4185 A seperator does not appear before or after a C string begining/ending with the \Index{ASCII} quote or whitespace characters: \lstinline[showspaces=true]@`'" \t\v\f\r\n@
     4201A seperator does not appear before or after a C string begining/ending with the characters: \lstinline@\f\n\r\t\v\`'"@
    41864202\begin{lstlisting}[belowskip=0pt]
    4187 sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x" | "x " | 4 | " x" | "x\t" | 1 | "\tx" | endl;
    4188 \end{lstlisting}
    4189 \begin{lstlisting}[mathescape=off,showspaces=true,showtabs=true,aboveskip=0pt,belowskip=0pt]
    4190 x`1`x'2'x"3"x x 4 x x   1       x
     4203sout | "x '" | 1 | "' x \`" | 2 | "\` x \"" | 3 | "\" x" | endl;
     4204\end{lstlisting}
     4205\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     4206x '1' x \`2\` x "3" x
     4207\end{lstlisting}
     4208\begin{lstlisting}[showtabs=true,aboveskip=0pt]
     4209sout | "x\t" | 1 | "\tx" | endl;
     4210x       1       x
    41914211\end{lstlisting}
    41924212\end{enumerate}
     
    42204240\end{lstlisting}
    42214241\begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    4222  1 2 3
     42421 2 3
    42234243\end{lstlisting}
    42244244\begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt]
     
    42314251\end{lstlisting}
    42324252%$
    4233 \begin{comment}
     4253\VRef[Figure]{f:ExampleIO} shows an example of input and output I/O in \CFA.
     4254
     4255\begin{figure}
     4256\begin{lstlisting}[mathescape=off]
    42344257#include <fstream>
    42354258
    42364259int main() {
    4237         int x = 3, y = 5, z = 7;
    4238         sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
    4239         sout | 1 | 2 | 3 | endl;
    4240         sout | '1' | '2' | '3' | endl;
    4241         sout | 1 | "" | 2 | "" | 3 | endl;
    4242         sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl;
    4243         sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
    4244                  | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
    4245         sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x" | "x " | 4 | " x" | "x\t" | 1 | "\tx" | endl;
    4246         sout | sepOn | 1 | 2 | 3 | sepOn | endl;        // separator at start of line
    4247         sout | 1 | sepOff | 2 | 3 | endl;                       // turn off implicit separator temporarily
    4248         sout | sepDisable | 1 | 2 | 3 | endl;           // turn off implicit separation, affects all subsequent prints
    4249         sout | 1 | sepOn | 2 | 3 | endl;                        // turn on implicit separator temporarily
    4250         sout | sepEnable | 1 | 2 | 3 | endl;            // turn on implicit separation, affects all subsequent prints
    4251         sepSet( sout, ", $" );                                          // change separator from " " to ", $"
    4252         sout | 1 | 2 | 3 | endl;
    4253 
    4254 }
    4255 
    4256 // Local Variables: //
    4257 // tab-width: 4 //
    4258 // End: //
    4259 \end{comment}
    4260 %$
     4260        char c;                                                                                                         // basic types
     4261        short int si;
     4262        unsigned short int usi;
     4263        int i;
     4264        unsigned int ui;
     4265        long int li;
     4266        unsigned long int uli;
     4267        long long int lli;
     4268        unsigned long long int ulli;
     4269        float f;
     4270        double d;
     4271        long double ld;
     4272        float _Complex fc;
     4273        double _Complex dc;
     4274        long double _Complex ldc;
     4275        char s1[10], s2[10];
     4276
     4277        ifstream in;                                                                                            // create / open file
     4278        open( &in, "input.data", "r" );
     4279
     4280        &in | &c                                                                                                        // character
     4281                | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli             // integral
     4282                | &f | &d | &ld                                                                                 // floating point
     4283                | &fc | &dc | &ldc                                                                              // floating-point complex
     4284                | cstr( s1 ) | cstr( s2, 10 );                                                  // C string, length unchecked and checked
     4285
     4286        sout | c | ' ' | endl                                                                           // character
     4287                 | si | usi | i | ui | li | uli | lli | ulli | endl             // integral
     4288                 | f | d | ld | endl                                                                    // floating point
     4289                 | fc | dc | ldc | endl;                                                                // complex
     4290        sout | endl;
     4291        sout | f | "" | d | "" | ld | endl                                                      // floating point without separator
     4292                 | sepDisable | fc | dc | ldc | sepEnable | endl                // complex without separator
     4293                 | sepOn | s1 | sepOff | s2 | endl                                              // local separator removal
     4294                 | s1 | "" | s2 | endl;                                                                 // C string withou separator
     4295        sout | endl;
     4296        sepSet( sout, ", $" );                                                                          // change separator, maximum of 15 characters
     4297        sout | f | d | ld | endl                                                                        // floating point without separator
     4298                 | fc | dc | ldc | endl                                                                 // complex without separator
     4299                 | s1 | s2 | endl;
     4300}
     4301
     4302$ cat input.data
     4303A 1 2 3 4 5 6 7 8 1.1 1.2 1.3 1.1+2.3 1.1-2.3 1.1-2.3 abc xyz
     4304$ a.out
     4305A
     43061 2 3 4 5 6 7 8
     43071.1 1.2 1.3
     43081.1+2.3i 1.1-2.3i 1.1-2.3i
     4309
     43101.11.21.3
     43111.1+2.3i1.1-2.3i1.1-2.3i
     4312 abcxyz
     4313abcxyz
     4314
     43151.1, $1.2, $1.3
     43161.1+2.3i, $1.1-2.3i, $1.1-2.3i
     4317abc, $xyz
     4318\end{lstlisting}
     4319\caption{Example I/O}
     4320\label{f:ExampleIO}
     4321\end{figure}
    42614322
    42624323
     
    42704331
    42714332\begin{lstlisting}
    4272 forall( otype T ) T * malloc( void );§\indexc{malloc}§
     4333forall( otype T ) T * malloc( void );
    42734334forall( otype T ) T * malloc( char fill );
    42744335forall( otype T ) T * malloc( T * ptr, size_t size );
    42754336forall( otype T ) T * malloc( T * ptr, size_t size, unsigned char fill );
    4276 forall( otype T ) T * calloc( size_t nmemb );§\indexc{calloc}§
    4277 forall( otype T ) T * realloc( T * ptr, size_t size );§\indexc{ato}§
     4337forall( otype T ) T * calloc( size_t size );
     4338forall( otype T ) T * realloc( T * ptr, size_t size );
    42784339forall( otype T ) T * realloc( T * ptr, size_t size, unsigned char fill );
    42794340
    4280 forall( otype T ) T * aligned_alloc( size_t alignment );§\indexc{ato}§
     4341forall( otype T ) T * aligned_alloc( size_t alignment );
    42814342forall( otype T ) T * memalign( size_t alignment );             // deprecated
    42824343forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
     
    42874348
    42884349
    4289 \subsection{ato / strto}
    4290 
    4291 \begin{lstlisting}
    4292 int ato( const char * ptr );§\indexc{ato}§
     4350\subsection{ato/strto}
     4351
     4352\begin{lstlisting}
     4353int ato( const char * ptr );
    42934354unsigned int ato( const char * ptr );
    42944355long int ato( const char * ptr );
     
    43184379
    43194380
    4320 \subsection{bsearch / qsort}
     4381\subsection{bsearch/qsort}
    43214382
    43224383\begin{lstlisting}
    43234384forall( otype T | { int ?<?( T, T ); } )
    4324 T * bsearch( const T key, const T * arr, size_t dimension );§\indexc{bsearch}§
     4385T * bsearch( const T key, const T * arr, size_t dimension );
    43254386
    43264387forall( otype T | { int ?<?( T, T ); } )
    4327 void qsort( const T * arr, size_t dimension );§\indexc{qsort}§
     4388void qsort( const T * arr, size_t dimension );
    43284389\end{lstlisting}
    43294390
     
    43324393
    43334394\begin{lstlisting}
    4334 char abs( char );§\indexc{abs}§
    4335 int abs( int );
     4395char abs( char );
     4396extern "C" {
     4397int abs( int );                         // use default C routine for int
     4398} // extern "C"
    43364399long int abs( long int );
    43374400long long int abs( long long int );
     
    43394402double abs( double );
    43404403long double abs( long double );
    4341 float abs( float _Complex );
    4342 double abs( double _Complex );
    4343 long double abs( long double _Complex );
     4404float _Complex abs( float _Complex );
     4405double _Complex abs( double _Complex );
     4406long double _Complex abs( long double _Complex );
     4407\end{lstlisting}
     4408
     4409
     4410\subsection{floor/ceil}
     4411
     4412\begin{lstlisting}
     4413float floor( float );
     4414extern "C" {
     4415double floor( double );         // use C routine for double
     4416} // extern "C"
     4417long double floor( long double );
     4418
     4419float ceil( float );
     4420extern "C" {
     4421double ceil( double );          // use C routine for double
     4422} // extern "C"
     4423long double ceil( long double );
    43444424\end{lstlisting}
    43454425
     
    43484428
    43494429\begin{lstlisting}
    4350 void rand48seed( long int s );§\indexc{rand48seed}§
    4351 char rand48();§\indexc{rand48}§
     4430void rand48seed( long int s );
     4431char rand48();
    43524432int rand48();
    43534433unsigned int rand48();
     
    43624442
    43634443
    4364 \subsection{min / max / swap}
     4444\subsection{min/max/swap}
    43654445
    43664446\begin{lstlisting}
    43674447forall( otype T | { int ?<?( T, T ); } )
    4368 T min( const T t1, const T t2 );§\indexc{min}§
     4448T min( const T t1, const T t2 );
    43694449
    43704450forall( otype T | { int ?>?( T, T ); } )
    4371 T max( const T t1, const T t2 );§\indexc{max}§
     4451T max( const T t1, const T t2 );
    43724452
    43734453forall( otype T )
    4374 void swap( T * t1, T * t2 );§\indexc{swap}§
    4375 \end{lstlisting}
    4376 
    4377 
    4378 \section{Math Library}
    4379 \label{s:Math Library}
    4380 
    4381 The goal of the \CFA math-library is to wrap many of the existing C math library-routines that are explicitly polymorphic into implicitly polymorphic versions.
    4382 
    4383 
    4384 \subsection{General}
    4385 
    4386 \begin{lstlisting}
    4387 float fabs( float );§\indexc{fabs}§
    4388 double fabs( double );
    4389 long double fabs( long double );
    4390 float cabs( float _Complex );
    4391 double cabs( double _Complex );
    4392 long double cabs( long double _Complex );
    4393 
    4394 float ?%?( float, float );§\indexc{fmod}§
    4395 float fmod( float, float );
    4396 double ?%?( double, double );
    4397 double fmod( double, double );
    4398 long double ?%?( long double, long double );
    4399 long double fmod( long double, long double );
    4400 
    4401 float remainder( float, float );§\indexc{remainder}§
    4402 double remainder( double, double );
    4403 long double remainder( long double, long double );
    4404 
    4405 [ int, float ] remquo( float, float );§\indexc{remquo}§
    4406 float remquo( float, float, int * );
    4407 [ int, double ] remquo( double, double );
    4408 double remquo( double, double, int * );
    4409 [ int, long double ] remquo( long double, long double );
    4410 long double remquo( long double, long double, int * );
    4411 
    4412 [ int, float ] div( float, float );                                             // alternative name for remquo
    4413 float div( float, float, int * );§\indexc{div}§
    4414 [ int, double ] div( double, double );
    4415 double div( double, double, int * );
    4416 [ int, long double ] div( long double, long double );
    4417 long double div( long double, long double, int * );
    4418 
    4419 float fma( float, float, float );§\indexc{fma}§
    4420 double fma( double, double, double );
    4421 long double fma( long double, long double, long double );
    4422 
    4423 float fdim( float, float );§\indexc{fdim}§
    4424 double fdim( double, double );
    4425 long double fdim( long double, long double );
    4426 
    4427 float nan( const char * );§\indexc{nan}§
    4428 double nan( const char * );
    4429 long double nan( const char * );
    4430 \end{lstlisting}
    4431 
    4432 
    4433 \subsection{Exponential}
    4434 
    4435 \begin{lstlisting}
    4436 float exp( float );§\indexc{exp}§
    4437 double exp( double );
    4438 long double exp( long double );
    4439 float _Complex exp( float _Complex );
    4440 double _Complex exp( double _Complex );
    4441 long double _Complex exp( long double _Complex );
    4442 
    4443 float exp2( float );§\indexc{exp2}§
    4444 double exp2( double );
    4445 long double exp2( long double );
    4446 float _Complex exp2( float _Complex );
    4447 double _Complex exp2( double _Complex );
    4448 long double _Complex exp2( long double _Complex );
    4449 
    4450 float expm1( float );§\indexc{expm1}§
    4451 double expm1( double );
    4452 long double expm1( long double );
    4453 
    4454 float log( float );§\indexc{log}§
    4455 double log( double );
    4456 long double log( long double );
    4457 float _Complex log( float _Complex );
    4458 double _Complex log( double _Complex );
    4459 long double _Complex log( long double _Complex );
    4460 
    4461 float log2( float );§\indexc{log2}§
    4462 double log2( double );
    4463 long double log2( long double );
    4464 float _Complex log2( float _Complex );
    4465 double _Complex log2( double _Complex );
    4466 long double _Complex log2( long double _Complex );
    4467 
    4468 float log10( float );§\indexc{log10}§
    4469 double log10( double );
    4470 long double log10( long double );
    4471 float _Complex log10( float _Complex );
    4472 double _Complex log10( double _Complex );
    4473 long double _Complex log10( long double _Complex );
    4474 
    4475 float log1p( float );§\indexc{log1p}§
    4476 double log1p( double );
    4477 long double log1p( long double );
    4478 
    4479 int ilogb( float );§\indexc{ilogb}§
    4480 int ilogb( double );
    4481 int ilogb( long double );
    4482 
    4483 float logb( float );§\indexc{logb}§
    4484 double logb( double );
    4485 long double logb( long double );
    4486 \end{lstlisting}
    4487 
    4488 
    4489 \subsection{Power}
    4490 
    4491 \begin{lstlisting}
    4492 float sqrt( float );§\indexc{sqrt}§
    4493 double sqrt( double );
    4494 long double sqrt( long double );
    4495 float _Complex sqrt( float _Complex );
    4496 double _Complex sqrt( double _Complex );
    4497 long double _Complex sqrt( long double _Complex );
    4498 
    4499 float cbrt( float );§\indexc{cbrt}§
    4500 double cbrt( double );
    4501 long double cbrt( long double );
    4502 
    4503 float hypot( float, float );§\indexc{hypot}§
    4504 double hypot( double, double );
    4505 long double hypot( long double, long double );
    4506 
    4507 float pow( float, float );§\indexc{pow}§
    4508 double pow( double, double );
    4509 long double pow( long double, long double );
    4510 float _Complex pow( float _Complex, float _Complex );
    4511 double _Complex pow( double _Complex, double _Complex );
    4512 long double _Complex pow( long double _Complex, long double _Complex );
    4513 \end{lstlisting}
    4514 
    4515 
    4516 \subsection{Trigonometric}
    4517 
    4518 \begin{lstlisting}
    4519 float sin( float );§\indexc{sin}§
    4520 double sin( double );
    4521 long double sin( long double );
    4522 float _Complex sin( float _Complex );
    4523 double _Complex sin( double _Complex );
    4524 long double _Complex sin( long double _Complex );
    4525 
    4526 float cos( float );§\indexc{cos}§
    4527 double cos( double );
    4528 long double cos( long double );
    4529 float _Complex cos( float _Complex );
    4530 double _Complex cos( double _Complex );
    4531 long double _Complex cos( long double _Complex );
    4532 
    4533 float tan( float );§\indexc{tan}§
    4534 double tan( double );
    4535 long double tan( long double );
    4536 float _Complex tan( float _Complex );
    4537 double _Complex tan( double _Complex );
    4538 long double _Complex tan( long double _Complex );
    4539 
    4540 float asin( float );§\indexc{asin}§
    4541 double asin( double );
    4542 long double asin( long double );
    4543 float _Complex asin( float _Complex );
    4544 double _Complex asin( double _Complex );
    4545 long double _Complex asin( long double _Complex );
    4546 
    4547 float acos( float );§\indexc{acos}§
    4548 double acos( double );
    4549 long double acos( long double );
    4550 float _Complex acos( float _Complex );
    4551 double _Complex acos( double _Complex );
    4552 long double _Complex acos( long double _Complex );
    4553 
    4554 float atan( float );§\indexc{atan}§
    4555 double atan( double );
    4556 long double atan( long double );
    4557 float _Complex atan( float _Complex );
    4558 double _Complex atan( double _Complex );
    4559 long double _Complex atan( long double _Complex );
    4560 
    4561 float atan2( float, float );§\indexc{atan2}§
    4562 double atan2( double, double );
    4563 long double atan2( long double, long double );
    4564 
    4565 float atan( float, float );                                                             // alternative name for atan2
    4566 double atan( double, double );§\indexc{atan}§
    4567 long double atan( long double, long double );
    4568 \end{lstlisting}
    4569 
    4570 
    4571 \subsection{Hyperbolic}
    4572 
    4573 \begin{lstlisting}
    4574 float sinh( float );§\indexc{sinh}§
    4575 double sinh( double );
    4576 long double sinh( long double );
    4577 float _Complex sinh( float _Complex );
    4578 double _Complex sinh( double _Complex );
    4579 long double _Complex sinh( long double _Complex );
    4580 
    4581 float cosh( float );§\indexc{cosh}§
    4582 double cosh( double );
    4583 long double cosh( long double );
    4584 float _Complex cosh( float _Complex );
    4585 double _Complex cosh( double _Complex );
    4586 long double _Complex cosh( long double _Complex );
    4587 
    4588 float tanh( float );§\indexc{tanh}§
    4589 double tanh( double );
    4590 long double tanh( long double );
    4591 float _Complex tanh( float _Complex );
    4592 double _Complex tanh( double _Complex );
    4593 long double _Complex tanh( long double _Complex );
    4594 
    4595 float asinh( float );§\indexc{asinh}§
    4596 double asinh( double );
    4597 long double asinh( long double );
    4598 float _Complex asinh( float _Complex );
    4599 double _Complex asinh( double _Complex );
    4600 long double _Complex asinh( long double _Complex );
    4601 
    4602 float acosh( float );§\indexc{acosh}§
    4603 double acosh( double );
    4604 long double acosh( long double );
    4605 float _Complex acosh( float _Complex );
    4606 double _Complex acosh( double _Complex );
    4607 long double _Complex acosh( long double _Complex );
    4608 
    4609 float atanh( float );§\indexc{atanh}§
    4610 double atanh( double );
    4611 long double atanh( long double );
    4612 float _Complex atanh( float _Complex );
    4613 double _Complex atanh( double _Complex );
    4614 long double _Complex atanh( long double _Complex );
    4615 \end{lstlisting}
    4616 
    4617 
    4618 \subsection{Error / Gamma}
    4619 
    4620 \begin{lstlisting}
    4621 float erf( float );§\indexc{erf}§
    4622 double erf( double );
    4623 long double erf( long double );
    4624 float _Complex erf( float _Complex );
    4625 double _Complex erf( double _Complex );
    4626 long double _Complex erf( long double _Complex );
    4627 
    4628 float erfc( float );§\indexc{erfc}§
    4629 double erfc( double );
    4630 long double erfc( long double );
    4631 float _Complex erfc( float _Complex );
    4632 double _Complex erfc( double _Complex );
    4633 long double _Complex erfc( long double _Complex );
    4634 
    4635 float lgamma( float );§\indexc{lgamma}§
    4636 double lgamma( double );
    4637 long double lgamma( long double );
    4638 float lgamma( float, int * );
    4639 double lgamma( double, int * );
    4640 long double lgamma( long double, int * );
    4641 
    4642 float tgamma( float );§\indexc{tgamma}§
    4643 double tgamma( double );
    4644 long double tgamma( long double );
    4645 \end{lstlisting}
    4646 
    4647 
    4648 \subsection{Nearest Integer}
    4649 
    4650 \begin{lstlisting}
    4651 float floor( float );§\indexc{floor}§
    4652 double floor( double );
    4653 long double floor( long double );
    4654 
    4655 float ceil( float );§\indexc{ceil}§
    4656 double ceil( double );
    4657 long double ceil( long double );
    4658 
    4659 float trunc( float );§\indexc{trunc}§
    4660 double trunc( double );
    4661 long double trunc( long double );
    4662 
    4663 float rint( float );§\indexc{rint}§
    4664 long double rint( long double );
    4665 long int rint( float );
    4666 long int rint( double );
    4667 long int rint( long double );
    4668 long long int rint( float );
    4669 long long int rint( double );
    4670 long long int rint( long double );
    4671 
    4672 long int lrint( float );§\indexc{lrint}§
    4673 long int lrint( double );
    4674 long int lrint( long double );
    4675 long long int llrint( float );
    4676 long long int llrint( double );
    4677 long long int llrint( long double );
    4678 
    4679 float nearbyint( float );§\indexc{nearbyint}§
    4680 double nearbyint( double );
    4681 long double nearbyint( long double );
    4682 
    4683 float round( float );§\indexc{round}§
    4684 long double round( long double );
    4685 long int round( float );
    4686 long int round( double );
    4687 long int round( long double );
    4688 long long int round( float );
    4689 long long int round( double );
    4690 long long int round( long double );
    4691 
    4692 long int lround( float );§\indexc{lround}§
    4693 long int lround( double );
    4694 long int lround( long double );
    4695 long long int llround( float );
    4696 long long int llround( double );
    4697 long long int llround( long double );
    4698 \end{lstlisting}
    4699 
    4700 
    4701 \subsection{Manipulation}
    4702 
    4703 \begin{lstlisting}
    4704 float copysign( float, float );§\indexc{copysign}§
    4705 double copysign( double, double );
    4706 long double copysign( long double, long double );
    4707 
    4708 float frexp( float, int * );§\indexc{frexp}§
    4709 double frexp( double, int * );
    4710 long double frexp( long double, int * );
    4711 
    4712 float ldexp( float, int );§\indexc{ldexp}§
    4713 double ldexp( double, int );
    4714 long double ldexp( long double, int );
    4715 
    4716 [ float, float ] modf( float );§\indexc{modf}§
    4717 float modf( float, float * );
    4718 [ double, double ] modf( double );
    4719 double modf( double, double * );
    4720 [ long double, long double ] modf( long double );
    4721 long double modf( long double, long double * );
    4722 
    4723 float nextafter( float, float );§\indexc{nextafter}§
    4724 double nextafter( double, double );
    4725 long double nextafter( long double, long double );
    4726 
    4727 float nexttoward( float, long double );§\indexc{nexttoward}§
    4728 double nexttoward( double, long double );
    4729 long double nexttoward( long double, long double );
    4730 
    4731 float scalbn( float, int );§\indexc{scalbn}§
    4732 double scalbn( double, int );
    4733 long double scalbn( long double, int );
    4734 
    4735 float scalbln( float, long int );§\indexc{scalbln}§
    4736 double scalbln( double, long int );
    4737 long double scalbln( long double, long int );
     4454void swap( T * t1, T * t2 );
    47384455\end{lstlisting}
    47394456
     
    47474464\begin{lstlisting}
    47484465// implementation
    4749 struct Rational {§\indexc{Rational}§
     4466struct Rational {
    47504467        long int numerator, denominator;                                        // invariant: denominator > 0
    47514468}; // Rational
  • src/examples/io.c

    rfbfde843 r540de412  
    1111// Created On       : Wed Mar  2 16:56:02 2016
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Sat Apr 30 08:34:13 2016
    14 // Update Count     : 27
     13// Last Modified On : Wed Apr 13 23:03:14 2016
     14// Update Count     : 22
    1515//
    1616
     
    5252                 | sepDisable | fc | dc | ldc | sepEnable | endl                // complex without separator
    5353                 | sepOn | s1 | sepOff | s2 | endl                                              // local separator removal
    54                  | s1 | "" | s2 | endl;                                                                 // C string without separator
     54                 | s1 | "" | s2 | endl;                                                                 // C string withou separator
    5555        sout | endl;
    5656
     
    7070                | "£" | 27
    7171                | "¥" | 27
    72                 | "¡" | 27
    7372                | "¿" | 27
    7473                | "«" | 27
  • src/libcfa/fstream

    rfbfde843 r540de412  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Apr 28 08:08:04 2016
    13 // Update Count     : 88
     12// Last Modified On : Tue Apr 19 20:44:10 2016
     13// Update Count     : 84
    1414//
    1515
     
    2222struct ofstream {
    2323        void *file;
    24         _Bool sepDefault;
    25         int sepOnOff;                                                                           // FIX ME: type should be _Bool
     24        int sepDefault;
     25        int sepOnOff;
    2626        char separator[separateSize];
    2727}; // ofstream
  • src/libcfa/fstream.c

    rfbfde843 r540de412  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Mon May 02 15:14:52 2016
    13 // Update Count     : 187
     12// Last Modified On : Thu Apr 14 17:04:24 2016
     13// Update Count     : 176
    1414//
    1515
     
    9393int prtfmt( ofstream * os, const char fmt[], ... ) {
    9494    va_list args;
     95
    9596    va_start( args, fmt );
    9697    int len = vfprintf( (FILE *)(os->file), fmt, args );
     
    102103        } // if
    103104    va_end( args );
    104 
    105         sepReset( os );                                                                         // reset separator
    106105        return len;
    107106} // prtfmt
  • src/libcfa/iostream.c

    rfbfde843 r540de412  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Mon May 02 15:13:55 2016
    13 // Update Count     : 302
     12// Last Modified On : Thu Apr 14 16:02:09 2016
     13// Update Count     : 278
    1414//
    1515
     
    3434ostype * ?|?( ostype *os, short int si ) {
    3535        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     36        sepReset( os );
    3637        prtfmt( os, "%hd", si );
    3738        return os;
     
    4142ostype * ?|?( ostype *os, unsigned short int usi ) {
    4243        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     44        sepReset( os );
    4345        prtfmt( os, "%hu", usi );
    4446        return os;
     
    4850ostype * ?|?( ostype *os, int i ) {
    4951        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     52        sepReset( os );
    5053        prtfmt( os, "%d", i );
    5154        return os;
     
    5558ostype * ?|?( ostype *os, unsigned int ui ) {
    5659        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     60        sepReset( os );
    5761        prtfmt( os, "%u", ui );
    5862        return os;
     
    6266ostype * ?|?( ostype *os, long int li ) {
    6367        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     68        sepReset( os );
    6469        prtfmt( os, "%ld", li );
    6570        return os;
     
    6974ostype * ?|?( ostype *os, unsigned long int uli ) {
    7075        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     76        sepReset( os );
    7177        prtfmt( os, "%lu", uli );
    7278        return os;
     
    7682ostype * ?|?( ostype *os, long long int lli ) {
    7783        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     84        sepReset( os );
    7885        prtfmt( os, "%lld", lli );
    7986        return os;
     
    8390ostype * ?|?( ostype *os, unsigned long long int ulli ) {
    8491        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     92        sepReset( os );
    8593        prtfmt( os, "%llu", ulli );
    8694        return os;
     
    9098ostype * ?|?( ostype *os, float f ) {
    9199        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     100        sepReset( os );
    92101        prtfmt( os, "%g", f );
    93102        return os;
     
    97106ostype * ?|?( ostype *os, double d ) {
    98107        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     108        sepReset( os );
    99109        prtfmt( os, "%.*lg", DBL_DIG, d );
    100110        return os;
     
    104114ostype * ?|?( ostype *os, long double ld ) {
    105115        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     116        sepReset( os );
    106117        prtfmt( os, "%.*Lg", LDBL_DIG, ld );
    107118        return os;
     
    144155                // opening delimiters
    145156                ['('] : Open, ['['] : Open, ['{'] : Open,
    146                 ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open,
    147                 [(unsigned char)'¡'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
     157                ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open,
    148158                // closing delimiters
    149159                [','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close,
     
    152162                // opening-closing delimiters
    153163                ['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose,
    154                 [' '] : OpenClose, ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
     164                ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace
    155165        }; // mask
    156166
    157   if ( cp[0] == '\0' ) { sepOff( os ); return os; }             // null string => no separator
    158 
     167        int len = strlen( cp );
     168        // null string => no separator
     169  if ( len == 0 ) { sepOff( os ); return os; }
    159170        // first character IS NOT spacing or closing punctuation => add left separator
    160171        unsigned char ch = cp[0];                                                       // must make unsigned
     
    162173                prtfmt( os, "%s", sepGet( os ) );
    163174        } // if
    164 
    165         // if string starts line, must reset to determine open state because separator is off
    166         sepReset( os );                                                                         // reset separator
    167 
    168175        // last character IS spacing or opening punctuation => turn off separator for next item
    169         unsigned int len = strlen( cp ), posn = len - 1;
     176        unsigned int posn = len - 1;
    170177        ch = cp[posn];                                                                          // must make unsigned
    171         if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
     178        if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) {
     179                sepOff( os );
     180        } else {
    172181                sepOn( os );
    173         } else {
    174                 sepOff( os );
    175182        } // if
    176183        return write( os, cp, len );
     
    180187ostype * ?|?( ostype *os, const void *p ) {
    181188        if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) );
     189        sepReset( os );
    182190        prtfmt( os, "%p", p );
    183191        return os;
  • src/libcfa/stdlib

    rfbfde843 r540de412  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr 27 22:03:29 2016
    13 // Update Count     : 96
     12// Last Modified On : Thu Apr 21 07:55:21 2016
     13// Update Count     : 95
    1414//
    1515
     
    4545
    4646forall( otype T ) T * aligned_alloc( size_t alignment );
    47 forall( otype T ) T * memalign( size_t alignment );             // deprecated
     47forall( otype T ) T * memalign( size_t alignment );
    4848forall( otype T ) int posix_memalign( T ** ptr, size_t alignment );
    4949
  • src/libcfa/stdlib.c

    rfbfde843 r540de412  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Apr 28 07:54:21 2016
    13 // Update Count     : 166
     12// Last Modified On : Thu Apr 21 07:58:29 2016
     13// Update Count     : 165
    1414//
    1515
     
    213213//---------------------------------------
    214214
    215 // forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
    216 // [ T, T ] div( T t1, T t2 ) { return [ t1 / t2, t1 % t2 ]; }
     215forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
     216[ T, T ] div( T t1, T t2 ) { /* return [ t1 / t2, t1 % t2 ]; */ }
    217217
    218218//---------------------------------------
Note: See TracChangeset for help on using the changeset viewer.