Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/refrat/refrat.tex

    rf60d997 r99f4165  
    1 \documentclass[openright,twoside]{report}
    2 \usepackage{fullpage,times}
    3 \usepackage{xspace}
    4 \usepackage{varioref}
    5 \usepackage{listings}
    6 \usepackage{latexsym}                                   % \Box
    7 \usepackage{mathptmx}                                   % better math font with "times"
    8 \usepackage[pagewise]{lineno}
    9 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
    10 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
    11 \usepackage{breakurl}
    12 \urlstyle{sf}
    13 
    14 %\input code.sty
    15 \input xref.tex
    16 
    17 \newcommand{\define}[1]{\emph{#1\/}\index{#1}}
    18 \newenvironment{rationale}{%
    19   \begin{quotation}\noindent$\Box$\enspace
    20 }{%
    21   \hfill\enspace$\Box$\end{quotation}
    22 }%
    23 \newcommand{\rewrite}{\(\Rightarrow\)}
    24 \newcommand{\rewriterules}{\paragraph{Rewrite Rules}\hskip1em\par\noindent}
    25 \newcommand{\examples}{\paragraph{Examples}\hskip1em\par\noindent}
    26 \newcommand{\semantics}{\paragraph{Semantics}\hskip1em\par\noindent}
    27 \newcommand{\constraints}{\paragraph{Constraints}\hskip1em\par\noindent}
    28 \newenvironment{predefined}{%
    29   \paragraph{Predefined Identifiers}%
    30 %  \begin{code}%
    31 }{%
    32 %  \end{code}
    33 }%
    34 
    35 \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]}
    36 \let\endsyntax=\endtrivlist
    37 \newcommand{\lhs}[1]{\par{\it #1:}\index{#1@{\it #1}|italic}}
    38 \newcommand{\rhs}{\hfil\break\hbox{\hskip1in}}
    39 \newcommand{\oldlhs}[1]{{\it #1: \ldots}\index{#1@{\it #1}|italic}}
    40 \newcommand{\nonterm}[1]{{\it #1\/}\index{#1@{\it #1}|italic}}
    41 \newcommand{\opt}{$_{opt}$\ }
    42 
    43 \renewcommand{\reftextfaceafter}{\unskip}
    44 \renewcommand{\reftextfacebefore}{\unskip}
    45 \renewcommand{\reftextafter}{\unskip}
    46 \renewcommand{\reftextbefore}{\unskip}
    47 \renewcommand{\reftextfaraway}[1]{\unskip, p.~\pageref{#1}}
    48 \renewcommand{\reftextpagerange}[2]{\unskip, pp.~\pageref{#1}--\pageref{#2}}
    49 \newcommand{\VRef}[2][Section]{\ifx#1\@empty\else{#1}\nobreakspace\fi\vref{#2}}
    50 \newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
    51 
    52 \newcommand{\CFA}{Cforall\xspace}
    53 \newcommand{\CFAA}{C$\forall$\xspace}
    54 \newcommand{\CC}{C\kern-.1em\hbox{+\kern-.25em+}\xspace}
    55 \def\c11{ISO/IEC C}% cannot have numbers in latex command name
    56 
    57 \lstdefinelanguage{CFA}[ANSI]{C}%
    58   {morekeywords={asm,_Atomic,catch,choose,_Complex,context,dtype,fallthru,forall,ftype,_Imaginary,lvalue,restrict,throw,try,type,},
    59 }
    60 
    61 \lstset{
    62 language=CFA,
    63 columns=fullflexible,
    64 basicstyle=\sf\small,
    65 tabsize=4,
    66 xleftmargin=\parindent,
    67 escapechar=@,
    68 %showtabs=true,
    69 %tab=\rightarrowfill,
    70 }
    71 
    72 \setcounter{secnumdepth}{3}     % number subsubsections
    73 \makeindex
    74 
    75 \begin{document}
    76 \pagestyle{headings}
    77 \linenumbers                                    % comment out to turn off line numbering
    78 
    79 \title{\CFA (\CFAA) Reference Manual and Rationale}
    80 \author{Glen Ditchfield}
    81 \date{DRAFT\\\today}
    82 
    83 \pagenumbering{roman}
    84 \pagestyle{plain}
    85 
    86 \maketitle
    87 
    88 \vspace*{\fill}
    89 \thispagestyle{empty}
    90 \noindent
    91 \copyright\,2015 Glen Ditchfield \\ \\
    92 \noindent
    93 This work is licensed under the Creative Commons Attribution 4.0 International License. To view a
    94 copy of this license, visit {\small\url{http://creativecommons.org/licenses/by/4.0}}.
    95 \vspace*{1in}
    96 
    97 \clearpage
    98 \pdfbookmark[1]{Contents}{section}
    99 \tableofcontents
    100 
    101 \clearpage
    102 \pagenumbering{arabic}
    103 
    104 
    105 \chapter*{Introduction}\addcontentsline{toc}{chapter}{Introduction}
    106 
    107 This document is a reference manual and rationale for \CFA, a polymorphic extension of the C
    108 programming language. It makes frequent reference to the {\c11} standard \cite{ANS:C11}, and
    109 occasionally compares \CFA to {\CC} \cite{c++}.
    110 
    111 The manual deliberately imitates the ordering of the {\c11} standard (although the section numbering
    112 differs). Unfortunately, this means that the manual contains more ``forward references'' than
    113 usual, and that it will be hard to follow if the reader does not have a copy of the {\c11} standard
    114 near-by. For a gentle introduction to \CFA, see the companion document ``An Overview of
    115 \CFA'' \cite{Ditchfield96:Overview}.
    116 
    117 \begin{rationale}
    118 Commentary (like this) is quoted with quads. Commentary usually deals with subtle points, the
    119 rationale behind a rule, and design decisions.
    120 \end{rationale}
    121 
    122 % No ``Scope'' or ``Normative references'' chapters yet.
    123 \setcounter{chapter}{2}
    124 \chapter{Terms, definitions, and symbols}
    125 Terms from the {\c11} standard used in this document have the same meaning as in the {\c11}
    126 standard.
    127 
    128 % No ``Conformance'' or ``Environment'' chapters yet.
    129 \setcounter{chapter}{5}
    130 \chapter{Language}
    131 \section{Notation}
    132 The syntax notation used in this document is the same as is used in the {\c11} standard, with one
    133 exception: ellipsis in the definition of a nonterminal, as in ``\emph{declaration:} \ldots'',
    134 indicates that these rules extend a previous definition, which occurs in this document or in the
    135 {\c11} standard.
    136 
    137 
    138 \section{Concepts}
    139 
    140 
    141 \subsection{Scopes of identifiers}\index{scopes}
    142 
    143 \CFA's scope rules differ from C's in one major respect: a declaration of an identifier may
    144 overload\index{overloading} outer declarations of lexically identical identifiers in the same name
    145 space\index{name spaces}, instead of hiding them. The outer declaration is hidden if the two
    146 declarations have compatible type\index{compatible type}, or if one declares an array type and the
    147 other declares a pointer type and the element type and pointed-at type are compatible, or if one has
    148 function type and the other is a pointer to a compatible function type, or if one declaration is a
    149 \lstinline$type$\use{type} or \lstinline$typedef$\use{typedef} declaration and the other is not.
    150 The outer declaration becomes visible\index{visible} when the scope of the inner declaration
    151 terminates.
    152 \begin{rationale}
    153 Hence, a \CFA program can declare an \lstinline$int v$ and a \lstinline$float v$ in the same
    154 scope; a {\CC} program can not.
    155 \end{rationale}
    156 
    157 
    158 \subsection{Linkage of identifiers}\index{linkage}
    159 
    160 \CFA's linkage rules differ from C's in only one respect: instances of a particular identifier
    161 with external or internal linkage do not necessarily denote the same object or function. Instead,
    162 in the set of translation units and libraries that constitutes an entire program, any two instances
    163 of a particular identifier with external linkage\index{external linkage} denote the same object or
    164 function if they have compatible types\index{compatible type}, or if one declares an array type and
    165 the other declares a pointer type and the element type and pointed-at type are compatible, or if one
    166 has function type and the other is a pointer to a compatible function type. Within one translation
    167 unit, each instance of an identifier with internal linkage\index{internal linkage} denotes the same
    168 object or function in the same circumstances. Identifiers with no linkage\index{no linkage} always
    169 denote unique entities.
    170 \begin{rationale}
    171 A \CFA program can declare an \lstinline$extern int v$ and an \lstinline$extern float v$; a C
    172 program cannot.
    173 \end{rationale}
    174 
    175 \section{Conversions}
    176 \CFA defines situations where values of one type are automatically converted to another type.
    177 These conversions are called \define{implicit conversions}. The programmer can request
    178 \define{explicit conversions} using cast expressions.
    179 
    180 
    181 \subsection{Arithmetic operands}
    182 \setcounter{subsubsection}{7}
    183 
    184 
    185 \subsubsection{Safe arithmetic conversions}
    186 In C, a pattern of conversions known as the \define{usual arithmetic conversions} is used with most
    187 binary arithmetic operators to convert the operands to a common type and determine the type of the
    188 operator's result. In \CFA, these conversions play a role in overload resolution, and
    189 collectively are called the \define{safe arithmetic conversions}.
    190 
    191 Let \(int_r\) and \(unsigned_r\) be the signed and unsigned integer types with integer conversion
    192 rank\index{integer conversion rank} \index{rank|see{integer conversion rank}} $r$. Let
    193 \(unsigned_{mr}\) be the unsigned integer type with maximal rank.
    194 
    195 The following conversions are \emph{direct} safe arithmetic conversions.
    196 \begin{itemize}
    197 \item
    198 The integer promotions\index{integer promotions}.
    199 
    200 \item
    201 For every rank $r$ greater than or equal to the rank of \lstinline$int$, conversion from \(int_r\)
    202 to \(unsigned_r\).
    203 
    204 \item
    205 For every rank $r$ greater than or equal to the rank of \lstinline$int$, where \(int_{r+1}\) exists
    206 and can represent all values of \(unsigned_r\), conversion from \(unsigned_r\) to \(int_{r+1}\).
    207 
    208 \item
    209 Conversion from \(unsigned_{mr}\) to \lstinline$float$.
    210 
    211 \item
    212 Conversion from an enumerated type to its compatible integer type.
    213 
    214 \item
    215 Conversion from \lstinline$float$ to \lstinline$double$, and from \lstinline$double$ to
    216 \lstinline$long double$.
    217 
    218 \item
    219 Conversion from \lstinline$float _Complex$ to \lstinline$double _Complex$,
    220 and from \lstinline$double _Complex$ to \lstinline$long double _Complex$.
    221 
    222 \begin{sloppypar}
    223 \item
    224 Conversion from \lstinline$float _Imaginary$ to \lstinline$double _Imaginary$, and from
    225 \lstinline$double _Imaginary$ to \lstinline$long double$ \lstinline$_Imaginary$, if the
    226 implementation supports imaginary types.
    227 \end{sloppypar}
    228 \end{itemize}
    229 
    230 If type \lstinline$T$ can be converted to type \lstinline$U$ by a safe direct arithmetic conversion
    231 and type \lstinline$U$ can be converted to type \lstinline$V$ by a safe arithmetic conversion, then
    232 the conversion from \lstinline$T$ to type \lstinline$V$ is an \emph{indirect} safe arithmetic
    233 conversion.
    234 
    235 \begin{rationale}
    236 Note that {\c11} does not include conversion from real types\index{real type} to complex
    237 types\index{complex type} in the usual arithmetic conversions, and \CFA does not include them as
    238 safe conversions.
    239 \end{rationale}
    240 
    241 
    242 \subsection{Other operands}
    243 \setcounter{subsubsection}{3}
    244 
    245 
    246 \subsubsection{Anonymous structures and unions}
    247 \label{anon-conv}
    248 
    249 If an expression's type is a pointer to a structure or union type that has a member that is an
    250 anonymous structure\index{anonymous structure} or an anonymous union\index{anonymous union}, it can
    251 be implicitly converted\index{implicit conversions} to a pointer to the anonymous structure's or
    252 anonymous union's type. The result of the conversion is a pointer to the member.
    253 
    254 \examples
    255 \begin{lstlisting}
    256 struct point {
    257         int x, y;
    258 };
    259 void move_by(struct point * p1, struct point * p2) {@\impl{move_by}@
    260         p1->x += p2.x;
    261         p1->y += p2.y;
    262 }
    263 
    264 struct color_point {
    265         enum { RED, BLUE, GREEN } color;
    266         struct point;
    267 } cp1, cp2;
    268 move_to(&cp1, &cp2);
    269 \end{lstlisting}
    270 Thanks to implicit conversion, the two arguments that \lstinline$move_by()$ receives are pointers to
    271 \lstinline$cp1$'s second member and \lstinline$cp2$'s second member.
    272 
    273 
    274 \subsubsection{Specialization}
    275 A function or value whose type is polymorphic may be implicitly converted to one whose type is less
    276 polymorphic\index{less polymorphic} by binding values to one or more of its inferred
    277 parameters\index{inferred parameter}. Any value that is legal for the inferred parameter may be
    278 used, including other inferred parameters.
    279 
    280 If, after the inferred parameter binding, an assertion parameter\index{assertion parameters} has no
    281 inferred parameters in its type, then an object or function must be visible at the point of the
    282 specialization that has the same identifier as the assertion parameter and has a type that is
    283 compatible\index{compatible type} with or can be specialized to the type of the assertion parameter.
    284 The assertion parameter is bound to that object or function.
    285 
    286 The type of the specialization is the type of the original with the bound inferred parameters and
    287 the bound assertion parameters replaced by their bound values.
    288 
    289 \examples
    290 The type
    291 \begin{lstlisting}
    292 forall( type T, type U ) void (*)( T, U );
    293 \end{lstlisting}
    294 can be specialized to (among other things)
    295 \begin{lstlisting}
    296 forall( type T ) void (*)( T, T );              // U bound to T
    297 forall( type T ) void (*)( T, real );   // U bound to real
    298 forall( type U ) void (*)( real, U );   // T bound to real
    299 void f( real, real );                                   // both bound to real
    300 \end{lstlisting}
    301 
    302 The type
    303 \begin{lstlisting}
    304 forall( type T | T ?+?( T, T )) T (*)( T );
    305 \end{lstlisting}
    306 can be specialized to (among other things)
    307 \begin{lstlisting}
    308 int (*)( int );                                         // T bound to int, and T ?+?(T, T ) bound to int ?+?( int, int )
    309 \end{lstlisting}
    310 
    311 
    312 \subsubsection{Safe conversions}
    313 
    314 A \define{direct safe conversion} is one of the following conversions:
    315 \begin{itemize}
    316 \item
    317 a direct safe arithmetic conversion;
    318 \item
    319 from any object type or incomplete type to \lstinline$void$;
    320 \item
    321 from a pointer to any non-\lstinline$void$ type to a pointer to \lstinline$void$;
    322 \item
    323 from a pointer to any type to a pointer to a more qualified version of the type\index{qualified
    324 type};
    325 \item
    326 from a pointer to a structure or union type to a pointer to the type of a member of the structure or
    327 union that is an anonymous structure\index{anonymous structure} or an anonymous
    328 union\index{anonymous union};
    329 \item
    330 within the scope of an initialized type declaration\index{type declaration}, conversions between a
    331 type and its implementation or between a pointer to a type and a pointer to its implementation.
    332 \end{itemize}
    333 
    334 Conversions that are not safe conversions are \define{unsafe conversions}.
    335 \begin{rationale}
    336 As in C, there is an implicit conversion from \lstinline$void *$ to any pointer type. This is
    337 clearly dangerous, and {\CC} does not have this implicit conversion.
    338 \CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a
    339 superset of C as possible, but discourages it by making it unsafe.
    340 \end{rationale}
    341 
    342 
    343 \subsection{Conversion cost}
    344 
    345 The \define{conversion cost} of a safe\index{safe conversions}
    346 conversion\footnote{Unsafe\index{unsafe conversions} conversions do not have defined conversion
    347 costs.} is a measure of how desirable or undesirable it is. It is defined as follows.
    348 \begin{itemize}
    349 \item
    350 The cost of a conversion from any type to itself is 0.
    351 
    352 \item
    353 The cost of a direct safe conversion is 1.
    354 
    355 \item
    356 The cost of an indirect safe arithmetic conversion is the smallest number of direct conversions
    357 needed to make up the conversion.
    358 \end{itemize}
    359 
    360 \examples
    361 In the following, assume an implementation that does not provide any extended integer types.
    362 
    363 \begin{itemize}
    364 \item
    365 The cost of an implicit conversion from \lstinline$int$ to \lstinline$long$ is 1. The cost of an
    366 implicit conversion from \lstinline$long$ to \lstinline$double$ is 3, because it is defined in terms
    367 of conversions from \lstinline$long$ to \lstinline$unsigned long$, then to \lstinline$float$, and
    368 then to \lstinline$double$.
    369 
    370 \item
    371 If \lstinline$int$ can represent all the values of \lstinline$unsigned short$, then the cost of an
    372 implicit conversion from \lstinline$unsigned short$ to \lstinline$unsigned$ is 2:
    373 \lstinline$unsigned short$ to \lstinline$int$ to \lstinline$unsigned$. Otherwise,
    374 \lstinline$unsigned short$ is converted directly to \lstinline$unsigned$, and the cost is 1.
    375 
    376 \item
    377 If \lstinline$long$ can represent all the values of \lstinline$unsigned$, then the conversion cost
    378 of \lstinline$unsigned$ to \lstinline$long$ is 1. Otherwise, the conversion is an unsafe
    379 conversion, and its conversion cost is undefined.
    380 \end{itemize}
    381 
    382 \section{Lexical elements}
    383 \subsection{Keywords}
    384 \begin{syntax}
    385 \oldlhs{keyword}
    386         \rhs \lstinline$forall$
    387         \rhs \lstinline$lvalue$
    388         \rhs \lstinline$context$
    389         \rhs \lstinline$dtype$
    390         \rhs \lstinline$ftype$
    391         \rhs \lstinline$type$
    392 \end{syntax}
    393 
    394 
    395 \subsection{Identifiers}
    396 
    397 \CFA allows operator overloading\index{overloading} by associating operators with special
    398 function identifiers. Furthermore, the constants ``\lstinline$0$'' and ``\lstinline$1$'' have
    399 special status for many of C's data types (and for many programmer-defined data types as well), so
    400 \CFA treats them as overloadable identifiers. Programmers can use these identifiers to declare
    401 functions and objects that implement operators and constants for their own types.
    402 
    403 
    404 \setcounter{subsubsection}{2}
    405 \subsubsection{Constant identifiers}
    406 
    407 \begin{syntax}
    408 \oldlhs{identifier}
    409 \rhs \lstinline$0$
    410 \rhs \lstinline$1$
    411 \end{syntax}
    412 
    413 \index{constant identifiers}\index{identifiers!for constants} The tokens ``\lstinline$0$''\impl{0}
    414 and ``\lstinline$1$''\impl{1} are identifiers. No other tokens defined by the rules for integer
    415 constants are considered to be identifiers.
    416 \begin{rationale}
    417 Why ``\lstinline$0$'' and ``\lstinline$1$''? Those integers have special status in C. All scalar
    418 types can be incremented and decremented, which is defined in terms of adding or subtracting 1. The
    419 operations ``\lstinline$&&$'', ``\lstinline$||$'', and ``\lstinline$!$'' can be applied to any
    420 scalar arguments, and are defined in terms of comparison against 0. A \nonterm{constant-expression}
    421 that evaluates to 0 is effectively compatible with every pointer type.
    422 
    423 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to
    424 any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to
    425 0 as a special case. However, user-defined arithmetic types often need the equivalent of a 1 or 0
    426 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type
    427 matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
    428 Defining special constants for a user-defined type is more efficient than defining a conversion to
    429 the type from \lstinline$_Bool$.
    430 
    431 Why \emph{just} ``\lstinline$0$'' and ``\lstinline$1$''? Why not other integers? No other integers
    432 have special status in C. A facility that let programmers declare specific
    433 constants---``\lstinline$const Rational 12$'', for instance---would not be much of an improvement.
    434 Some facility for defining the creation of values of programmer-defined types from arbitrary integer
    435 tokens would be needed. The complexity of such a feature doesn't seem worth the gain.
    436 \end{rationale}
    437 
    438 
    439 \subsubsection{Operator identifiers}
    440 
    441 \index{operator identifiers}\index{identifiers!for operators} Table \ref{opids} lists the
    442 programmer-definable operator identifiers and the operations they are associated with. Functions
    443 that are declared with (or pointed at by function pointers that are declared with) these identifiers
    444 can be called by expressions that use the operator tokens and syntax, or the operator identifiers
    445 and ``function call'' syntax. The relationships between operators and function calls are discussed
    446 in descriptions of the operators.
    447 
    448 \begin{table}[hbt]
    449 \hfil
    450 \begin{tabular}[t]{ll}
    451 %identifier & operation \\ \hline
    452 \lstinline$?[?]$ & subscripting \impl{?[?]}\\
    453 \lstinline$?()$ & function call \impl{?()}\\
    454 \lstinline$?++$ & postfix increment \impl{?++}\\
    455 \lstinline$?--$ & postfix decrement \impl{?--}\\
    456 \lstinline$++?$ & prefix increment \impl{++?}\\
    457 \lstinline$--?$ & prefix decrement \impl{--?}\\
    458 \lstinline$*?$ & dereference \impl{*?}\\
    459 \lstinline$+?$ & unary plus \impl{+?}\\
    460 \lstinline$-?$ & arithmetic negation \impl{-?}\\
    461 \lstinline$~?$ & bitwise negation \impl{~?}\\
    462 \lstinline$!?$ & logical complement \impl{"!?}\\
    463 \lstinline$?*?$ & multiplication \impl{?*?}\\
    464 \lstinline$?/?$ & division \impl{?/?}\\
    465 \end{tabular}\hfil
    466 \begin{tabular}[t]{ll}
    467 %identifier & operation \\ \hline
    468 \lstinline$?%?$ & remainder \impl{?%?}\\
    469 \lstinline$?+?$ & addition \impl{?+?}\\
    470 \lstinline$?-?$ & subtraction \impl{?-?}\\
    471 \lstinline$?<<?$ & left shift \impl{?<<?}\\
    472 \lstinline$?>>?$ & right shift \impl{?>>?}\\
    473 \lstinline$?<?$ & less than \impl{?<?}\\
    474 \lstinline$?<=?$ & less than or equal \impl{?<=?}\\
    475 \lstinline$?>=?$ & greater than or equal \impl{?>=?}\\
    476 \lstinline$?>?$ & greater than \impl{?>?}\\
    477 \lstinline$?==?$ & equality \impl{?==?}\\
    478 \lstinline$?!=?$ & inequality \impl{?"!=?}\\
    479 \lstinline$?&?$ & bitwise AND \impl{?&?}\\
    480 \end{tabular}\hfil
    481 \begin{tabular}[t]{ll}
    482 %identifier & operation \\ \hline
    483 \lstinline$?^?$ & exclusive OR \impl{?^?}\\
    484 \lstinline$?|?$ & inclusive OR \impl{?"|?}\\
    485 \lstinline$?=?$ & simple assignment \impl{?=?}\\
    486 \lstinline$?*=?$ & multiplication assignment \impl{?*=?}\\
    487 \lstinline$?/=?$ & division assignment \impl{?/=?}\\
    488 \lstinline$?%=?$ & remainder assignment \impl{?%=?}\\
    489 \lstinline$?+=?$ & addition assignment \impl{?+=?}\\
    490 \lstinline$?-=?$ & subtraction assignment \impl{?-=?}\\
    491 \lstinline$?<<=?$ & left-shift assignment \impl{?<<=?}\\
    492 \lstinline$?>>=?$ & right-shift assignment \impl{?>>=?}\\
    493 \lstinline$?&=?$ & bitwise AND assignment \impl{?&=?}\\
    494 \lstinline$?^=?$ & exclusive OR assignment \impl{?^=?}\\
    495 \lstinline$?|=?$ & inclusive OR assignment \impl{?"|=?}\\
    496 \end{tabular}
    497 \hfil
    498 \caption{Operator Identifiers}
    499 \label{opids}
    500 \end{table}
    501 
    502 \begin{rationale}
    503 Operator identifiers are made up of the characters of the operator token, with question marks added
    504 to mark the positions of the arguments of operators. The question marks serve as mnemonic devices;
    505 programmers can not create new operators by arbitrarily mixing question marks and other
    506 non-alphabetic characters. Note that prefix and postfix versions of the increment and decrement
    507 operators are distinguished by the position of the question mark.
    508 \end{rationale}
    509 
    510 \begin{rationale}
    511 The use of ``\lstinline$?$'' in identifiers means that some C programs are not \CFA programs.
    512 For instance, the sequence of characters ``\lstinline$(i < 0)?--i:i$'' is legal in a C program, but
    513 a \CFA compiler will detect a syntax error because it will treat ``\lstinline$?--$'' as an
    514 identifier, not as the two tokens ``\lstinline$?$'' and ``\lstinline$--$''.
    515 \end{rationale}
    516 
    517 \begin{rationale}
    518 Certain operators \emph{cannot} be defined by the programmer:
    519 \begin{itemize}
    520 \item
    521 The logical operators ``\lstinline$&&$'' and ``\lstinline$||$'', and the conditional operator
    522 ``\lstinline$?:$''. These operators do not always evaluate their operands, and hence can not be
    523 properly defined by functions unless some mechanism like call-by-name is added to the language.
    524 Note that the definitions of ``\lstinline$&&$'' and ``\lstinline$||$'' say that they work by
    525 checking that their arguments are unequal to 0, so defining ``\lstinline$!=$'' and ``\lstinline$0$''
    526 for user-defined types is enough to allow them to be used in logical expressions.
    527 
    528 \item
    529 The comma operator\index{comma expression}. It is a control-flow operator like those above.
    530 Changing its meaning seems pointless and confusing.
    531 
    532 \item
    533 The ``address of'' operator. It would seem useful to define a unary ``\lstinline$&$'' operator that
    534 returns values of some programmer-defined pointer-like type. The problem lies with the type of the
    535 operator. Consider the expression ``\lstinline$p = &x$'', where \lstinline$x$ is of type
    536 \lstinline$T$ and \lstinline$p$ has the programmer-defined type \lstinline$T_ptr$. The expression
    537 might be treated as a call to the unary function ``\lstinline$&?$''. Now what is the type of the
    538 function's parameter? It can not be \lstinline$T$, because then \lstinline$x$ would be passed by
    539 value, and there is no way to create a useful pointer-like result from a value. Hence the parameter
    540 must have type \lstinline$T *$. But then the expression must be rewritten as ``\lstinline$p = &?( &x )$''
    541 ---which doesn't seem like progress!
    542 
    543 The rule for address-of expressions would have to be something like ``keep applying address-of
    544 functions until you get one that takes a pointer argument, then use the built-in operator and
    545 stop''. It seems simpler to define a conversion function from \lstinline$T *$ to \lstinline$T_ptr$.
    546 
    547 \item
    548 The \lstinline$sizeof$ operator. It is already defined for every object type, and intimately tied
    549 into the language's storage allocation model. Redefining it seems pointless.
    550 
    551 \item
    552 The ``member of'' operators ``\lstinline$.$'' and ``\lstinline$->$''. These are not really infix
    553 operators, since their right ``operand'' is not a value or object.
    554 
    555 \item
    556 Cast operators\index{cast expression}. Anything that can be done with an explicit cast can be done
    557 with a function call. The difference in syntax is small.
    558 \end{itemize}
    559 \end{rationale}
    560 
    561 
    562 \section{Expressions}
    563 \CFA allows operators and identifiers to be overloaded. Hence, each expression can have a number
    564 of \define{interpretations}, each of which has a different type. The interpretations that are
    565 potentially executable are called \define{valid interpretations}. The set of interpretations
    566 depends on the kind of expression and on the interpretations of the subexpressions that it contains.
    567 The rules for determining the valid interpretations of an expression are discussed below for each
    568 kind of expression. Eventually the context of the outermost expression chooses one interpretation
    569 of that expression.
    570 
    571 An \define{ambiguous interpretation} is an interpretation which does not specify the exact object or
    572 function denoted by every identifier in the expression. An expression can have some interpretations
    573 that are ambiguous and others that are unambiguous. An expression that is chosen to be executed
    574 shall not be ambiguous.
    575 
    576 The \define{best valid interpretations} are the valid interpretations that use the fewest
    577 unsafe\index{unsafe conversions} conversions. Of these, the best are those where the functions and
    578 objects involved are the least polymorphic\index{less polymorphic}. Of these, the best have the
    579 lowest total conversion cost\index{conversion cost}, including all implicit conversions in the
    580 argument expressions. Of these, the best have the highest total conversion cost for the implicit
    581 conversions (if any) applied to the argument expressions. If there is no single best valid
    582 interpretation, or if the best valid interpretation is ambiguous, then the resulting interpretation
    583 is ambiguous\index{ambiguous interpretation}.
    584 
    585 \begin{rationale}
    586 \CFA's rules for selecting the best interpretation are designed to allow overload resolution to
    587 mimic C's operator semantics. In C, the ``usual arithmetic conversions'' are applied to the
    588 operands of binary operators if necessary to convert the operands to types with a common real type.
    589 In \CFA, those conversions are ``safe''. The ``fewest unsafe conversions'' rule ensures that the
    590 usual conversions are done, if possible. The ``lowest total expression cost'' rule chooses the
    591 proper common type. The odd-looking ``highest argument conversion cost'' rule ensures that, when
    592 unary expressions must be converted, conversions of function results are preferred to conversion of
    593 function arguments: \lstinline$(double)-i$ will be preferred to \lstinline$-(double)i$.
    594 
    595 The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such
    596 functions are presumably more expensive than monomorphic functions and since the more specific
    597 function is presumably more appropriate. It also gives preference to monomorphic values (such as
    598 the \lstinline$int$ \lstinline$0$) over polymorphic values (such as the null pointer
    599 \lstinline$0$)\use{0}\index{null pointer}. However, interpretations that call polymorphic functions
    600 are preferred to interpretations that perform unsafe conversions, because those conversions
    601 potentially lose accuracy or violate strong typing.
    602 
    603 There are two notable differences between \CFA's overload resolution rules and the rules for
    604 {\CC} defined in \cite{c++}. First, the result type of a function plays a role. In {\CC}, a
    605 function call must be completely resolved based on the arguments to the call in most circumstances.
    606 In \CFA, a function call may have several interpretations, each with a different result type, and
    607 the interpretations of the containing context choose among them. Second, safe conversions are used
    608 to choose among interpretations of all sorts of functions; in {\CC}, the ``usual arithmetic
    609 conversions'' are a separate set of rules that apply only to the built-in operators.
    610 \end{rationale}
    611 
    612 Expressions involving certain operators\index{operator identifiers} are considered to be equivalent
    613 to function calls. A transformation from ``operator'' syntax to ``function call'' syntax is defined
    614 by \define{rewrite rules}. Each operator has a set of predefined functions that overload its
    615 identifier. Overload resolution determines which member of the set is executed in a given
    616 expression. The functions have internal linkage\index{internal linkage} and are implicitly declared
    617 with file scope\index{file scope}. The predefined functions and rewrite rules are discussed below
    618 for each of these operators.
    619 \begin{rationale}
    620 Predefined functions and constants have internal linkage because that simplifies optimization in
    621 traditional compile-and-link environments. For instance, ``\lstinline$an_int + an_int$'' is
    622 equivalent to ``\lstinline$?+?(an_int, an_int)$''. If integer addition has not been redefined in
    623 the current scope, a compiler can generate code to perform the addition directly. If predefined
    624 functions had external linkage, this optimization would be difficult.
    625 \end{rationale}
    626 
    627 \begin{rationale}
    628 Since each subsection describes the interpretations of an expression in terms of the interpretations
    629 of its subexpressions, this chapter can be taken as describing an overload resolution algorithm that
    630 uses one bottom-up pass over an expression tree. Such an algorithm was first described (for Ada) by
    631 Baker \cite{Bak:overload}. It is extended here to handle polymorphic functions and arithmetic
    632 conversions. The overload resolution rules and the predefined functions have been chosen so that,
    633 in programs that do not introduce overloaded declarations, expressions will have the same meaning in
    634 C and in \CFA.
    635 \end{rationale}
    636 
    637 \begin{rationale}
    638 Expression syntax is quoted from the {\c11} standard. The syntax itself defines the precedence and
    639 associativity of operators. The sections are arranged in decreasing order of precedence, with all
    640 operators in a section having the same precedence.
    641 \end{rationale}
    642 
    643 \subsection{Primary expressions}
    644 \begin{syntax}
    645 \lhs{primary-expression}
    646 \rhs \nonterm{identifier}
    647 \rhs \nonterm{constant}
    648 \rhs \nonterm{string-literal}
    649 \rhs \lstinline$($ \nonterm{expression} \lstinline$)$
    650 \rhs \nonterm{generic-selection}
    651 \end{syntax}
    652 
    653 \paragraph{Predefined Identifiers}%
    654 \begin{lstlisting}
    655 const int 1;@\use{1}@
    656 const int 0;@\use{0}@
    657 forall( dtype DT ) DT *const 0;
    658 forall( ftype FT ) FT *const 0;
    659 \end{lstlisting}
    660 
    661 \semantics
    662 The valid interpretations\index{valid interpretations} of an \nonterm{identifier} are given by the
    663 visible\index{visible} declarations of the identifier.
    664 
    665 A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type
    666 and value defined by {\c11}. The predefined integer identifiers ``\lstinline$1$'' and
    667 ``\lstinline$0$'' have the integer values 1 and 0, respectively. The other two predefined
    668 ``\lstinline$0$'' identifiers are bound to polymorphic pointer values that, when
    669 specialized\index{specialization} with a data type or function type respectively, produce a null
    670 pointer of that type.
    671 
    672 A parenthesised expression has the same interpretations as the contained \nonterm{expression}.
    673 
    674 \examples
    675 The expression \lstinline$(void *)0}$\use{0} specializes the (polymorphic) null pointer to a null
    676 pointer to \lstinline$void$. \lstinline$(const void *)0$ does the same, and also uses a safe
    677 conversion from \lstinline$void *$ to \lstinline$const void *$. In each case, the null pointer
    678 conversion is better\index{best valid interpretations} than the unsafe conversion of the integer
    679 \lstinline$0$ to a pointer.
    680 
    681 \begin{rationale}
    682 Note that the predefined identifiers have addresses.
    683 
    684 \CFA does not have C's concept of ``null pointer constants'', which are not typed values but
    685 special strings of tokens. The C token ``\lstinline$0$'' is an expression of type \lstinline$int$
    686 with the value ``zero'', and it \emph{also} is a null pointer constant. Similarly,
    687 ``\lstinline$(void *)0$ is an expression of type \lstinline$(void *)$ whose value is a null pointer,
    688 and it also is a null pointer constant. However, in C, ``\lstinline$(void *)(void *)0$'' is
    689 \emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The
    690 semantics of C expressions contain many special cases to deal with subexpressions that are null
    691 pointer constants.
    692 
    693 \CFA handles these cases through overload resolution. The declaration
    694 \begin{lstlisting}
    695 forall( dtype DT ) DT *const 0;
    696 \end{lstlisting}
    697 means that \lstinline$0$ is a polymorphic object, and contains a value that can have \emph{any}
    698 pointer-to-object type or pointer-to-incomplete type. The only such value is the null pointer.
    699 Therefore the type \emph{alone} is enough to identify a null pointer. Where C defines an operator
    700 with a special case for the null pointer constant, \CFA defines predefined functions with a
    701 polymorphic object parameter.
    702 \end{rationale}
    703 
    704 \subsubsection{Generic selection}
    705 \constraints The best interpretation of the controlling expression shall be
    706 unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the
    707 types named in its generic association list. If a generic selection has no \lstinline$default$
    708 generic association, the best interpretation of its controlling expression shall have type
    709 compatible with exactly one of the types named in its generic association list.
    710 
    711 \semantics
    712 A generic selection has the same interpretations as its result expression.
    713 
    714 
    715 \subsection{Postfix operators}
    716 
    717 \begin{syntax}
    718 \lhs{postfix-expression}
    719 \rhs \nonterm{primary-expression}
    720 \rhs \nonterm{postfix-expression} \lstinline$[$ \nonterm{expression} \lstinline$]$
    721 \rhs \nonterm{postfix-expression} \lstinline$($
    722          \nonterm{argument-expression-list}\opt \lstinline$)$
    723 \rhs \nonterm{postfix-expression} \lstinline$.$ \nonterm{identifier}
    724 \rhs \nonterm{postfix-expression} \lstinline$->$ \nonterm{identifier}
    725 \rhs \nonterm{postfix-expression} \lstinline$++$
    726 \rhs \nonterm{postfix-expression} \lstinline$--$
    727 \rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$}$
    728 \rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \lstinline${$ \nonterm{initializer-list} \lstinline$,$ \lstinline$}$
    729 \lhs{argument-expression-list}
    730 \rhs \nonterm{assignment-expression}
    731 \rhs \nonterm{argument-expression-list} \lstinline$,$
    732          \nonterm{assignment-expression}
    733 \end{syntax}
    734 
    735 \rewriterules
    736 \begin{lstlisting}
    737 a[b] @\rewrite@ ?[?]( b, a ) // if a has integer type */@\use{?[?]}@
    738 a[b] @\rewrite@ ?[?]( a, b ) // otherwise
    739 a( ${\em arguments }$ ) @\rewrite@ ?()( a, ${\em arguments} )$@\use{?()}@
    740 a++ @\rewrite@ ?++(&( a ))@\use{?++}@
    741 a-- @\rewrite@ ?--(&( a ))@\use{?--}@
    742 \end{lstlisting}
    743 
    744 \subsubsection{Array subscripting}
    745 \begin{lstlisting}
    746 forall( type T ) lvalue T ?[?]( T *, ptrdiff_t );@\use{ptrdiff_t}@
    747 forall( type T ) lvalue _Atomic T ?[?]( _Atomic T *, ptrdiff_t );
    748 forall( type T ) lvalue const T ?[?]( const T *, ptrdiff_t );
    749 forall( type T ) lvalue restrict T ?[?]( restrict T *, ptrdiff_t );
    750 forall( type T ) lvalue volatile T ?[?]( volatile T *, ptrdiff_t );
    751 forall( type T ) lvalue _Atomic const T ?[?]( _Atomic const T *, ptrdiff_t );
    752 forall( type T ) lvalue _Atomic restrict T ?[?]( _Atomic restrict T *, ptrdiff_t );
    753 forall( type T ) lvalue _Atomic volatile T ?[?]( _Atomic volatile T *, ptrdiff_t );
    754 forall( type T ) lvalue const restrict T ?[?]( const restrict T *, ptrdiff_t );
    755 forall( type T ) lvalue const volatile T ?[?]( const volatile T *, ptrdiff_t );
    756 forall( type T ) lvalue restrict volatile T ?[?]( restrict volatile T *, ptrdiff_t );
    757 forall( type T ) lvalue _Atomic const restrict T ?[?]( _Atomic const restrict T *, ptrdiff_t );
    758 forall( type T ) lvalue _Atomic const volatile T ?[?]( _Atomic const volatile T *, ptrdiff_t );
    759 forall( type T ) lvalue _Atomic restrict volatile T ?[?]( _Atomic restrict volatile T *, ptrdiff_t );
    760 forall( type T ) lvalue const restrict volatile T ?[?]( const restrict volatile T *, ptrdiff_t );
    761 forall( type T ) lvalue _Atomic const restrict volatile T ?[?]( _Atomic const restrict volatile T *, ptrdiff_t );
    762 \end{lstlisting}
    763 \semantics
    764 The interpretations of subscript expressions are the interpretations of the corresponding function
    765 call expressions.
    766 \begin{rationale}
    767 C defines subscripting as pointer arithmetic in a way that makes \lstinline$a[i]$ and
    768 \lstinline$i[a]$ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the
    769 number of overloadings of \lstinline$?[?]$.
    770 
    771 Subscript expressions are rewritten as function calls that pass the first parameter by value. This
    772 is somewhat unfortunate, since array-like types tend to be large. The alternative is to use the
    773 rewrite rule ``\lstinline$a[b]$ \rewrite \lstinline$?[?](&(a), b)$''. However, C semantics forbid
    774 this approach: the \lstinline$a$ in ``\lstinline$a[b]$'' can be an arbitrary pointer value, which
    775 does not have an address.
    776 
    777 The repetitive form of the predefined identifiers shows up a deficiency\index{deficiencies!pointers
    778  to qualified types} of \CFA's type system. Type qualifiers are not included in type values, so
    779 polymorphic functions that take pointers to arbitrary types often come in one flavor for each
    780 possible qualification of the pointed-at type.
    781 \end{rationale}
    782 
    783 
    784 \subsubsection{Function calls}
    785 
    786 \semantics
    787 A \define{function designator} is an interpretation of an expression that has function type. The
    788 \nonterm{postfix-expression} in a function call may have some interpretations that are function
    789 designators and some that are not.
    790 
    791 For those interpretations of the \nonterm{postfix-expression} that are not function designators, the
    792 expression is rewritten and becomes a call of a function named ``\lstinline$?()$''. The valid
    793 interpretations of the rewritten expression are determined in the manner described below.
    794 
    795 Each combination of function designators and argument interpretations is considered. For those
    796 interpretations of the \nonterm{postfix-expression} that are monomorphic\index{monomorphic function}
    797 function designators, the combination has a valid interpretation\index{valid interpretations} if the
    798 function designator accepts the number of arguments given, and each argument interpretation matches
    799 the corresponding explicit parameter:
    800 \begin{itemize}
    801 \item
    802 if the argument corresponds to a parameter in the function designator's prototype, the argument
    803 interpretation must have the same type as the corresponding parameter, or be implicitly convertible
    804 to the parameter's type
    805 \item
    806 if the function designator's type does not include a prototype or if the argument corresponds to
    807 ``\lstinline$...$'' in a prototype, a default argument promotion\index{default argument promotions}
    808 is applied to it.
    809 \end{itemize}
    810 The type of the valid interpretation is the return type of the function designator.
    811 
    812 For those combinations where the interpretation of the \nonterm{postfix-expression} is a
    813 polymorphic\index{polymorphic function} function designator and the function designator accepts the
    814 number of arguments given, there shall be at least one set of \define{implicit arguments} for the
    815 implicit parameters such that
    816 \begin{itemize}
    817 \item
    818 If the declaration of the implicit parameter uses type-class\index{type-class}
    819 \lstinline$type$\use{type}, the implicit argument must be an object type; if it uses
    820 \lstinline$dtype$, the implicit argument must be an object type or an incomplete type; and if it
    821 uses \lstinline$ftype$, the implicit argument must be a function type.
    822 
    823 \item
    824 if an explicit parameter's type uses any implicit parameters, then the corresponding explicit
    825 argument must have a type that is (or can be safely converted\index{safe conversions} to) the type
    826 produced by substituting the implicit arguments for the implicit parameters in the explicit
    827 parameter type.
    828 
    829 \item
    830 the remaining explicit arguments must match the remaining explicit parameters, as described for
    831 monomorphic function designators.
    832 
    833 \item
    834 for each assertion parameter\index{assertion parameters} in the function designator's type, there
    835 must be an object or function with the same identifier that is visible at the call site and whose
    836 type is compatible with or can be specialized to the type of the assertion declaration.
    837 \end{itemize}
    838 There is a valid interpretation for each such set of implicit parameters. The type of each valid
    839 interpretation is the return type of the function designator with implicit parameter values
    840 substituted for the implicit arguments.
    841 
    842 A valid interpretation is ambiguous\index{ambiguous interpretation} if the function designator or
    843 any of the argument interpretations is ambiguous.
    844 
    845 Every valid interpretation whose return type is not compatible with any other valid interpretation's
    846 return type is an interpretation of the function call expression.
    847 
    848 Every set of valid interpretations that have mutually compatible\index{compatible type} result types
    849 also produces an interpretation of the function call expression. The type of the interpretation is
    850 the composite\index{composite type} type of the types of the valid interpretations, and the value of
    851 the interpretation is that of the best valid interpretation\index{best valid interpretations}.
    852 \begin{rationale}
    853 One desirable property of a polymorphic programming language is \define{generalizability}: the
    854 ability to replace an abstraction with a more general but equivalent abstraction without requiring
    855 changes in any of the uses of the original\cite{Cormack90}. For instance, it should be possible to
    856 replace a function ``\lstinline$int f( int );$'' with ``\lstinline$forall( type T ) T f( T );$''
    857 without affecting any calls of \lstinline$f$.
    858 
    859 \CFA\index{deficiencies!generalizability} does not fully possess this property, because
    860 unsafe\index{unsafe conversions} conversions are not done when arguments are passed to polymorphic
    861 parameters. Consider
    862 \begin{lstlisting}
    863 float g( float, float );
    864 int i;
    865 float f;
    866 double d;
    867 f = g( f, f );  // (1)
    868 f = g( i, f );  // (2) (safe conversion to float)
    869 f = g( d, f );  // (3) (unsafe conversion to float)
    870 \end{lstlisting}
    871 If \lstinline$g$ was replaced by ``\lstinline$forall( type T ) T g( T, T );$'', the first and second
    872 calls would be unaffected, but the third would change: \lstinline$f$ would be converted to
    873 \lstinline$double$, and the result would be a \lstinline$double$.
    874 
    875 Another example is the function ``\lstinline$void h( int *);$''. This function can be passed a
    876 \lstinline$void *$ argument, but the generalization ``\lstinline$forall( type T ) void h( T *);$''
    877 can not. In this case, \lstinline$void$ is not a valid value for \lstinline$T$ because it is not an
    878 object type. If unsafe conversions were allowed, \lstinline$T$ could be inferred to be \emph{any}
    879 object type, which is undesirable.
    880 \end{rationale}
    881 
    882 \examples
    883 A function called ``\lstinline$?()$'' might be part of a numerical differentiation package.
    884 \begin{lstlisting}
    885 extern type Derivative;
    886 extern double ?()( Derivative, double );
    887 extern Derivative derivative_of( double (*f)( double ) );
    888 extern double sin( double );
    889 
    890 Derivative sin_dx = derivative_of( sin );
    891 double d;
    892 d = sin_dx( 12.9 );
    893 \end{lstlisting}
    894 Here, the only interpretation of \lstinline$sin_dx$ is as an object of type \lstinline$Derivative$.
    895 For that interpretation, the function call is treated as ``\lstinline$?()( sin_dx, 12.9 )$''.
    896 \begin{lstlisting}
    897 int f( long );          // (1)
    898 int f( int, int );      // (2)
    899 int f( int *);          // (3)
    900 
    901 int i = f( 5 );         // calls (1)
    902 \end{lstlisting}
    903 Function (1) provides a valid interpretation of ``\lstinline$f( 5 )$'', using an implicit
    904 \lstinline$int$ to \lstinline$long$ conversion. The other functions do not, since the second
    905 requires two arguments, and since there is no implicit conversion from \lstinline$int$ to
    906 \lstinline$int *$ that could be used with the third function.
    907 
    908 \begin{lstlisting}
    909 forall( type T ) T h( T );
    910 double d = h( 1.5 );
    911 \end{lstlisting}
    912 ``\lstinline$1.5$'' is a \lstinline$double$ constant, so \lstinline$T$ is inferred to be
    913 \lstinline$double$, and the result of the function call is a \lstinline$double$.
    914 
    915 \begin{lstlisting}
    916 forall( type T, type U ) void g( T, U );        // (4)
    917 forall( type T ) void g( T, T );                        // (5)
    918 forall( type T ) void g( T, long );                     // (6)
    919 void g( long, long );                                           // (7)
    920 double d;
    921 int i;
    922 int *p;
    923 
    924 g( d, d );                      // calls (5)
    925 g( d, i );                      // calls (6)
    926 g( i, i );                      // calls (7)
    927 g( i, p );                      // calls (4)
    928 \end{lstlisting}
    929 The first call has valid interpretations for all four versions of \lstinline$g$. (6) and (7) are
    930 discarded because they involve unsafe \lstinline$double$-to-\lstinline$long$ conversions. (5) is
    931 chosen because it is less polymorphic than (4).
    932 
    933 For the second call, (7) is again discarded. Of the remaining interpretations for (4), (5), and (6)
    934 (with \lstinline$i$ converted to \lstinline$long$), (6) is chosen because it is the least
    935 polymorphic.
    936 
    937 The third call has valid interpretations for all of the functions; (7) is chosen since it is not
    938 polymorphic at all.
    939 
    940 The fourth call has no interpretation for (5), because its arguments must have compatible type. (4)
    941 is chosen because it does not involve unsafe conversions.
    942 \begin{lstlisting}
    943 forall( type T ) T min( T, T );
    944 double max( double, double );
    945 context min_max( T ) {@\impl{min_max}@
    946         T min( T, T );
    947         T max( T, T );
    948 }
    949 forall( type U | min_max( U ) ) void shuffle( U, U );
    950 shuffle(9, 10);
    951 \end{lstlisting}
    952 The only possibility for \lstinline$U$ is \lstinline$double$, because that is the type used in the
    953 only visible \lstinline$max$ function. 9 and 10 must be converted to \lstinline$double$, and
    954 \lstinline$min$ must be specialized with \lstinline$T$ bound to \lstinline$double$.
    955 \begin{lstlisting}
    956 extern void q( int );           // (8)
    957 extern void q( void * );        // (9)
    958 extern void r();
    959 q( 0 );
    960 r( 0 );
    961 \end{lstlisting}
    962 The \lstinline$int 0$ could be passed to (8), or the \lstinline$(void *)$
    963 specialization\index{specialization} of the null pointer\index{null pointer} \lstinline$0$\use{0}
    964 could be passed to (9). The former is chosen because the \lstinline$int$ \lstinline$0$ is less
    965 polymorphic\index{less polymorphic}. For the same reason, \lstinline$int$ \lstinline$0$ is passed
    966 to \lstinline$r()$, even though it has \emph{no} declared parameter types.
    967 
    968 
    969 \subsubsection{Structure and union members}
    970 
    971 \semantics In the member selection expression ``\lstinline$s$.\lstinline$m$'', there shall be at
    972 least one interpretation of \lstinline$s$ whose type is a structure type or union type containing a
    973 member named \lstinline$m$. If two or more interpretations of \lstinline$s$ have members named
    974 \lstinline$m$ with mutually compatible types, then the expression has an ambiguous
    975 interpretation\index{ambiguous interpretation} whose type is the composite type of the types of the
    976 members. If an interpretation of \lstinline$s$ has a member \lstinline$m$ whose type is not
    977 compatible with any other \lstinline$s$'s \lstinline$m$, then the expression has an interpretation
    978 with the member's type. The expression has no other interpretations.
    979 
    980 The expression ``\lstinline$p->m$'' has the same interpretations as the expression
    981 ``\lstinline$(*p).m$''.
    982 
    983 
    984 \subsubsection{Postfix increment and decrement operators}
    985 
    986 \begin{lstlisting}
    987 _Bool ?++( volatile _Bool * ),
    988         ?++( _Atomic volatile _Bool * );
    989 char ?++( volatile char * ),
    990         ?++( _Atomic volatile char * );
    991 signed char ?++( volatile signed char * ),
    992         ?++( _Atomic volatile signed char * );
    993 unsigned char ?++( volatile signed char * ),
    994         ?++( _Atomic volatile signed char * );
    995 short int ?++( volatile short int * ),
    996         ?++( _Atomic volatile short int * );
    997 unsigned short int ?++( volatile unsigned short int * ),
    998         ?++( _Atomic volatile unsigned short int * );
    999 int ?++( volatile int * ),
    1000         ?++( _Atomic volatile int * );
    1001 unsigned int ?++( volatile unsigned int * ),
    1002         ?++( _Atomic volatile unsigned int * );
    1003 long int ?++( volatile long int * ),
    1004         ?++( _Atomic volatile long int * );
    1005 long unsigned int ?++( volatile long unsigned int * ),
    1006         ?++( _Atomic volatile long unsigned int * );
    1007 long long int ?++( volatile long long int * ),
    1008         ?++( _Atomic volatile long long int * );
    1009 long long unsigned ?++( volatile long long unsigned int * ),
    1010         ?++( _Atomic volatile long long unsigned int * );
    1011 float ?++( volatile float * ),
    1012         ?++( _Atomic volatile float * );
    1013 double ?++( volatile double * ),
    1014         ?++( _Atomic volatile double * );
    1015 long double ?++( volatile long double * ),
    1016         ?++( _Atomic volatile long double * );
    1017 
    1018 forall( type T ) T * ?++( T * restrict volatile * ),
    1019         * ?++( T * _Atomic restrict volatile * );
    1020 
    1021 forall( type T ) _Atomic T * ?++( _Atomic T * restrict volatile * ),
    1022         * ?++( _Atomic T * _Atomic restrict volatile * );
    1023 
    1024 forall( type T ) const T * ?++( const T * restrict volatile * ),
    1025         * ?++( const T * _Atomic restrict volatile * );
    1026 
    1027 forall( type T ) volatile T * ?++( volatile T * restrict volatile * ),
    1028         * ?++( volatile T * _Atomic restrict volatile * );
    1029 
    1030 forall( type T ) restrict T * ?++( restrict T * restrict volatile * ),
    1031         * ?++( restrict T * _Atomic restrict volatile * );
    1032 
    1033 forall( type T ) _Atomic const T * ?++( _Atomic const T * restrict volatile * ),
    1034         * ?++( _Atomic const T * _Atomic restrict volatile * );
    1035 
    1036 forall( type T ) _Atomic restrict T * ?++( _Atomic restrict T * restrict volatile * ),
    1037         * ?++( _Atomic restrict T * _Atomic restrict volatile * );
    1038 
    1039 forall( type T ) _Atomic volatile T * ?++( _Atomic volatile T * restrict volatile * ),
    1040         * ?++( _Atomic volatile T * _Atomic restrict volatile * );
    1041 
    1042 forall( type T ) const restrict T * ?++( const restrict T * restrict volatile * ),
    1043         * ?++( const restrict T * _Atomic restrict volatile * );
    1044 
    1045 forall( type T ) const volatile T * ?++( const volatile T * restrict volatile * ),
    1046         * ?++( const volatile T * _Atomic restrict volatile * );
    1047 
    1048 forall( type T ) restrict volatile T * ?++( restrict volatile T * restrict volatile * ),
    1049         * ?++( restrict volatile T * _Atomic restrict volatile * );
    1050 
    1051 forall( type T ) _Atomic const restrict T * ?++( _Atomic const restrict T * restrict volatile * ),
    1052         * ?++( _Atomic const restrict T * _Atomic restrict volatile * );
    1053 
    1054 forall( type T ) _Atomic const volatile T * ?++( _Atomic const volatile T * restrict volatile * ),
    1055         * ?++( _Atomic const volatile T * _Atomic restrict volatile * );
    1056 
    1057 forall( type T ) _Atomic restrict volatile T * ?++( _Atomic restrict volatile T * restrict volatile * ),
    1058         * ?++( _Atomic restrict volatile T * _Atomic restrict volatile * );
    1059 
    1060 forall( type T ) const restrict volatile T * ?++( const restrict volatile T * restrict volatile * ),
    1061         * ?++( const restrict volatile T * _Atomic restrict volatile * );
    1062 
    1063 forall( type T ) _Atomic const restrict volatile T * ?++( _Atomic const restrict volatile T * restrict volatile * ),
    1064         * ?++( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    1065 
    1066 _Bool ?--( volatile _Bool * ),
    1067         ?--( _Atomic volatile _Bool * );
    1068 char ?--( volatile char * ),
    1069         ?--( _Atomic volatile char * );
    1070 signed char ?--( volatile signed char * ),
    1071         ?--( _Atomic volatile signed char * );
    1072 unsigned char ?--( volatile signed char * ),
    1073         ?--( _Atomic volatile signed char * );
    1074 short int ?--( volatile short int * ),
    1075         ?--( _Atomic volatile short int * );
    1076 unsigned short int ?--( volatile unsigned short int * ),
    1077         ?--( _Atomic volatile unsigned short int * );
    1078 int ?--( volatile int * ),
    1079         ?--( _Atomic volatile int * );
    1080 unsigned int ?--( volatile unsigned int * ),
    1081         ?--( _Atomic volatile unsigned int * );
    1082 long int ?--( volatile long int * ),
    1083         ?--( _Atomic volatile long int * );
    1084 long unsigned int ?--( volatile long unsigned int * ),
    1085         ?--( _Atomic volatile long unsigned int * );
    1086 long long int ?--( volatile long long int * ),
    1087         ?--( _Atomic volatile long long int * );
    1088 long long unsigned ?--( volatile long long unsigned int * ),
    1089         ?--( _Atomic volatile long long unsigned int * );
    1090 float ?--( volatile float * ),
    1091         ?--( _Atomic volatile float * );
    1092 double ?--( volatile double * ),
    1093         ?--( _Atomic volatile double * );
    1094 long double ?--( volatile long double * ),
    1095         ?--( _Atomic volatile long double * );
    1096 
    1097 forall( type T ) T * ?--( T * restrict volatile * ),
    1098         * ?--( T * _Atomic restrict volatile * );
    1099 
    1100 forall( type T ) _Atomic T * ?--( _Atomic T * restrict volatile * ),
    1101         * ?--( _Atomic T * _Atomic restrict volatile * );
    1102 
    1103 forall( type T ) const T * ?--( const T * restrict volatile * ),
    1104         * ?--( const T * _Atomic restrict volatile * );
    1105 
    1106 forall( type T ) volatile T * ?--( volatile T * restrict volatile * ),
    1107         * ?--( volatile T * _Atomic restrict volatile * );
    1108 
    1109 forall( type T ) restrict T * ?--( restrict T * restrict volatile * ),
    1110         * ?--( restrict T * _Atomic restrict volatile * );
    1111 
    1112 forall( type T ) _Atomic const T * ?--( _Atomic const T * restrict volatile * ),
    1113         * ?--( _Atomic const T * _Atomic restrict volatile * );
    1114 
    1115 forall( type T ) _Atomic restrict T * ?--( _Atomic restrict T * restrict volatile * ),
    1116         * ?--( _Atomic restrict T * _Atomic restrict volatile * );
    1117 
    1118 forall( type T ) _Atomic volatile T * ?--( _Atomic volatile T * restrict volatile * ),
    1119         * ?--( _Atomic volatile T * _Atomic restrict volatile * );
    1120 
    1121 forall( type T ) const restrict T * ?--( const restrict T * restrict volatile * ),
    1122         * ?--( const restrict T * _Atomic restrict volatile * );
    1123 
    1124 forall( type T ) const volatile T * ?--( const volatile T * restrict volatile * ),
    1125         * ?--( const volatile T * _Atomic restrict volatile * );
    1126 
    1127 forall( type T ) restrict volatile T * ?--( restrict volatile T * restrict volatile * ),
    1128         * ?--( restrict volatile T * _Atomic restrict volatile * );
    1129 
    1130 forall( type T ) _Atomic const restrict T * ?--( _Atomic const restrict T * restrict volatile * ),
    1131         * ?--( _Atomic const restrict T * _Atomic restrict volatile * );
    1132 
    1133 forall( type T ) _Atomic const volatile T * ?--( _Atomic const volatile T * restrict volatile * ),
    1134         * ?--( _Atomic const volatile T * _Atomic restrict volatile * );
    1135 
    1136 forall( type T ) _Atomic restrict volatile T * ?--( _Atomic restrict volatile T * restrict volatile * ),
    1137         * ?--( _Atomic restrict volatile T * _Atomic restrict volatile * );
    1138 
    1139 forall( type T ) const restrict volatile T * ?--( const restrict volatile T * restrict volatile * ),
    1140         * ?--( const restrict volatile T * _Atomic restrict volatile * );
    1141 
    1142 forall( type T ) _Atomic const restrict volatile T * ?--( _Atomic const restrict volatile T * restrict volatile * ),
    1143         * ?--( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    1144 \end{lstlisting}
    1145 For every extended integer type \lstinline$X$ there exist
    1146 % Don't use predefined: keep this out of prelude.cf.
    1147 \begin{lstlisting}
    1148 X ?++( volatile X * ), ?++( _Atomic volatile X * ),
    1149  ?--( volatile X * ), ?--( _Atomic volatile X * );
    1150 \end{lstlisting}
    1151 For every complete enumerated type \lstinline$E$ there exist
    1152 % Don't use predefined: keep this out of prelude.cf.
    1153 \begin{lstlisting}
    1154 E ?++( volatile E * ), ?++( _Atomic volatile E * ),
    1155  ?--( volatile E * ), ?--( _Atomic volatile E * );
    1156 \end{lstlisting}
    1157 
    1158 \begin{rationale}
    1159 Note that ``\lstinline$++$'' and ``\lstinline$--$'' are rewritten as function calls that are given a
    1160 pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald
    1161 has pointed out, this forces the modified operand of such expressions to be an lvalue. This
    1162 partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues.
    1163 \end{rationale}
    1164 
    1165 \begin{rationale}
    1166 In C, a semantic rule requires that pointer operands of increment and decrement be pointers to
    1167 object types. Hence, \lstinline$void *$ objects cannot be incremented. In \CFA, the restriction
    1168 follows from the use of a \lstinline$type$ parameter in the predefined function definitions, as
    1169 opposed to \lstinline$dtype$, since only object types can be inferred arguments corresponding to the
    1170 type parameter \lstinline$T$.
    1171 \end{rationale}
    1172 
    1173 \semantics
    1174 First, each interpretation of the operand of an increment or decrement expression is considered
    1175 separately. For each interpretation that is a bit-field or is declared with the
    1176 \lstinline$register$\index{register@{\lstinline$register$}} storage-class
    1177 specifier\index{storage-class specifier}, the expression has one valid interpretation, with the type
    1178 of the operand, and the expression is ambiguous if the operand is.
    1179 
    1180 For the remaining interpretations, the expression is rewritten, and the interpretations of the
    1181 expression are the interpretations of the corresponding function call. Finally, all interpretations
    1182 of the expression produced for the different interpretations of the operand are combined to produce
    1183 the interpretations of the expression as a whole; where interpretations have compatible result
    1184 types, the best interpretations are selected in the manner described for function call expressions.
    1185 
    1186 \examples
    1187 \begin{lstlisting}
    1188 volatile short int vs;  vs++; // rewritten as ?++( &(vs) )
    1189 short int s;                    s++;
    1190 const short int cs;             cs++;
    1191 _Atomic short int as;   as++;
    1192 \end{lstlisting}
    1193 \begin{sloppypar}
    1194 Since \lstinline$&(vs)$ has type \lstinline$volatile short int *$, the best valid interpretation of
    1195 \lstinline$vs++$ calls the \lstinline$?++$ function with the \lstinline$volatile short *$ parameter.
    1196 \lstinline$s++$ does the same, applying the safe conversion from \lstinline$short int *$ to
    1197 \lstinline$volatile short int *$. Note that there is no conversion that adds an \lstinline$_Atomic$
    1198 qualifier, so the \lstinline$_Atomic volatile short int$ overloading does not provide a valid
    1199 interpretation.
    1200 \end{sloppypar}
    1201 
    1202 There is no safe conversion from \lstinline$const short int *$ to \lstinline$volatile short int *$,
    1203 and no \lstinline$?++$ function that accepts a \lstinline$const *$ parameter, so \lstinline$cs++$
    1204 has no valid interpretations.
    1205 
    1206 The best valid interpretation of \lstinline$as++$ calls the \lstinline$short ?++$ function with the
    1207 \lstinline$_Atomic volatile short int *$ parameter, applying a safe conversion to add the
    1208 \lstinline$volatile$ qualifier.
    1209 
    1210 \begin{lstlisting}
    1211 char * const restrict volatile * restrict volatile pqpc; pqpc++
    1212 char * * restrict volatile ppc; ppc++;
    1213 \end{lstlisting}
    1214 Since \lstinline$&(pqpc)$ has type \lstinline$char * const restrict volatile * restrict volatile *$,
    1215 the best valid interpretation of \lstinline$pqpc++$ calls the polymorphic \lstinline$?++$ function
    1216 with the \lstinline$const restrict volatile T * restrict volatile *$ parameter, inferring
    1217 \lstinline$T$ to be \lstinline$char *$.
    1218 
    1219 \begin{sloppypar}
    1220 \lstinline$ppc++$ calls the same function, again inferring \lstinline$T$ to be \lstinline$char *$,
    1221 and using the safe conversions from \lstinline$T$ to \lstinline$T const restrict volatile$.
    1222 \end{sloppypar}
    1223 
    1224 \begin{rationale}
    1225 Increment and decrement expressions show up a deficiency of \CFA's type system. There is no such
    1226 thing as a pointer to a register object or bit-field\index{deficiencies!pointers to bit-fields}.
    1227 Therefore, there is no way to define a function that alters them, and hence no way to define
    1228 increment and decrement functions for them. As a result, the semantics of increment and decrement
    1229 expressions must treat them specially. This holds true for all of the operators that may modify
    1230 such objects.
    1231 \end{rationale}
    1232 
    1233 \begin{rationale}
    1234 The polymorphic overloadings for pointer increment and decrement can be understood by considering
    1235 increasingly complex types.
    1236 \begin{enumerate}
    1237 \item
    1238 ``\lstinline$char * p; p++;$''. The argument to \lstinline$?++$ has type \lstinline$char * *$, and
    1239 the result has type \lstinline$char *$. The expression would be valid if \lstinline$?++$ were
    1240 declared by
    1241 \begin{lstlisting}
    1242 forall( type T ) T * ?++( T * * );
    1243 \end{lstlisting}
    1244 with \lstinline$T$ inferred to be \lstinline$char$.
    1245 
    1246 \item
    1247 ``\lstinline$char *restrict volatile qp; qp++$''. The result again has type \lstinline$char *$, but
    1248 the argument now has type \lstinline$char *restrict volatile *$, so it cannot be passed to the
    1249 hypothetical function declared in point 1. Hence the actual predefined function is
    1250 \begin{lstlisting}
    1251 forall( type T ) T * ?++( T * restrict volatile * );
    1252 \end{lstlisting}
    1253 which also accepts a \lstinline$char * *$ argument, because of the safe conversions that add
    1254 \lstinline$volatile$ and \lstinline$restrict$ qualifiers. (The parameter is not const-qualified, so
    1255 constant pointers cannot be incremented.)
    1256 
    1257 \item
    1258 ``\lstinline$char *_Atomic ap; ap++$''. The result again has type \lstinline$char *$, but no safe
    1259 conversion adds an \lstinline$_Atomic$ qualifier, so the function in point 2 is not applicable. A
    1260 separate overloading of \lstinline$?++$ is required.
    1261 
    1262 \item
    1263 ``\lstinline$char const volatile * pq; pq++$''. Here the result has type
    1264 \lstinline$char const volatile *$, so a new overloading is needed:
    1265 \begin{lstlisting}
    1266 forall( type T ) T const volatile * ?++( T const volatile *restrict volatile * );
    1267 \end{lstlisting}
    1268 One overloading is needed for each combination of qualifiers in the pointed-at
    1269 type\index{deficiencies!pointers to qualified types}.
    1270  
    1271 \item
    1272 ``\lstinline$float *restrict * prp; prp++$''. The \lstinline$restrict$ qualifier is handled just
    1273 like \lstinline$const$ and \lstinline$volatile$ in the previous case:
    1274 \begin{lstlisting}
    1275 forall( type T ) T restrict * ?++( T restrict *restrict volatile * );
    1276 \end{lstlisting}
    1277 with \lstinline$T$ inferred to be \lstinline$float *$. This looks odd, because {\c11} contains a
    1278 constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline$T$
    1279 is not syntactically a pointer type. \CFA loosens the constraint.
    1280 \end{enumerate}
    1281 \end{rationale}
    1282 
    1283 
    1284 \subsubsection{Compound literals}
    1285 
    1286 \semantics
    1287 A compound literal has one interpretation, with the type given by the \nonterm{type-name} of the
    1288 compound literal.
    1289 
    1290 
    1291 \subsection{Unary operators}
    1292 
    1293 \begin{syntax}
    1294 \lhs{unary-expression}
    1295 \rhs \nonterm{postfix-expression}
    1296 \rhs \lstinline$++$ \nonterm{unary-expression}
    1297 \rhs \lstinline$--$ \nonterm{unary-expression}
    1298 \rhs \nonterm{unary-operator} \nonterm{cast-expression}
    1299 \rhs \lstinline$sizeof$ \nonterm{unary-expression}
    1300 \rhs \lstinline$sizeof$ \lstinline$($ \nonterm{type-name} \lstinline$)$
    1301 \lhs{unary-operator} one of \rhs \lstinline$&$ \lstinline$*$ \lstinline$+$ \lstinline$-$ \lstinline$~$ \lstinline$!$
    1302 \end{syntax}
    1303 
    1304 \rewriterules
    1305 \begin{lstlisting}
    1306 *a      @\rewrite@ *?(a) @\use{*?}@
    1307 +a      @\rewrite@ +?(a) @\use{+?}@
    1308 -a      @\rewrite@ -?(a) @\use{-?}@
    1309 ~a      @\rewrite@ ~?(a) @\use{~?}@
    1310 !a      @\rewrite@ !?(a) @\use{"!?}@
    1311 ++a     @\rewrite@ ++?(&(a)) @\use{++?}@
    1312 --a     @\rewrite@ --?(&(a)) @\use{--?}@
    1313 \end{lstlisting}
    1314 
    1315 
    1316 \subsubsection{Prefix increment and decrement operators}
    1317 
    1318 \begin{lstlisting}
    1319 _Bool ++?( volatile _Bool * ),
    1320         ++?( _Atomic volatile _Bool * );
    1321 char ++?( volatile char * ),
    1322         ++?( _Atomic volatile char * );
    1323 signed char ++?( volatile signed char * ),
    1324         ++?( _Atomic volatile signed char * );
    1325 unsigned char ++?( volatile signed char * ),
    1326         ++?( _Atomic volatile signed char * );
    1327 short int ++?( volatile short int * ),
    1328         ++?( _Atomic volatile short int * );
    1329 unsigned short int ++?( volatile unsigned short int * ),
    1330         ++?( _Atomic volatile unsigned short int * );
    1331 int ++?( volatile int * ),
    1332         ++?( _Atomic volatile int * );
    1333 unsigned int ++?( volatile unsigned int * ),
    1334         ++?( _Atomic volatile unsigned int * );
    1335 long int ++?( volatile long int * ),
    1336         ++?( _Atomic volatile long int * );
    1337 long unsigned int ++?( volatile long unsigned int * ),
    1338         ++?( _Atomic volatile long unsigned int * );
    1339 long long int ++?( volatile long long int * ),
    1340         ++?( _Atomic volatile long long int * );
    1341 long long unsigned ++?( volatile long long unsigned int * ),
    1342         ++?( _Atomic volatile long long unsigned int * );
    1343 float ++?( volatile float * ),
    1344         ++?( _Atomic volatile float * );
    1345 double ++?( volatile double * ),
    1346         ++?( _Atomic volatile double * );
    1347 long double ++?( volatile long double * ),
    1348         ++?( _Atomic volatile long double * );
    1349 
    1350 forall( type T ) T * ++?( T * restrict volatile * ),
    1351         * ++?( T * _Atomic restrict volatile * );
    1352 
    1353 forall( type T ) _Atomic T * ++?( _Atomic T * restrict volatile * ),
    1354         * ++?( _Atomic T * _Atomic restrict volatile * );
    1355 
    1356 forall( type T ) const T * ++?( const T * restrict volatile * ),
    1357         * ++?( const T * _Atomic restrict volatile * );
    1358 
    1359 forall( type T ) volatile T * ++?( volatile T * restrict volatile * ),
    1360         * ++?( volatile T * _Atomic restrict volatile * );
    1361 
    1362 forall( type T ) restrict T * ++?( restrict T * restrict volatile * ),
    1363         * ++?( restrict T * _Atomic restrict volatile * );
    1364 
    1365 forall( type T ) _Atomic const T * ++?( _Atomic const T * restrict volatile * ),
    1366         * ++?( _Atomic const T * _Atomic restrict volatile * );
    1367 
    1368 forall( type T ) _Atomic volatile T * ++?( _Atomic volatile T * restrict volatile * ),
    1369         * ++?( _Atomic volatile T * _Atomic restrict volatile * );
    1370 
    1371 forall( type T ) _Atomic restrict T * ++?( _Atomic restrict T * restrict volatile * ),
    1372         * ++?( _Atomic restrict T * _Atomic restrict volatile * );
    1373 
    1374 forall( type T ) const volatile T * ++?( const volatile T * restrict volatile * ),
    1375         * ++?( const volatile T * _Atomic restrict volatile * );
    1376 
    1377 forall( type T ) const restrict T * ++?( const restrict T * restrict volatile * ),
    1378         * ++?( const restrict T * _Atomic restrict volatile * );
    1379 
    1380 forall( type T ) restrict volatile T * ++?( restrict volatile T * restrict volatile * ),
    1381         * ++?( restrict volatile T * _Atomic restrict volatile * );
    1382 
    1383 forall( type T ) _Atomic const volatile T * ++?( _Atomic const volatile T * restrict volatile * ),
    1384         * ++?( _Atomic const volatile T * _Atomic restrict volatile * );
    1385 
    1386 forall( type T ) _Atomic const restrict T * ++?( _Atomic const restrict T * restrict volatile * ),
    1387         * ++?( _Atomic const restrict T * _Atomic restrict volatile * );
    1388 
    1389 forall( type T ) _Atomic restrict volatile T * ++?( _Atomic restrict volatile T * restrict volatile * ),
    1390         * ++?( _Atomic restrict volatile T * _Atomic restrict volatile * );
    1391 
    1392 forall( type T ) const restrict volatile T * ++?( const restrict volatile T * restrict volatile * ),
    1393         * ++?( const restrict volatile T * _Atomic restrict volatile * );
    1394 
    1395 forall( type T ) _Atomic const restrict volatile T * ++?( _Atomic const restrict volatile T * restrict volatile * ),
    1396         * ++?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    1397 
    1398 _Bool --?( volatile _Bool * ),
    1399         --?( _Atomic volatile _Bool * );
    1400 char --?( volatile char * ),
    1401         --?( _Atomic volatile char * );
    1402 signed char --?( volatile signed char * ),
    1403         --?( _Atomic volatile signed char * );
    1404 unsigned char --?( volatile signed char * ),
    1405         --?( _Atomic volatile signed char * );
    1406 short int --?( volatile short int * ),
    1407         --?( _Atomic volatile short int * );
    1408 unsigned short int --?( volatile unsigned short int * ),
    1409         --?( _Atomic volatile unsigned short int * );
    1410 int --?( volatile int * ),
    1411         --?( _Atomic volatile int * );
    1412 unsigned int --?( volatile unsigned int * ),
    1413         --?( _Atomic volatile unsigned int * );
    1414 long int --?( volatile long int * ),
    1415         --?( _Atomic volatile long int * );
    1416 long unsigned int --?( volatile long unsigned int * ),
    1417         --?( _Atomic volatile long unsigned int * );
    1418 long long int --?( volatile long long int * ),
    1419         --?( _Atomic volatile long long int * );
    1420 long long unsigned --?( volatile long long unsigned int * ),
    1421         --?( _Atomic volatile long long unsigned int * );
    1422 float --?( volatile float * ),
    1423         --?( _Atomic volatile float * );
    1424 double --?( volatile double * ),
    1425         --?( _Atomic volatile double * );
    1426 long double --?( volatile long double * ),
    1427         --?( _Atomic volatile long double * );
    1428 
    1429 forall( type T ) T * --?( T * restrict volatile * ),
    1430         * --?( T * _Atomic restrict volatile * );
    1431 
    1432 forall( type T ) _Atomic T * --?( _Atomic T * restrict volatile * ),
    1433         * --?( _Atomic T * _Atomic restrict volatile * );
    1434 
    1435 forall( type T ) const T * --?( const T * restrict volatile * ),
    1436         * --?( const T * _Atomic restrict volatile * );
    1437 
    1438 forall( type T ) volatile T * --?( volatile T * restrict volatile * ),
    1439         * --?( volatile T * _Atomic restrict volatile * );
    1440 
    1441 forall( type T ) restrict T * --?( restrict T * restrict volatile * ),
    1442         * --?( restrict T * _Atomic restrict volatile * );
    1443 
    1444 forall( type T ) _Atomic const T * --?( _Atomic const T * restrict volatile * ),
    1445         * --?( _Atomic const T * _Atomic restrict volatile * );
    1446 
    1447 forall( type T ) _Atomic volatile T * --?( _Atomic volatile T * restrict volatile * ),
    1448         * --?( _Atomic volatile T * _Atomic restrict volatile * );
    1449 
    1450 forall( type T ) _Atomic restrict T * --?( _Atomic restrict T * restrict volatile * ),
    1451         * --?( _Atomic restrict T * _Atomic restrict volatile * );
    1452 
    1453 forall( type T ) const volatile T * --?( const volatile T * restrict volatile * ),
    1454         * --?( const volatile T * _Atomic restrict volatile * );
    1455 
    1456 forall( type T ) const restrict T * --?( const restrict T * restrict volatile * ),
    1457         * --?( const restrict T * _Atomic restrict volatile * );
    1458 
    1459 forall( type T ) restrict volatile T * --?( restrict volatile T * restrict volatile * ),
    1460         * --?( restrict volatile T * _Atomic restrict volatile * );
    1461 
    1462 forall( type T ) _Atomic const volatile T * --?( _Atomic const volatile T * restrict volatile * ),
    1463         * --?( _Atomic const volatile T * _Atomic restrict volatile * );
    1464 
    1465 forall( type T ) _Atomic const restrict T * --?( _Atomic const restrict T * restrict volatile * ),
    1466         * --?( _Atomic const restrict T * _Atomic restrict volatile * );
    1467 
    1468 forall( type T ) _Atomic restrict volatile T * --?( _Atomic restrict volatile T * restrict volatile * ),
    1469         * --?( _Atomic restrict volatile T * _Atomic restrict volatile * );
    1470 
    1471 forall( type T ) const restrict volatile T * --?( const restrict volatile T * restrict volatile * ),
    1472         * --?( const restrict volatile T * _Atomic restrict volatile * );
    1473 
    1474 forall( type T ) _Atomic const restrict volatile T * --?( _Atomic const restrict volatile T * restrict volatile * ),
    1475         * --?( _Atomic const restrict volatile T * _Atomic restrict volatile * );
    1476 \end{lstlisting}
    1477 For every extended integer type \lstinline$X$ there exist
    1478 % Don't use predefined: keep this out of prelude.cf.
    1479 \begin{lstlisting}
    1480 X       ++?( volatile X * ),
    1481         ++?( _Atomic volatile X * ),
    1482         --?( volatile X * ),
    1483         --?( _Atomic volatile X * );
    1484 \end{lstlisting}
    1485 For every complete enumerated type \lstinline$E$ there exist
    1486 % Don't use predefined: keep this out of prelude.cf.
    1487 \begin{lstlisting}
    1488 E ++?( volatile E * ),
    1489         ++?( _Atomic volatile E * ),
    1490         ?--( volatile E * ),
    1491         ?--( _Atomic volatile E * );
    1492 \end{lstlisting}
    1493 
    1494 \semantics
    1495 The interpretations of prefix increment and decrement expressions are
    1496 determined in the same way as the interpretations of postfix increment and
    1497 decrement expressions.
    1498 
    1499 
    1500 \subsubsection{Address and indirection operators}
    1501 
    1502 \begin{lstlisting}
    1503 forall( type T ) lvalue T *?( T * );
    1504 forall( type T ) _Atomic lvalue T *?( _Atomic T * );
    1505 forall( type T ) const lvalue T *?( const T * );
    1506 forall( type T ) volatile lvalue T *?( volatile T * );
    1507 forall( type T ) restrict lvalue T *?( restrict T * );
    1508 forall( type T ) _Atomic const lvalue T *?( _Atomic const T * );
    1509 forall( type T ) _Atomic volatile lvalue T *?( _Atomic volatile T * );
    1510 forall( type T ) _Atomic restrict lvalue T *?( _Atomic restrict T * );
    1511 forall( type T ) const volatile lvalue T *?( const volatile T * );
    1512 forall( type T ) const restrict lvalue T *?( const restrict T * );
    1513 forall( type T ) restrict volatile lvalue T *?( restrict volatile T * );
    1514 forall( type T ) _Atomic const volatile lvalue T *?( _Atomic const volatile T * );
    1515 forall( type T ) _Atomic const restrict lvalue T *?( _Atomic const restrict T * );
    1516 forall( type T ) _Atomic restrict volatile lvalue T *?( _Atomic restrict volatile T * );
    1517 forall( type T ) const restrict volatile lvalue T *?( const restrict volatile T * );
    1518 forall( type T ) _Atomic const restrict volatile lvalue T *?( _Atomic const restrict volatile T * );
    1519 
    1520 forall( ftype FT ) FT *?( FT * );
    1521 \end{lstlisting}
    1522 
    1523 \constraints
    1524 The operand of the unary ``\lstinline$&$'' operator shall have exactly one
    1525 interpretation\index{ambiguous interpretation}\index{interpretations}, which shall be unambiguous.
    1526 
    1527 \semantics
    1528 The ``\lstinline$&$'' expression has one interpretation which is of type \lstinline$T *$, where
    1529 \lstinline$T$ is the type of the operand.
    1530 
    1531 The interpretations of an indirection expression are the interpretations of the corresponding
    1532 function call.
    1533 
    1534 
    1535 \subsubsection{Unary arithmetic operators}
    1536 
    1537 \begin{lstlisting}
    1538 int
    1539         +?( int ),
    1540         -?( int ),
    1541         ~?( int );
    1542 unsigned int
    1543         +?( unsigned int ),
    1544         -?( unsigned int ),
    1545          ~?( unsigned int );
    1546 long int
    1547         +?( long int ),
    1548         -?( long int ),
    1549         ~?( long int );
    1550 long unsigned int
    1551         +?( long unsigned int ),
    1552         -?( long unsigned int ),
    1553         ~?( long unsigned int );
    1554 long long int
    1555         +?( long long int ),
    1556         -?( long long int ),
    1557         ~?( long long int );
    1558 long long unsigned int
    1559         +?( long long unsigned int ),
    1560         -?( long long unsigned int ),
    1561         ~?( long long unsigned int );
    1562 float
    1563         +?( float ),
    1564         -?( float );
    1565 double
    1566         +?( double ),
    1567         -?( double );
    1568 long double
    1569         +?( long double ),
    1570         -?( long double );
    1571 _Complex float
    1572         +?( _Complex float ),
    1573         -?( _Complex float );
    1574 _Complex double
    1575         +?( _Complex double ),
    1576         -?( _Complex double );
    1577 _Complex long double
    1578         +?( _Complex long double ),
    1579         -?( _Complex long double );
    1580 
    1581 int !?( int ),
    1582         !?( unsigned int ),
    1583         !?( long ),
    1584         !?( long unsigned int ),
    1585         !?( long long int ),
    1586         !?( long long unsigned int ),
    1587         !?( float ),
    1588         !?( double ),
    1589         !?( long double ),
    1590         !?( _Complex float ),
    1591         !?( _Complex double ),
    1592         !?( _Complex long double );
    1593 
    1594 forall( dtype DT ) int !?( const restrict volatile DT * );
    1595 forall( dtype DT ) int !?( _Atomic const restrict volatile DT * );
    1596 forall( ftype FT ) int !?( FT * );
    1597 \end{lstlisting}
    1598 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    1599 rank}greater than the rank of \lstinline$int$ there exist
    1600 % Don't use predefined: keep this out of prelude.cf.
    1601 \begin{lstlisting}
    1602 X +?( X ), -?( X ), ~?( X );
    1603 int !?( X );
    1604 \end{lstlisting}
    1605 
    1606 \semantics
    1607 The interpretations of a unary arithmetic expression are the interpretations of the corresponding
    1608 function call.
    1609 
    1610 \examples
    1611 \begin{lstlisting}
    1612 long int li;
    1613 void eat_double( double );@\use{eat_double}@
    1614 
    1615 eat_double(-li ); // @\rewrite@ eat_double( -?( li ) );
    1616 \end{lstlisting}
    1617 The valid interpretations of ``\lstinline$-li$'' (assuming no extended integer types exist) are
    1618 \begin{center}
    1619 \begin{tabular}{llc}
    1620 interpretation & result type & expression conversion cost \\
    1621 \hline
    1622 \lstinline$-?( (int)li )$                                       & \lstinline$int$                                       & (unsafe) \\
    1623 \lstinline$-?( (unsigned)li)$                           & \lstinline$unsigned int$                      & (unsafe) \\
    1624 \lstinline$-?( (long)li)$                                       & \lstinline$long$                                      & 0 \\
    1625 \lstinline$-?( (long unsigned int)li)$          & \lstinline$long unsigned int$         & 1 \\
    1626 \lstinline$-?( (long long int)li)$                      & \lstinline$long long int$                     & 2 \\
    1627 \lstinline$-?( (long long unsigned int)li)$     & \lstinline$long long unsigned int$& 3 \\
    1628 \lstinline$-?( (float)li)$                                      & \lstinline$float$                                     & 4 \\
    1629 \lstinline$-?( (double)li)$                                     & \lstinline$double$                            & 5 \\
    1630 \lstinline$-?( (long double)li)$                        & \lstinline$long double$                       & 6 \\
    1631 \lstinline$-?( (_Complex float)li)$                     & \lstinline$float$                                     & (unsafe) \\
    1632 \lstinline$-?( (_Complex double)li)$            & \lstinline$double$                            & (unsafe) \\
    1633 \lstinline$-?( (_Complex long double)li)$       & \lstinline$long double$                       & (unsafe) \\
    1634 \end{tabular}
    1635 \end{center}
    1636 The valid interpretations of the \lstinline$eat_double$ call, with the cost of the argument
    1637 conversion and the cost of the entire expression, are
    1638 \begin{center}
    1639 \begin{tabular}{lcc}
    1640 interpretation & argument cost & expression cost \\
    1641 \hline
    1642 \lstinline$eat_double( (double)-?( (int)li) )$                                  & 7                     & (unsafe) \\
    1643 \lstinline$eat_double( (double)-?( (unsigned)li) )$                             & 6                     & (unsafe) \\
    1644 \lstinline$eat_double( (double)-?(li) )$                                                & 5                     & \(0+5=5\) \\
    1645 \lstinline$eat_double( (double)-?( (long unsigned int)li) )$    & 4                     & \(1+4=5\) \\
    1646 \lstinline$eat_double( (double)-?( (long long int)li) )$                & 3                     & \(2+3=5\) \\
    1647 \lstinline$eat_double( (double)-?( (long long unsigned int)li) )$& 2            & \(3+2=5\) \\
    1648 \lstinline$eat_double( (double)-?( (float)li) )$                                & 1                     & \(4+1=5\) \\
    1649 \lstinline$eat_double( (double)-?( (double)li) )$                               & 0                     & \(5+0=5\) \\
    1650 \lstinline$eat_double( (double)-?( (long double)li) )$                  & (unsafe)      & (unsafe) \\
    1651 \lstinline$eat_double( (double)-?( (_Complex float)li) )$               & (unsafe)      & (unsafe) \\
    1652 \lstinline$eat_double( (double)-?( (_Complex double)li) )$              & (unsafe)      & (unsafe) \\
    1653 \lstinline$eat_double( (double)-?( (_Complex long double)li) )$ & (unsafe)      & (unsafe) \\
    1654 \end{tabular}
    1655 \end{center}
    1656 Each has result type \lstinline$void$, so the best must be selected. The interpretations involving
    1657 unsafe conversions are discarded. The remainder have equal expression conversion costs, so the
    1658 ``highest argument conversion cost'' rule is invoked, and the chosen interpretation is
    1659 \lstinline$eat_double( (double)-?(li) )$.
    1660 
    1661 
    1662 \subsubsection{The {\tt sizeof} and {\tt \_Alignof} operators}
    1663 
    1664 \constraints
    1665 The operand of \lstinline$sizeof$ or \lstinline$_Alignof$ shall not be \lstinline$type$,
    1666 \lstinline$dtype$, or \lstinline$ftype$.
    1667 
    1668 When the \lstinline$sizeof$\use{sizeof} operator is applied to an expression, the expression shall
    1669 have exactly one interpretation\index{ambiguous interpretation}\index{interpretations}, which shall
    1670 be unambiguous. \semantics A \lstinline$sizeof$ or \lstinline$_Alignof$ expression has one
    1671 interpretation, of type \lstinline$size_t$.
    1672 
    1673 When \lstinline$sizeof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
    1674 \nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand. When
    1675 the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the
    1676 expression is not a constant expression.
    1677 
    1678 When \lstinline$_Alignof$ is applied to an identifier declared by a \nonterm{type-declaration} or a
    1679 \nonterm{type-parameter}, it yields the alignment requirement of the type that implements the
    1680 operand. When the operand is an opaque type or an inferred type parameter\index{inferred
    1681 parameter}, the expression is not a constant expression.
    1682 \begin{rationale}
    1683 \begin{lstlisting}
    1684 type Pair = struct { int first, second; };
    1685 size_t p_size = sizeof(Pair);           // constant expression
    1686 
    1687 extern type Rational;@\use{Rational}@
    1688 size_t c_size = sizeof(Rational);       // non-constant expression
    1689 
    1690 forall(type T) T f(T p1, T p2) {
    1691         size_t t_size = sizeof(T);              // non-constant expression
    1692         ...
    1693 }
    1694 \end{lstlisting}
    1695 ``\lstinline$sizeof Rational$'', although not statically known, is fixed. Within \lstinline$f()$,
    1696 ``\lstinline$sizeof(T)$'' is fixed for each call of \lstinline$f()$, but may vary from call to call.
    1697 \end{rationale}
    1698 
    1699 \subsection{Cast operators}
    1700 \begin{syntax}
    1701 \lhs{cast-expression}
    1702 \rhs \nonterm{unary-expression}
    1703 \rhs \lstinline$($ \nonterm{type-name} \lstinline$)$ \nonterm{cast-expression}
    1704 \end{syntax}
    1705 
    1706 \constraints
    1707 The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline$type$,
    1708 \lstinline$dtype$, or \lstinline$ftype$.
    1709 
    1710 \semantics
    1711 
    1712 In a cast expression\index{cast expression} ``\lstinline$($\nonterm{type-name}\lstinline$)e$'', if
    1713 \nonterm{type-name} is the type of an interpretation of \lstinline$e$, then that interpretation is the
    1714 only interpretation of the cast expression; otherwise, \lstinline$e$ shall have some interpretation that
    1715 can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast
    1716 of the interpretation that can be converted at the lowest cost. The cast expression's interpretation
    1717 is ambiguous\index{ambiguous interpretation} if more than one interpretation can be converted at the
    1718 lowest cost or if the selected interpretation is ambiguous.
    1719 
    1720 \begin{rationale}
    1721 Casts can be used to eliminate ambiguity in expressions by selecting interpretations of
    1722 subexpressions, and to specialize polymorphic functions and values.
    1723 \end{rationale}
    1724 
    1725 \subsection{Multiplicative operators}
    1726 \begin{syntax}
    1727 \lhs{multiplicative-expression}
    1728 \rhs \nonterm{cast-expression}
    1729 \rhs \nonterm{multiplicative-expression} \lstinline$*$ \nonterm{cast-expression}
    1730 \rhs \nonterm{multiplicative-expression} \lstinline$/$ \nonterm{cast-expression}
    1731 \rhs \nonterm{multiplicative-expression} \lstinline$%$ \nonterm{cast-expression}
    1732 \end{syntax}
    1733 
    1734 \rewriterules
    1735 \begin{lstlisting}
    1736 a * b @\rewrite@ ?*?( a, b )@\use{?*?}@
    1737 a / b @\rewrite@ ?/?( a, b )@\use{?/?}@
    1738 a % b @\rewrite@ ?%?( a, b )@\use{?%?}@
    1739 \end{lstlisting}
    1740 
    1741 \begin{lstlisting}
    1742 int?*?( int, int ),
    1743         ?/?( int, int ),
    1744         ?%?( int, int );
    1745 unsigned int?*?( unsigned int, unsigned int ),
    1746         ?/?( unsigned int, unsigned int ),
    1747         ?%?( unsigned int, unsigned int );
    1748 long int?*?( long int, long int ),
    1749         ?/?( long, long ),
    1750         ?%?( long, long );
    1751 long unsigned int?*?( long unsigned int, long unsigned int ),
    1752         ?/?( long unsigned int, long unsigned int ),
    1753         ?%?( long unsigned int, long unsigned int );
    1754 long long int?*?( long long int, long long int ),
    1755         ?/?( long long int, long long int ),
    1756         ?%?( long long int, long long int );
    1757 long long unsigned int ?*?( long long unsigned int, long long unsigned int ),
    1758         ?/?( long long unsigned int, long long unsigned int ),
    1759         ?%?( long long unsigned int, long long unsigned int );
    1760 float?*?( float, float ),
    1761         ?/?( float, float );
    1762 double?*?( double, double ),
    1763         ?/?( double, double );
    1764 long double?*?( long double, long double ),
    1765         ?/?( long double, long double );
    1766 _Complex float?*?( float, _Complex float ),
    1767         ?/?( float, _Complex float ),
    1768         ?*?( _Complex float, float ),
    1769         ?/?( _Complex float, float ),
    1770         ?*?( _Complex float, _Complex float ),
    1771         ?/?( _Complex float, _Complex float );
    1772 _Complex double?*?( double, _Complex double ),
    1773         ?/?( double, _Complex double ),
    1774         ?*?( _Complex double, double ),
    1775         ?/?( _Complex double, double ),
    1776         ?*?( _Complex double, _Complex double ),
    1777         ?/?( _Complex double, _Complex double );
    1778 _Complex long double?*?( long double, _Complex long double ),
    1779         ?/?( long double, _Complex long double ),
    1780         ?*?( _Complex long double, long double ),
    1781         ?/?( _Complex long double, long double ),
    1782         ?*?( _Complex long double, _Complex long double ),
    1783         ?/?( _Complex long double, _Complex long double );
    1784 \end{lstlisting}
    1785 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    1786 rank}greater than the rank of \lstinline$int$ there exist
    1787 % Don't use predefined: keep this out of prelude.cf.
    1788 \begin{lstlisting}
    1789 X ?*?( X ), ?/?( X ), ?%?( X );
    1790 \end{lstlisting}
    1791 
    1792 \begin{rationale}
    1793 {\c11} does not include conversions from the real types\index{real type} to complex
    1794 types\index{complex type} in the usual arithmetic conversions\index{usual arithmetic conversions}.
    1795 Instead it specifies conversion of the result of binary operations on arguments from mixed type
    1796 domains. \CFA's predefined operators match that pattern.
    1797 \end{rationale}
    1798 
    1799 \semantics
    1800 The interpretations of multiplicative expressions are the interpretations of the corresponding
    1801 function call.
    1802 
    1803 \examples
    1804 \begin{lstlisting}
    1805 int i;
    1806 long li;
    1807 void eat_double( double );@\use{eat_double}@
    1808 eat_double( li % i );
    1809 \end{lstlisting}
    1810 ``\lstinline$li % i$'' is rewritten as ``\lstinline$?%?(li, i )$''. The valid interpretations
    1811 of \lstinline$?%?(li, i )$, the cost\index{conversion cost} of converting their arguments, and
    1812 the cost of converting the result to \lstinline$double$ (assuming no extended integer types are
    1813 present ) are
    1814 \begin{center}
    1815 \begin{tabular}{lcc}
    1816 interpretation & argument cost & result cost \\
    1817 \hline
    1818 \lstinline$ ?%?( (int)li, i )$                                                                          & (unsafe)      & 6     \\
    1819 \lstinline$ ?%?( (unsigned)li,(unsigned)i )$                                            & (unsafe)      & 5     \\
    1820 \lstinline$ ?%?(li,(long)i )$                                                                           & 1                     & 4     \\
    1821 \lstinline$ ?%?( (long unsigned)li,(long unsigned)i )$                          & 3                     & 3     \\
    1822 \lstinline$ ?%?( (long long)li,(long long)i )$                                          & 5                     & 2     \\
    1823 \lstinline$ ?%?( (long long unsigned)li, (long long unsigned)i )$       & 7                     & 1     \\
    1824 \end{tabular}
    1825 \end{center}
    1826 The best interpretation of \lstinline$eat_double( li, i )$ is
    1827 \lstinline$eat_double( (double)?%?(li, (long)i ))$, which has no unsafe conversions and the
    1828 lowest total cost.
    1829 
    1830 \begin{rationale}
    1831 {\c11} defines most arithmetic operations to apply an integer promotion\index{integer promotions} to
    1832 any argument that belongs to a type that has an integer conversion rank\index{integer conversion
    1833  rank} less than that of \lstinline$int$.If \lstinline$s$ is a \lstinline$short int$,
    1834 ``\lstinline$s *s$'' does not have type \lstinline$short int$; it is treated as
    1835 ``\lstinline$( (int)s ) * ( (int)s )$'', and has type \lstinline$int$. \CFA matches that pattern;
    1836 it does not predefine ``\lstinline$short ?*?( short, short )$''.
    1837 
    1838 These ``missing'' operators limit polymorphism. Consider
    1839 \begin{lstlisting}
    1840 forall( type T | T ?*?( T, T ) ) T square( T );
    1841 short s;
    1842 square( s );
    1843 \end{lstlisting}
    1844 Since \CFA does not define a multiplication operator for \lstinline$short int$,
    1845 \lstinline$square( s )$ is treated as \lstinline$square( (int)s )$, and the result has type
    1846 \lstinline$int$. This is mildly surprising, but it follows the {\c11} operator pattern.
    1847 
    1848 A more troubling example is
    1849 \begin{lstlisting}
    1850 forall( type T | ?*?( T, T ) ) T product( T[], int n );
    1851 short sa[5];
    1852 product( sa, 5);
    1853 \end{lstlisting}
    1854 This has no valid interpretations, because \CFA has no conversion from ``array of
    1855 \lstinline$short int$'' to ``array of \lstinline$int$''. The alternatives in such situations
    1856 include
    1857 \begin{itemize}
    1858 \item
    1859 Defining monomorphic overloadings of \lstinline$product$ for \lstinline$short$ and the other
    1860 ``small'' types.
    1861 \item
    1862 Defining ``\lstinline$short ?*?( short, short )$'' within the scope containing the call to
    1863 \lstinline$product$.
    1864 \item
    1865 Defining \lstinline$product$ to take as an argument a conversion function from the ``small'' type to
    1866 the operator's argument type.
    1867 \end{itemize}
    1868 \end{rationale}
    1869 
    1870 
    1871 \subsection{Additive operators}
    1872 
    1873 \begin{syntax}
    1874 \lhs{additive-expression}
    1875 \rhs \nonterm{multiplicative-expression}
    1876 \rhs \nonterm{additive-expression} \lstinline$+$ \nonterm{multiplicative-expression}
    1877 \rhs \nonterm{additive-expression} \lstinline$-$ \nonterm{multiplicative-expression}
    1878 \end{syntax}
    1879 
    1880 \rewriterules
    1881 \begin{lstlisting}
    1882 a + b @\rewrite@ ?+?( a, b )@\use{?+?}@
    1883 a - b @\rewrite@ ?-?( a, b )@\use{?-?}@
    1884 \end{lstlisting}
    1885 
    1886 \begin{lstlisting}
    1887 int?+?( int, int ),
    1888         ?-?( int, int );
    1889 unsigned int?+?( unsigned int, unsigned int ),
    1890         ?-?( unsigned int, unsigned int );
    1891 long int?+?( long int, long int ),
    1892         ?-?( long int, long int );
    1893 long unsigned int?+?( long unsigned int, long unsigned int ),
    1894         ?-?( long unsigned int, long unsigned int );
    1895 long long int?+?( long long int, long long int ),
    1896         ?-?( long long int, long long int );
    1897 long long unsigned int ?+?( long long unsigned int, long long unsigned int ),
    1898         ?-?( long long unsigned int, long long unsigned int );
    1899 float?+?( float, float ),
    1900         ?-?( float, float );
    1901 double?+?( double, double ),
    1902         ?-?( double, double );
    1903 long double?+?( long double, long double ),
    1904         ?-?( long double, long double );
    1905 _Complex float?+?( _Complex float, float ),
    1906         ?-?( _Complex float, float ),
    1907         ?+?( float, _Complex float ),
    1908         ?-?( float, _Complex float ),
    1909         ?+?( _Complex float, _Complex float ),
    1910         ?-?( _Complex float, _Complex float );
    1911 _Complex double?+?( _Complex double, double ),
    1912         ?-?( _Complex double, double ),
    1913         ?+?( double, _Complex double ),
    1914         ?-?( double, _Complex double ),
    1915         ?+?( _Complex double, _Complex double ),
    1916         ?-?( _Complex double, _Complex double );
    1917 _Complex long double?+?( _Complex long double, long double ),
    1918         ?-?( _Complex long double, long double ),
    1919         ?+?( long double, _Complex long double ),
    1920         ?-?( long double, _Complex long double ),
    1921         ?+?( _Complex long double, _Complex long double ),
    1922         ?-?( _Complex long double, _Complex long double );
    1923 
    1924 forall( type T ) T
    1925         * ?+?( T *, ptrdiff_t ),
    1926         * ?+?( ptrdiff_t, T * ),
    1927         * ?-?( T *, ptrdiff_t );
    1928 
    1929 forall( type T ) _Atomic T
    1930         * ?+?( _Atomic T *, ptrdiff_t ),
    1931         * ?+?( ptrdiff_t, _Atomic T * ),
    1932         * ?-?( _Atomic T *, ptrdiff_t );
    1933 
    1934 forall( type T ) const T
    1935         * ?+?( const T *, ptrdiff_t ),
    1936         * ?+?( ptrdiff_t, const T * ),
    1937         * ?-?( const T *, ptrdiff_t );
    1938 
    1939 forall( type T ) restrict T
    1940         * ?+?( restrict T *, ptrdiff_t ),
    1941         * ?+?( ptrdiff_t, restrict T * ),
    1942         * ?-?( restrict T *, ptrdiff_t );
    1943 
    1944 forall( type T ) volatile T
    1945         * ?+?( volatile T *, ptrdiff_t ),
    1946         * ?+?( ptrdiff_t, volatile T * ),
    1947         * ?-?( volatile T *, ptrdiff_t );
    1948 
    1949 forall( type T ) _Atomic const T
    1950         * ?+?( _Atomic const T *, ptrdiff_t ),
    1951         * ?+?( ptrdiff_t, _Atomic const T * ),
    1952         * ?-?( _Atomic const T *, ptrdiff_t );
    1953 
    1954 forall( type T ) _Atomic restrict T
    1955         * ?+?( _Atomic restrict T *, ptrdiff_t ),
    1956         * ?+?( ptrdiff_t, _Atomic restrict T * ),
    1957         * ?-?( _Atomic restrict T *, ptrdiff_t );
    1958 
    1959 forall( type T ) _Atomic volatile T
    1960         * ?+?( _Atomic volatile T *, ptrdiff_t ),
    1961         * ?+?( ptrdiff_t, _Atomic volatile T * ),
    1962         * ?-?( _Atomic volatile T *, ptrdiff_t );
    1963 
    1964 forall( type T ) const restrict T
    1965         * ?+?( const restrict T *, ptrdiff_t ),
    1966         * ?+?( ptrdiff_t, const restrict T * ),
    1967         * ?-?( const restrict T *, ptrdiff_t );
    1968 
    1969 forall( type T ) const volatile T
    1970         * ?+?( const volatile T *, ptrdiff_t ),
    1971         * ?+?( ptrdiff_t, const volatile T * ),
    1972         * ?-?( const volatile T *, ptrdiff_t );
    1973 
    1974 forall( type T ) restrict volatile T
    1975         * ?+?( restrict volatile T *, ptrdiff_t ),
    1976         * ?+?( ptrdiff_t, restrict volatile T * ),
    1977         * ?-?( restrict volatile T *, ptrdiff_t );
    1978 
    1979 forall( type T ) _Atomic const restrict T
    1980         * ?+?( _Atomic const restrict T *, ptrdiff_t ),
    1981         * ?+?( ptrdiff_t, _Atomic const restrict T * ),
    1982         * ?-?( _Atomic const restrict T *, ptrdiff_t );
    1983 
    1984 forall( type T ) ptrdiff_t
    1985         * ?-?( const restrict volatile T *, const restrict volatile T * ),
    1986         * ?-?( _Atomic const restrict volatile T *, _Atomic const restrict volatile T * );
    1987 \end{lstlisting}
    1988 For every extended integer type \lstinline$X$ with integer conversion rank
    1989 \index{integer conversion rank}greater than the rank of \lstinline$int$ there
    1990 exist
    1991 % Don't use predefined: keep this out of prelude.cf.
    1992 \begin{lstlisting}
    1993 X ?+?( X ), ?-?( X );
    1994 \end{lstlisting}
    1995 
    1996 \semantics
    1997 The interpretations of additive expressions are the interpretations of the corresponding function
    1998 calls.
    1999 
    2000 \begin{rationale}
    2001 \lstinline$ptrdiff_t$ is an implementation-defined identifier defined in \lstinline$<stddef.h>$ that
    2002 is synonymous with a signed integral type that is large enough to hold the difference between two
    2003 pointers. It seems reasonable to use it for pointer addition as well. (This is technically a
    2004 difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral}
    2005 argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition.
    2006 The {\c11} standard uses \lstinline$size_t$ in several cases where a library function takes an
    2007 argument that is used as a subscript, but \lstinline$size_t$ is unsuitable here because it is an
    2008 unsigned type.
    2009 \end{rationale}
    2010 
    2011 
    2012 \subsection{Bitwise shift operators}
    2013 
    2014 \begin{syntax}
    2015 \lhs{shift-expression}
    2016 \rhs \nonterm{additive-expression}
    2017 \rhs \nonterm{shift-expression} \lstinline$<<$ \nonterm{additive-expression}
    2018 \rhs \nonterm{shift-expression} \lstinline$>>$ \nonterm{additive-expression}
    2019 \end{syntax}
    2020 
    2021 \rewriterules \use{?>>?}%use{?<<?}
    2022 \begin{lstlisting}
    2023 a << b @\rewrite@ ?<<?( a, b )
    2024 a >> b @\rewrite@ ?>>?( a, b )
    2025 \end{lstlisting}
    2026 
    2027 \begin{lstlisting}
    2028 int ?<<?( int, int ),
    2029          ?>>?( int, int );
    2030 unsigned int ?<<?( unsigned int, int ),
    2031          ?>>?( unsigned int, int );
    2032 long int ?<<?( long int, int ),
    2033          ?>>?( long int, int );
    2034 long unsigned int ?<<?( long unsigned int, int ),
    2035          ?>>?( long unsigned int, int );
    2036 long long int ?<<?( long long int, int ),
    2037          ?>>?( long long int, int );
    2038 long long unsigned int ?<<?( long long unsigned int, int ),
    2039          ?>>?( long long unsigned int, int);
    2040 \end{lstlisting}
    2041 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2042  rank}greater than the rank of \lstinline$int$ there exist
    2043 % Don't use predefined: keep this out of prelude.cf.
    2044 \begin{lstlisting}
    2045 X ?<<?( X, int ), ?>>?( X, int );
    2046 \end{lstlisting}
    2047 
    2048 \begin{rationale}
    2049 The bitwise shift operators break the usual pattern: they do not convert both operands to a common
    2050 type. The right operand only undergoes integer promotion\index{integer promotion}.
    2051 \end{rationale}
    2052 
    2053 \semantics
    2054 The interpretations of a bitwise shift expression are the interpretations of the corresponding
    2055 function calls.
    2056 
    2057 
    2058 \subsection{Relational operators}
    2059 
    2060 \begin{syntax}
    2061 \lhs{relational-expression}
    2062 \rhs \nonterm{shift-expression}
    2063 \rhs \nonterm{relational-expression} \lstinline$< $ \nonterm{shift-expression}
    2064 \rhs \nonterm{relational-expression} \lstinline$> $ \nonterm{shift-expression}
    2065 \rhs \nonterm{relational-expression} \lstinline$<=$ \nonterm{shift-expression}
    2066 \rhs \nonterm{relational-expression} \lstinline$>=$ \nonterm{shift-expression}
    2067 \end{syntax}
    2068 
    2069 \rewriterules\use{?>?}\use{?>=?}%use{?<?}%use{?<=?}
    2070 \begin{lstlisting}
    2071 a < b @\rewrite@ ?<?( a, b )
    2072 a > b @\rewrite@ ?>?( a, b )
    2073 a <= b @\rewrite@ ?<=?( a, b )
    2074 a >= b @\rewrite@ ?>=?( a, b )
    2075 \end{lstlisting}
    2076 
    2077 \begin{lstlisting}
    2078 int ?<?( int, int ),
    2079         ?<=?( int, int ),
    2080         ?>?( int, int ),
    2081         ?>=?( int, int );
    2082 int ?<?( unsigned int, unsigned int ),
    2083         ?<=?( unsigned int, unsigned int ),
    2084         ?>?( unsigned int, unsigned int ),
    2085         ?>=?( unsigned int, unsigned int );
    2086 int ?<?( long int, long int ),
    2087         ?<=?( long int, long int ),
    2088         ?>?( long int, long int ),
    2089         ?>=?( long int, long int );
    2090 int ?<?( long unsigned int, long unsigned ),
    2091         ?<=?( long unsigned int, long unsigned ),
    2092         ?>?( long unsigned int, long unsigned ),
    2093         ?>=?( long unsigned int, long unsigned );
    2094 int ?<?( long long int, long long int ),
    2095         ?<=?( long long int, long long int ),
    2096         ?>?( long long int, long long int ),
    2097         ?>=?( long long int, long long int );
    2098 int ?<?( long long unsigned int, long long unsigned ),
    2099         ?<=?( long long unsigned int, long long unsigned ),
    2100         ?>?( long long unsigned int, long long unsigned ),
    2101         ?>=?( long long unsigned int, long long unsigned );
    2102 int ?<?( float, float ),
    2103         ?<=?( float, float ),
    2104         ?>?( float, float ),
    2105         ?>=?( float, float );
    2106 int ?<?( double, double ),
    2107         ?<=?( double, double ),
    2108         ?>?( double, double ),
    2109         ?>=?( double, double );
    2110 int ?<?( long double, long double ),
    2111         ?<=?( long double, long double ),
    2112         ?>?( long double, long double ),
    2113         ?>=?( long double, long double );
    2114 
    2115 forall( dtype DT ) int
    2116         ?<?( const restrict volatile DT *, const restrict volatile DT * ),
    2117         ?<?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
    2118         ?<=?( const restrict volatile DT *, const restrict volatile DT * ),
    2119         ?<=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
    2120         ?>?( const restrict volatile DT *, const restrict volatile DT * ),
    2121         ?>?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
    2122         ?>=?( const restrict volatile DT *, const restrict volatile DT * ),
    2123         ?>=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * );
    2124 \end{lstlisting}
    2125 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2126  rank}greater than the rank of \lstinline$int$ there exist
    2127 % Don't use predefined: keep this out of prelude.cf.
    2128 \begin{lstlisting}
    2129 int ?<?( X, X ),
    2130         ?<=?( X, X ),
    2131         ?<?( X, X ),
    2132         ?>=?( X, X );
    2133 \end{lstlisting}
    2134 
    2135 \semantics
    2136 The interpretations of a relational expression are the interpretations of the corresponding function
    2137 call.
    2138 
    2139 
    2140 \subsection{Equality operators}
    2141 
    2142 \begin{syntax}
    2143 \lhs{equality-expression}
    2144 \rhs \nonterm{relational-expression}
    2145 \rhs \nonterm{equality-expression} \lstinline$==$ \nonterm{relational-expression}
    2146 \rhs \nonterm{equality-expression} \lstinline$!=$ \nonterm{relational-expression}
    2147 \end{syntax}
    2148 
    2149 \rewriterules
    2150 \begin{lstlisting}
    2151 a == b @\rewrite@ ?==?( a, b )@\use{?==?}@
    2152 a != b @\rewrite@ ?!=?( a, b )@\use{?"!=?}@
    2153 \end{lstlisting}
    2154 
    2155 \begin{lstlisting}
    2156 int ?==?( int, int ),
    2157         ?!=?( int, int ),
    2158         ?==?( unsigned int, unsigned int ),
    2159         ?!=?( unsigned int, unsigned int ),
    2160         ?==?( long int, long int ),
    2161         ?!=?( long int, long int ),
    2162         ?==?( long unsigned int, long unsigned int ),
    2163         ?!=?( long unsigned int, long unsigned int ),
    2164         ?==?( long long int, long long int ),
    2165         ?!=?( long long int, long long int ),
    2166         ?==?( long long unsigned int, long long unsigned int ),
    2167         ?!=?( long long unsigned int, long long unsigned int ),
    2168         ?==?( float, float ),
    2169         ?!=?( float, float ),
    2170         ?==?( _Complex float, float ),
    2171         ?!=?( _Complex float, float ),
    2172         ?==?( float, _Complex float ),
    2173         ?!=?( float, _Complex float ),
    2174         ?==?( _Complex float, _Complex float ),
    2175         ?!=?( _Complex float, _Complex float ),
    2176         ?==?( double, double ),
    2177         ?!=?( double, double ),
    2178         ?==?( _Complex double, double ),
    2179         ?!=?( _Complex double, double ),
    2180         ?==?( double, _Complex double ),
    2181         ?!=?( double, _Complex double ),
    2182         ?==?( _Complex double, _Complex double ),
    2183         ?!=?( _Complex double, _Complex double ),
    2184         ?==?( long double, long double ),
    2185         ?!=?( long double, long double ),
    2186         ?==?( _Complex long double, long double ),
    2187         ?!=?( _Complex long double, long double ),
    2188         ?==?( long double, _Complex long double ),
    2189         ?!=?( long double, _Complex long double ),
    2190         ?==?( _Complex long double, _Complex long double ),
    2191         ?!=?( _Complex long double, _Complex long double );
    2192 
    2193 forall( dtype DT ) int
    2194         ?==?( const restrict volatile DT *, const restrict volatile DT * ),
    2195         ?!=?( const restrict volatile DT *, const restrict volatile DT * ),
    2196         ?==?( const restrict volatile DT *, const restrict volatile void * ),
    2197         ?!=?( const restrict volatile DT *, const restrict volatile void * ),
    2198         ?==?( const restrict volatile void *, const restrict volatile DT * ),
    2199         ?!=?( const restrict volatile void *, const restrict volatile DT * ),
    2200         ?==?( const restrict volatile DT *, forall( dtype DT2) const DT2 * ),
    2201         ?!=?( const restrict volatile DT *, forall( dtype DT2) const DT2 * ),
    2202         ?==?( forall( dtype DT2) const DT2*, const restrict volatile DT * ),
    2203         ?!=?( forall( dtype DT2) const DT2*, const restrict volatile DT * ),
    2204         ?==?( forall( dtype DT2) const DT2*, forall( dtype DT3) const DT3 * ),
    2205         ?!=?( forall( dtype DT2) const DT2*, forall( dtype DT3) const DT3 * ),
    2206 
    2207         ?==?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
    2208         ?!=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ),
    2209         ?==?( _Atomic const restrict volatile DT *, const restrict volatile void * ),
    2210         ?!=?( _Atomic const restrict volatile DT *, const restrict volatile void * ),
    2211         ?==?( const restrict volatile void *, _Atomic const restrict volatile DT * ),
    2212         ?!=?( const restrict volatile void *, _Atomic const restrict volatile DT * ),
    2213         ?==?( _Atomic const restrict volatile DT *, forall( dtype DT2) const DT2 * ),
    2214         ?!=?( _Atomic const restrict volatile DT *, forall( dtype DT2) const DT2 * ),
    2215         ?==?( forall( dtype DT2) const DT2*, _Atomic const restrict volatile DT * ),
    2216         ?!=?( forall( dtype DT2) const DT2*, _Atomic const restrict volatile DT * );
    2217 
    2218 forall( ftype FT ) int
    2219         ?==?( FT *, FT * ),
    2220         ?!=?( FT *, FT * ),
    2221         ?==?( FT *, forall( ftype FT2) FT2 * ),
    2222         ?!=?( FT *, forall( ftype FT2) FT2 * ),
    2223         ?==?( forall( ftype FT2) FT2*, FT * ),
    2224         ?!=?( forall( ftype FT2) FT2*, FT * ),
    2225         ?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ),
    2226         ?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * );
    2227 \end{lstlisting}
    2228 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2229  rank}greater than the rank of \lstinline$int$ there exist
    2230 % Don't use predefined: keep this out of prelude.cf.
    2231 \begin{lstlisting}
    2232 int ?==?( X, X ),
    2233         ?!=?( X, X );
    2234 \end{lstlisting}
    2235 
    2236 \begin{rationale}
    2237 The polymorphic equality operations come in three styles: comparisons between pointers of compatible
    2238 types, between pointers to \lstinline$void$ and pointers to object types or incomplete types, and
    2239 between the null pointer constant\index{null pointer} and pointers to any type. In the last case, a
    2240 special constraint rule for null pointer constant operands has been replaced by a consequence of the
    2241 \CFA type system.
    2242 \end{rationale}
    2243 
    2244 \semantics
    2245 The interpretations of an equality expression are the interpretations of the corresponding function
    2246 call.
    2247 
    2248 \begin{sloppypar}
    2249 The result of an equality comparison between two pointers to predefined functions or predefined
    2250 values is implementation-defined.
    2251 \end{sloppypar}
    2252 \begin{rationale}
    2253 The implementation-defined status of equality comparisons allows implementations to use one library
    2254 routine to implement many predefined functions. These optimization are particularly important when
    2255 the predefined functions are polymorphic, as is the case for most pointer operations
    2256 \end{rationale}
    2257 
    2258 
    2259 \subsection{Bitwise AND operator}
    2260 
    2261 \begin{syntax}
    2262 \lhs{AND-expression}
    2263 \rhs \nonterm{equality-expression}
    2264 \rhs \nonterm{AND-expression} \lstinline$&$ \nonterm{equality-expression}
    2265 \end{syntax}
    2266 
    2267 \rewriterules
    2268 \begin{lstlisting}
    2269 a & b @\rewrite@ ?&?( a, b )@\use{?&?}@
    2270 \end{lstlisting}
    2271 
    2272 \begin{lstlisting}
    2273 int ?&?( int, int );
    2274 unsigned int ?&?( unsigned int, unsigned int );
    2275 long int ?&?( long int, long int );
    2276 long unsigned int ?&?( long unsigned int, long unsigned int );
    2277 long long int ?&?( long long int, long long int );
    2278 long long unsigned int ?&?( long long unsigned int, long long unsigned int );
    2279 \end{lstlisting}
    2280 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2281 rank}greater than the rank of \lstinline$int$ there exist
    2282 % Don't use predefined: keep this out of prelude.cf.
    2283 \begin{lstlisting}
    2284 int ?&?( X, X );
    2285 \end{lstlisting}
    2286 
    2287 \semantics
    2288 The interpretations of a bitwise AND expression are the interpretations of the corresponding
    2289 function call.
    2290 
    2291 
    2292 \subsection{Bitwise exclusive OR operator}
    2293 
    2294 \begin{syntax}
    2295 \lhs{exclusive-OR-expression}
    2296 \rhs \nonterm{AND-expression}
    2297 \rhs \nonterm{exclusive-OR-expression} \lstinline$^$ \nonterm{AND-expression}
    2298 \end{syntax}
    2299 
    2300 \rewriterules
    2301 \begin{lstlisting}
    2302 a ^ b @\rewrite@ ?^?( a, b )@\use{?^?}@
    2303 \end{lstlisting}
    2304 
    2305 \begin{lstlisting}
    2306 int ?^?( int, int );
    2307 unsigned int ?^?( unsigned int, unsigned int );
    2308 long int ?^?( long int, long int );
    2309 long unsigned int ?^?( long unsigned int, long unsigned int );
    2310 long long int ?^?( long long int, long long int );
    2311 long long unsigned int ?^?( long long unsigned int, long long unsigned int );
    2312 \end{lstlisting}
    2313 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2314  rank}greater than the rank of \lstinline$int$ there exist
    2315 % Don't use predefined: keep this out of prelude.cf.
    2316 \begin{lstlisting}
    2317 int ?^?( X, X );
    2318 \end{lstlisting}
    2319 
    2320 \semantics
    2321 The interpretations of a bitwise exclusive OR expression are the interpretations of the
    2322 corresponding function call.
    2323 
    2324 
    2325 \subsection{Bitwise inclusive OR operator}
    2326 
    2327 \begin{syntax}
    2328 \lhs{inclusive-OR-expression}
    2329 \rhs \nonterm{exclusive-OR-expression}
    2330 \rhs \nonterm{inclusive-OR-expression} \lstinline$|$ \nonterm{exclusive-OR-expression}
    2331 \end{syntax}
    2332 
    2333 \rewriterules\use{?"|?}
    2334 \begin{lstlisting}
    2335 a | b @\rewrite@ ?|?( a, b )
    2336 \end{lstlisting}
    2337 
    2338 \begin{lstlisting}
    2339 int ?|?( int, int );
    2340 unsigned int ?|?( unsigned int, unsigned int );
    2341 long int ?|?( long int, long int );
    2342 long unsigned int ?|?( long unsigned int, long unsigned int );
    2343 long long int ?|?( long long int, long long int );
    2344 long long unsigned int ?|?( long long unsigned int, long long unsigned int );
    2345 \end{lstlisting}
    2346 For every extended integer type \lstinline$X$ with integer conversion rank \index{integer conversion
    2347 rank}greater than the rank of \lstinline$int$ there exist
    2348 % Don't use predefined: keep this out of prelude.cf.
    2349 \begin{lstlisting}
    2350 int ?|?( X, X );
    2351 \end{lstlisting}
    2352 
    2353 \semantics
    2354 The interpretations of a bitwise inclusive OR expression are the interpretations of the
    2355 corresponding function call.
    2356 
    2357 
    2358 \subsection{Logical AND operator}
    2359 
    2360 \begin{syntax}
    2361 \lhs{logical-AND-expression}
    2362 \rhs \nonterm{inclusive-OR-expression}
    2363 \rhs \nonterm{logical-AND-expression} \lstinline$&&$ \nonterm{inclusive-OR-expression}
    2364 \end{syntax}
    2365 
    2366 \semantics The operands of the expression ``\lstinline$a && b$'' are treated as
    2367 ``\lstinline$(int)((a)!=0)$'' and ``\lstinline$(int)((b)!=0)$'', which shall both be
    2368 unambiguous. The expression has only one interpretation, which is of type \lstinline$int$.
    2369 \begin{rationale}
    2370 When the operands of a logical expression are values of built-in types, and ``\lstinline$!=$'' has
    2371 not been redefined for those types, the compiler can optimize away the function calls.
    2372 
    2373 A common C idiom omits comparisons to \lstinline$0$ in the controlling expressions of loops and
    2374 \lstinline$if$ statements. For instance, the loop below iterates as long as \lstinline$rp$ points
    2375 at a \lstinline$Rational$ value that is non-zero.
    2376 
    2377 \begin{lstlisting}
    2378 extern type Rational;@\use{Rational}@
    2379 extern const Rational 0;@\use{0}@
    2380 extern int ?!=?( Rational, Rational );
    2381 Rational *rp;
    2382 
    2383 while ( rp && *rp ) { ... }
    2384 \end{lstlisting}
    2385 The logical expression calls the \lstinline$Rational$ inequality operator, passing
    2386 it \lstinline$*rp$ and the \lstinline$Rational 0$, and getting a 1 or 0 as a result. In
    2387 contrast, {\CC} would apply a programmer-defined \lstinline$Rational$-to-\lstinline$int$
    2388 conversion to \lstinline$*rp$ in the equivalent situation. The conversion to \lstinline$int$ would
    2389 produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was
    2390 not written with this situation in mind.
    2391 \end{rationale}
    2392 
    2393 
    2394 \subsection{Logical OR operator}
    2395 
    2396 \begin{syntax}
    2397 \lhs{logical-OR-expression}
    2398 \rhs \nonterm{logical-AND-expression}
    2399 \rhs \nonterm{logical-OR-expression} \lstinline$||$ \nonterm{logical-AND-expression}
    2400 \end{syntax}
    2401 
    2402 \semantics
    2403 
    2404 The operands of the expression ``\lstinline$a || b$'' are treated as ``\lstinline$(int)((a)!=0)$''
    2405 and ``\lstinline$(int)((b})!=0)$'', which shall both be unambiguous. The expression has only one
    2406 interpretation, which is of type \lstinline$int$.
    2407 
    2408 
    2409 \subsection{Conditional operator}
    2410 
    2411 \begin{syntax}
    2412 \lhs{conditional-expression}
    2413 \rhs \nonterm{logical-OR-expression}
    2414 \rhs \nonterm{logical-OR-expression} \lstinline$?$ \nonterm{expression}
    2415          \lstinline$:$ \nonterm{conditional-expression}
    2416 \end{syntax}
    2417 
    2418 \semantics
    2419 In the conditional expression\use{?:} ``\lstinline$a?b:c$'', if the second and
    2420 third operands both have an interpretation with \lstinline$void$ type, then the expression has an
    2421 interpretation with type \lstinline$void$, equivalent to
    2422 \begin{lstlisting}
    2423 ( int)(( a)!=0) ? ( void)( b) : ( void)( c)
    2424 \end{lstlisting}
    2425 
    2426 If the second and third operands both have interpretations with non-\lstinline$void$ types, the
    2427 expression is treated as if it were the call ``\lstinline$cond((a)!=0, b, c)$'',
    2428 with \lstinline$cond$ declared as
    2429 \begin{lstlisting}
    2430 forall( type T ) T cond( int, T, T );
    2431  
    2432 forall( dtype D ) void
    2433         * cond( int, D *, void * ),
    2434         * cond( int, void *, D * );
    2435        
    2436 forall( dtype D ) _atomic void
    2437         * cond( int, _Atomic D *, _Atomic void * ),
    2438         * cond( int, _Atomic void *, _Atomic D * );
    2439 
    2440 forall( dtype D ) const void
    2441         * cond( int, const D *, const void * ),
    2442         * cond( int, const void *, const D * );
    2443 
    2444 forall( dtype D ) restrict void
    2445         * cond( int, restrict D *, restrict void * ),
    2446         * cond( int, restrict void *, restrict D * );
    2447 
    2448 forall( dtype D ) volatile void
    2449         * cond( int, volatile D *, volatile void * ),
    2450         * cond( int, volatile void *, volatile D * );
    2451 
    2452 forall( dtype D ) _Atomic const void
    2453         * cond( int, _Atomic const D *, _Atomic const void * ),
    2454         * cond( int, _Atomic const void *, _Atomic const D * );
    2455 
    2456 forall( dtype D ) _Atomic restrict void
    2457         * cond( int, _Atomic restrict D *, _Atomic restrict void * ),
    2458         * cond( int, _Atomic restrict void *, _Atomic restrict D * );
    2459 
    2460 forall( dtype D ) _Atomic volatile void
    2461         * cond( int, _Atomic volatile D *, _Atomic volatile void * ),
    2462         * cond( int, _Atomic volatile void *, _Atomic volatile D * );
    2463 
    2464 forall( dtype D ) const restrict void
    2465         * cond( int, const restrict D *, const restrict void * ),
    2466         * cond( int, const restrict void *, const restrict D * );
    2467 
    2468 forall( dtype D ) const volatile void
    2469         * cond( int, const volatile D *, const volatile void * ),
    2470         * cond( int, const volatile void *, const volatile D * );
    2471 
    2472 forall( dtype D ) restrict volatile void
    2473         * cond( int, restrict volatile D *, restrict volatile void * ),
    2474         * cond( int, restrict volatile void *, restrict volatile D * );
    2475 
    2476 forall( dtype D ) _Atomic const restrict void
    2477         * cond( int, _Atomic const restrict D *, _Atomic const restrict void * ),
    2478         * cond( int, _Atomic const restrict void *, _Atomic const restrict D * );
    2479 
    2480 forall( dtype D ) _Atomic const volatile void
    2481         * cond( int, _Atomic const volatile D *, _Atomic const volatile void * ),
    2482         * cond( int, _Atomic const volatile void *, _Atomic const volatile D * );
    2483 
    2484 forall( dtype D ) _Atomic restrict volatile void
    2485         * cond( int, _Atomic restrict volatile D *,
    2486          _Atomic restrict volatile void * ),
    2487         * cond( int, _Atomic restrict volatile void *,
    2488          _Atomic restrict volatile D * );
    2489 
    2490 forall( dtype D ) const restrict volatile void
    2491         * cond( int, const restrict volatile D *,
    2492          const restrict volatile void * ),
    2493         * cond( int, const restrict volatile void *,
    2494          const restrict volatile D * );
    2495 
    2496 forall( dtype D ) _Atomic const restrict volatile void
    2497         * cond( int, _Atomic const restrict volatile D *,
    2498          _Atomic const restrict volatile void * ),
    2499         * cond( int, _Atomic const restrict volatile void *,
    2500          _Atomic const restrict volatile D * );
    2501 \end{lstlisting}
    2502 
    2503 \begin{rationale}
    2504 The object of the above is to apply the usual arithmetic conversions\index{usual arithmetic
    2505 conversions} when the second and third operands have arithmetic type, and to combine the
    2506 qualifiers of the second and third operands if they are pointers.
    2507 \end{rationale}
    2508 
    2509 \examples
    2510 \begin{lstlisting}
    2511 #include <stdlib.h>
    2512 int i;
    2513 long l;
    2514 rand() ? i : l;
    2515 \end{lstlisting}
    2516 The best interpretation infers the expression's type to be \lstinline$long$ and applies the safe
    2517 \lstinline$int$-to-\lstinline$long$ conversion to \lstinline$i$.
    2518 
    2519 \begin{lstlisting}
    2520 const int *cip;
    2521 volatile int *vip;
    2522 rand() ? cip : vip;
    2523 \end{lstlisting}
    2524 The expression has type \lstinline$const volatile int *$, with safe conversions applied to the second
    2525 and third operands to add \lstinline$volatile$ and \lstinline$const$ qualifiers, respectively.
    2526 
    2527 \begin{lstlisting}
    2528 rand() ? cip : 0;
    2529 \end{lstlisting}
    2530 The expression has type \lstinline$const int *$, with a specialization conversion applied to
    2531 \lstinline$0$.
    2532 
    2533 
    2534 \subsection{Assignment operators}
    2535 
    2536 \begin{syntax}
    2537 \lhs{assignment-expression}
    2538 \rhs \nonterm{conditional-expression}
    2539 \rhs \nonterm{unary-expression} \nonterm{assignment-operator}
    2540          \nonterm{assignment-expression}
    2541 \lhs{assignment-operator} one of
    2542 \rhs \lstinline$=$\ \ \lstinline$*=$\ \ \lstinline$/=$\ \ \lstinline$%=$\ \ \lstinline$+=$\ \ \lstinline$-=$\ \ 
    2543          \lstinline$<<=$\ \ \lstinline$>>=$\ \ \lstinline$&=$\ \ \lstinline$^=$\ \ \lstinline$|=$
    2544 \end{syntax}
    2545 
    2546 \rewriterules
    2547 Let ``\(\leftarrow\)'' be any of the assignment operators. Then
    2548 \use{?=?}\use{?*=?}\use{?/=?}\use{?%=?}\use{?+=?}\use{?-=?}
    2549 \use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?}
    2550 \begin{lstlisting}
    2551 a @$\leftarrow$@ b @\rewrite@ ?@$\leftarrow$@?( &( a ), b )
    2552 \end{lstlisting}
    2553 
    2554 \semantics
    2555 Each interpretation of the left operand of an assignment expression is considered separately. For
    2556 each interpretation that is a bit-field or is declared with the \lstinline$register$ storage class
    2557 specifier, the expression has one valid interpretation, with the type of the left operand. The
    2558 right operand is cast to that type, and the assignment expression is ambiguous if either operand is.
    2559 For the remaining interpretations, the expression is rewritten, and the interpretations of the
    2560 assignment expression are the interpretations of the corresponding function call. Finally, all
    2561 interpretations of the expression produced for the different interpretations of the left operand are
    2562 combined to produce the interpretations of the expression as a whole; where interpretations have
    2563 compatible result types, the best interpretations are selected in the manner described for function
    2564 call expressions.
    2565 
    2566 
    2567 \subsubsection{Simple assignment}
    2568 
    2569 \begin{lstlisting}
    2570 _Bool
    2571         ?=?( volatile _Bool *, _Bool ),
    2572         ?=?( volatile _Bool *, forall( dtype D ) D * ),
    2573         ?=?( volatile _Bool *, forall( ftype F ) F * ),
    2574         ?=?( _Atomic volatile _Bool *, _Bool ),
    2575         ?=?( _Atomic volatile _Bool *, forall( dtype D ) D * ),
    2576         ?=?( _Atomic volatile _Bool *, forall( ftype F ) F * );
    2577 char
    2578         ?=?( volatile char *, char ),
    2579         ?=?( _Atomic volatile char *, char );
    2580 unsigned char
    2581         ?=?( volatile unsigned char *, unsigned char ),
    2582         ?=?( _Atomic volatile unsigned char *, unsigned char );
    2583 signed char
    2584         ?=?( volatile signed char *, signed char ),
    2585         ?=?( _Atomic volatile signed char *, signed char );
    2586 short int
    2587         ?=?( volatile short int *, short int ),
    2588         ?=?( _Atomic volatile short int *, short int );
    2589 unsigned short
    2590         ?=?( volatile unsigned int *, unsigned int ),
    2591         ?=?( _Atomic volatile unsigned int *, unsigned int );
    2592 int
    2593         ?=?( volatile int *, int ),
    2594         ?=?( _Atomic volatile int *, int );
    2595 unsigned int
    2596         ?=?( volatile unsigned int *, unsigned int ),
    2597         ?=?( _Atomic volatile unsigned int *, unsigned int );
    2598 long int
    2599         ?=?( volatile long int *, long int ),
    2600         ?=?( _Atomic volatile long int *, long int );
    2601 unsigned long int
    2602         ?=?( volatile unsigned long int *, unsigned long int ),
    2603         ?=?( _Atomic volatile unsigned long int *, unsigned long int );
    2604 long long int
    2605         ?=?( volatile long long int *, long long int ),
    2606         ?=?( _Atomic volatile long long int *, long long int );
    2607 unsigned long long int
    2608         ?=?( volatile unsigned long long int *, unsigned long long int ),
    2609         ?=?( _Atomic volatile unsigned long long int *, unsigned long long int );
    2610 float
    2611         ?=?( volatile float *, float ),
    2612         ?=?( _Atomic volatile float *, float );
    2613 double
    2614         ?=?( volatile double *, double ),
    2615         ?=?( _Atomic volatile double *, double );
    2616 long double
    2617         ?=?( volatile long double *, long double ),
    2618         ?=?( _Atomic volatile long double *, long double );
    2619 _Complex float
    2620         ?=?( volatile float *, float ),
    2621         ?=?( _Atomic volatile float *, float );
    2622 _Complex double
    2623         ?=?( volatile double *, double ),
    2624         ?=?( _Atomic volatile double *, double );
    2625 _Complex long double
    2626         ?=?( volatile _Complex long double *, _Complex long double ),
    2627         ?=?( _Atomic volatile _Complex long double *, _Atomic _Complex long double );
    2628 
    2629 forall( ftype FT ) FT
    2630         * ?=?( FT * volatile *, FT * ),
    2631         * ?=?( FT * volatile *, forall( ftype F ) F * );
    2632 
    2633 forall( ftype FT ) FT const
    2634         * ?=?( FT const * volatile *, FT const * ),
    2635         * ?=?( FT const * volatile *, forall( ftype F ) F * );
    2636 
    2637 forall( ftype FT ) FT volatile
    2638         * ?=?( FT volatile * volatile *, FT * ),
    2639         * ?=?( FT volatile * volatile *, forall( ftype F ) F * );
    2640 
    2641 forall( ftype FT ) FT const
    2642         * ?=?( FT const volatile * volatile *, FT const * ),
    2643         * ?=?( FT const volatile * volatile *, forall( ftype F ) F * );
    2644 
    2645 forall( dtype DT ) DT
    2646         * ?=?( DT * restrict volatile *, DT * ),
    2647         * ?=?( DT * restrict volatile *, void * ),
    2648         * ?=?( DT * restrict volatile *, forall( dtype D ) D * ),
    2649         * ?=?( DT * _Atomic restrict volatile *, DT * ),
    2650         * ?=?( DT * _Atomic restrict volatile *, void * ),
    2651         * ?=?( DT * _Atomic restrict volatile *, forall( dtype D ) D * );
    2652 
    2653 forall( dtype DT ) DT _Atomic
    2654         * ?=?( _Atomic DT * restrict volatile *, DT _Atomic * ),
    2655         * ?=?( _Atomic DT * restrict volatile *, void * ),
    2656         * ?=?( _Atomic DT * restrict volatile *, forall( dtype D ) D * ),
    2657         * ?=?( _Atomic DT * _Atomic restrict volatile *, DT _Atomic * ),
    2658         * ?=?( _Atomic DT * _Atomic restrict volatile *, void * ),
    2659         * ?=?( _Atomic DT * _Atomic restrict volatile *, forall( dtype D ) D * );
    2660 
    2661 forall( dtype DT ) DT const
    2662         * ?=?( DT const * restrict volatile *, DT const * ),
    2663         * ?=?( DT const * restrict volatile *, void const * ),
    2664         * ?=?( DT const * restrict volatile *, forall( dtype D ) D * ),
    2665         * ?=?( DT const * _Atomic restrict volatile *, DT const * ),
    2666         * ?=?( DT const * _Atomic restrict volatile *, void const * ),
    2667         * ?=?( DT const * _Atomic restrict volatile *, forall( dtype D ) D * );
    2668 
    2669 forall( dtype DT ) DT restrict
    2670         * ?=?( restrict DT * restrict volatile *, DT restrict * ),
    2671         * ?=?( restrict DT * restrict volatile *, void * ),
    2672         * ?=?( restrict DT * restrict volatile *, forall( dtype D ) D * ),
    2673         * ?=?( restrict DT * _Atomic restrict volatile *, DT restrict * ),
    2674         * ?=?( restrict DT * _Atomic restrict volatile *, void * ),
    2675         * ?=?( restrict DT * _Atomic restrict volatile *, forall( dtype D ) D * );
    2676 
    2677 forall( dtype DT ) DT volatile
    2678         * ?=?( DT volatile * restrict volatile *, DT volatile * ),
    2679         * ?=?( DT volatile * restrict volatile *, void volatile * ),
    2680         * ?=?( DT volatile * restrict volatile *, forall( dtype D ) D * ),
    2681         * ?=?( DT volatile * _Atomic restrict volatile *, DT volatile * ),
    2682         * ?=?( DT volatile * _Atomic restrict volatile *, void volatile * ),
    2683         * ?=?( DT volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
    2684 
    2685 forall( dtype DT ) DT _Atomic const
    2686         * ?=?( DT _Atomic const * restrict volatile *, DT _Atomic const * ),
    2687         * ?=?( DT _Atomic const * restrict volatile *, void const * ),
    2688         * ?=?( DT _Atomic const * restrict volatile *, forall( dtype D ) D * ),
    2689         * ?=?( DT _Atomic const * _Atomic restrict volatile *, DT _Atomic const * ),
    2690         * ?=?( DT _Atomic const * _Atomic restrict volatile *, void const * ),
    2691         * ?=?( DT _Atomic const * _Atomic restrict volatile *, forall( dtype D ) D * );
    2692 
    2693 forall( dtype DT ) DT _Atomic restrict
    2694         * ?=?( _Atomic restrict DT * restrict volatile *, DT _Atomic restrict * ),
    2695         * ?=?( _Atomic restrict DT * restrict volatile *, void * ),
    2696         * ?=?( _Atomic restrict DT * restrict volatile *, forall( dtype D ) D * ),
    2697         * ?=?( _Atomic restrict DT * _Atomic restrict volatile *, DT _Atomic restrict * ),
    2698         * ?=?( _Atomic restrict DT * _Atomic restrict volatile *, void * ),
    2699         * ?=?( _Atomic restrict DT * _Atomic restrict volatile *, forall( dtype D ) D * );
    2700 
    2701 forall( dtype DT ) DT _Atomic volatile
    2702         * ?=?( DT _Atomic volatile * restrict volatile *, DT _Atomic volatile * ),
    2703         * ?=?( DT _Atomic volatile * restrict volatile *, void volatile * ),
    2704         * ?=?( DT _Atomic volatile * restrict volatile *, forall( dtype D ) D * ),
    2705         * ?=?( DT _Atomic volatile * _Atomic restrict volatile *, DT _Atomic volatile * ),
    2706         * ?=?( DT _Atomic volatile * _Atomic restrict volatile *, void volatile * ),
    2707         * ?=?( DT _Atomic volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
    2708 
    2709 forall( dtype DT ) DT const restrict
    2710         * ?=?( DT const restrict * restrict volatile *, DT const restrict * ),
    2711         * ?=?( DT const restrict * restrict volatile *, void const * ),
    2712         * ?=?( DT const restrict * restrict volatile *, forall( dtype D ) D * ),
    2713         * ?=?( DT const restrict * _Atomic restrict volatile *, DT const restrict * ),
    2714         * ?=?( DT const restrict * _Atomic restrict volatile *, void const * ),
    2715         * ?=?( DT const restrict * _Atomic restrict volatile *, forall( dtype D ) D * );
    2716 
    2717 forall( dtype DT ) DT const volatile
    2718         * ?=?( DT const volatile * restrict volatile *, DT const volatile * ),
    2719         * ?=?( DT const volatile * restrict volatile *, void const volatile * ),
    2720         * ?=?( DT const volatile * restrict volatile *, forall( dtype D ) D * ),
    2721         * ?=?( DT const volatile * _Atomic restrict volatile *, DT const volatile * ),
    2722         * ?=?( DT const volatile * _Atomic restrict volatile *, void const volatile * ),
    2723         * ?=?( DT const volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
    2724 
    2725 forall( dtype DT ) DT restrict volatile
    2726         * ?=?( DT restrict volatile * restrict volatile *, DT restrict volatile * ),
    2727         * ?=?( DT restrict volatile * restrict volatile *, void volatile * ),
    2728         * ?=?( DT restrict volatile * restrict volatile *, forall( dtype D ) D * ),
    2729         * ?=?( DT restrict volatile * _Atomic restrict volatile *, DT restrict volatile * ),
    2730         * ?=?( DT restrict volatile * _Atomic restrict volatile *, void volatile * ),
    2731         * ?=?( DT restrict volatile * _Atomic restrict volatile *, forall( dtype D ) D * );
    2732 
    2733 forall( dtype DT ) DT _Atomic const restrict
    2734         * ?=?( DT _Atomic const restrict * restrict volatile *,
    2735          DT _Atomic const restrict * ),
    2736         * ?=?( DT _Atomic const restrict * restrict volatile *,
    2737          void const * ),
    2738         * ?=?( DT _Atomic const restrict * restrict volatile *,
    2739          forall( dtype D ) D * ),
    2740         * ?=?( DT _Atomic const restrict * _Atomic restrict volatile *,
    2741          DT _Atomic const restrict * ),
    2742         * ?=?( DT _Atomic const restrict * _Atomic restrict volatile *,
    2743          void const * ),
    2744         * ?=?( DT _Atomic const restrict * _Atomic restrict volatile *,
    2745          forall( dtype D ) D * );
    2746 
    2747 forall( dtype DT ) DT _Atomic const volatile
    2748         * ?=?( DT _Atomic const volatile * restrict volatile *,
    2749          DT _Atomic const volatile * ),
    2750         * ?=?( DT _Atomic const volatile * restrict volatile *,
    2751          void const volatile * ),
    2752         * ?=?( DT _Atomic const volatile * restrict volatile *,
    2753          forall( dtype D ) D * ),
    2754         * ?=?( DT _Atomic const volatile * _Atomic restrict volatile *,
    2755          DT _Atomic const volatile * ),
    2756         * ?=?( DT _Atomic const volatile * _Atomic restrict volatile *,
    2757          void const volatile * ),
    2758         * ?=?( DT _Atomic const volatile * _Atomic restrict volatile *,
    2759          forall( dtype D ) D * );
    2760 
    2761 forall( dtype DT ) DT _Atomic restrict volatile
    2762         * ?=?( DT _Atomic restrict volatile * restrict volatile *,
    2763          DT _Atomic restrict volatile * ),
    2764         * ?=?( DT _Atomic restrict volatile * restrict volatile *,
    2765          void volatile * ),
    2766         * ?=?( DT _Atomic restrict volatile * restrict volatile *,
    2767          forall( dtype D ) D * ),
    2768         * ?=?( DT _Atomic restrict volatile * _Atomic restrict volatile *,
    2769          DT _Atomic restrict volatile * ),
    2770         * ?=?( DT _Atomic restrict volatile * _Atomic restrict volatile *,
    2771          void volatile * ),
    2772         * ?=?( DT _Atomic restrict volatile * _Atomic restrict volatile *,
    2773          forall( dtype D ) D * );
    2774 
    2775 forall( dtype DT ) DT const restrict volatile
    2776         * ?=?( DT const restrict volatile * restrict volatile *,
    2777          DT const restrict volatile * ),
    2778         * ?=?( DT const restrict volatile * restrict volatile *,
    2779          void const volatile * ),
    2780         * ?=?( DT const restrict volatile * restrict volatile *,
    2781          forall( dtype D ) D * ),
    2782         * ?=?( DT const restrict volatile * _Atomic restrict volatile *,
    2783          DT const restrict volatile * ),
    2784         * ?=?( DT const restrict volatile * _Atomic restrict volatile *,
    2785          void const volatile * ),
    2786         * ?=?( DT const restrict volatile * _Atomic restrict volatile *,
    2787          forall( dtype D ) D * );
    2788 
    2789 forall( dtype DT ) DT _Atomic const restrict volatile
    2790         * ?=?( DT _Atomic const restrict volatile * restrict volatile *,
    2791          DT _Atomic const restrict volatile * ),
    2792         * ?=?( DT _Atomic const restrict volatile * restrict volatile *,
    2793          void const volatile * ),
    2794         * ?=?( DT _Atomic const restrict volatile * restrict volatile *,
    2795          forall( dtype D ) D * ),
    2796         * ?=?( DT _Atomic const restrict volatile * _Atomic restrict volatile *,
    2797          DT _Atomic const restrict volatile * ),
    2798         * ?=?( DT _Atomic const restrict volatile * _Atomic restrict volatile *,
    2799          void const volatile * ),
    2800         * ?=?( DT _Atomic const restrict volatile * _Atomic restrict volatile *,
    2801          forall( dtype D ) D * );
    2802 
    2803 forall( dtype DT ) void
    2804         * ?=?( void * restrict volatile *, DT * );
    2805 
    2806 forall( dtype DT ) void const
    2807         * ?=?( void const * restrict volatile *, DT const * );
    2808 
    2809 forall( dtype DT ) void volatile
    2810         * ?=?( void volatile * restrict volatile *, DT volatile * );
    2811 
    2812 forall( dtype DT ) void const volatile
    2813         * ?=?( void const volatile * restrict volatile *, DT const volatile * );
    2814 \end{lstlisting}
    2815 \begin{rationale}
    2816 The pattern of overloadings for simple assignment resembles that of pointer increment and decrement,
    2817 except that the polymorphic pointer assignment functions declare a \lstinline$dtype$ parameter,
    2818 instead of a \lstinline$type$ parameter, because the left operand may be a pointer to an incomplete
    2819 type.
    2820 \end{rationale}
    2821 
    2822 For every complete structure or union type \lstinline$S$ there exist
    2823 % Don't use predefined: keep this out of prelude.cf.
    2824 \begin{lstlisting}
    2825 S ?=?( S volatile *, S ), ?=?( S _Atomic volatile *, S );
    2826 \end{lstlisting}
    2827 
    2828 For every extended integer type \lstinline$X$ there exist
    2829 % Don't use predefined: keep this out of prelude.cf.
    2830 \begin{lstlisting}
    2831 X ?=?( X volatile *, X ), ?=?( X _Atomic volatile *, X );
    2832 \end{lstlisting}
    2833 
    2834 For every complete enumerated type \lstinline$E$ there exist
    2835 % Don't use predefined: keep this out of prelude.cf.
    2836 \begin{lstlisting}
    2837 E ?=?( E volatile *, int ), ?=?( E _Atomic volatile *, int );
    2838 \end{lstlisting}
    2839 \begin{rationale}
    2840 The right-hand argument is \lstinline$int$ because enumeration constants have type \lstinline$int$.
    2841 \end{rationale}
    2842 
    2843 \semantics
    2844 The structure assignment functions provide member-wise assignment; each non-array member and each
    2845 element of each array member of the right argument is assigned to the corresponding member or
    2846 element of the left argument using the assignment function defined for its type. All other
    2847 assignment functions have the same effect as the corresponding C assignment expression.
    2848 \begin{rationale}
    2849 Note that, by default, union assignment\index{deficiencies!union assignment} uses C semantics---that
    2850 is, bitwise copy---even if some of the union members have programmer-defined assignment functions.
    2851 \end{rationale}
    2852 
    2853 
    2854 \subsubsection{Compound assignment}
    2855 
    2856 \begin{lstlisting}
    2857 forall( type T ) T
    2858         * ?+=?( T * restrict volatile *, ptrdiff_t ),
    2859         * ?-=?( T * restrict volatile *, ptrdiff_t ),
    2860         * ?+=?( T * _Atomic restrict volatile *, ptrdiff_t ),
    2861         * ?-=?( T * _Atomic restrict volatile *, ptrdiff_t );
    2862 
    2863 forall( type T ) T _Atomic
    2864         * ?+=?( T _Atomic * restrict volatile *, ptrdiff_t ),
    2865         * ?-=?( T _Atomic * restrict volatile *, ptrdiff_t ),
    2866         * ?+=?( T _Atomic * _Atomic restrict volatile *, ptrdiff_t ),
    2867         * ?-=?( T _Atomic * _Atomic restrict volatile *, ptrdiff_t );
    2868 
    2869 forall( type T ) T const
    2870         * ?+=?( T const * restrict volatile *, ptrdiff_t ),
    2871         * ?-=?( T const * restrict volatile *, ptrdiff_t ),
    2872         * ?+=?( T const * _Atomic restrict volatile *, ptrdiff_t ),
    2873         * ?-=?( T const * _Atomic restrict volatile *, ptrdiff_t );
    2874 
    2875 forall( type T ) T restrict
    2876         * ?+=?( T restrict * restrict volatile *, ptrdiff_t ),
    2877         * ?-=?( T restrict * restrict volatile *, ptrdiff_t ),
    2878         * ?+=?( T restrict * _Atomic restrict volatile *, ptrdiff_t ),
    2879         * ?-=?( T restrict * _Atomic restrict volatile *, ptrdiff_t );
    2880 
    2881 forall( type T ) T volatile
    2882         * ?+=?( T volatile * restrict volatile *, ptrdiff_t ),
    2883         * ?-=?( T volatile * restrict volatile *, ptrdiff_t ),
    2884         * ?+=?( T volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2885         * ?-=?( T volatile * _Atomic restrict volatile *, ptrdiff_t );
    2886 
    2887 forall( type T ) T _Atomic const
    2888         * ?+=?( T _Atomic const restrict volatile *, ptrdiff_t ),
    2889         * ?-=?( T _Atomic const restrict volatile *, ptrdiff_t ),
    2890         * ?+=?( T _Atomic const _Atomic restrict volatile *, ptrdiff_t ),
    2891         * ?-=?( T _Atomic const _Atomic restrict volatile *, ptrdiff_t );
    2892 
    2893 forall( type T ) T _Atomic restrict
    2894         * ?+=?( T _Atomic restrict * restrict volatile *, ptrdiff_t ),
    2895         * ?-=?( T _Atomic restrict * restrict volatile *, ptrdiff_t ),
    2896         * ?+=?( T _Atomic restrict * _Atomic restrict volatile *, ptrdiff_t ),
    2897         * ?-=?( T _Atomic restrict * _Atomic restrict volatile *, ptrdiff_t );
    2898 
    2899 forall( type T ) T _Atomic volatile
    2900         * ?+=?( T _Atomic volatile * restrict volatile *, ptrdiff_t ),
    2901         * ?-=?( T _Atomic volatile * restrict volatile *, ptrdiff_t ),
    2902         * ?+=?( T _Atomic volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2903         * ?-=?( T _Atomic volatile * _Atomic restrict volatile *, ptrdiff_t );
    2904 
    2905 forall( type T ) T const restrict
    2906         * ?+=?( T const restrict * restrict volatile *, ptrdiff_t ),
    2907         * ?-=?( T const restrict * restrict volatile *, ptrdiff_t ),
    2908         * ?+=?( T const restrict * _Atomic restrict volatile *, ptrdiff_t ),
    2909         * ?-=?( T const restrict * _Atomic restrict volatile *, ptrdiff_t );
    2910 
    2911 forall( type T ) T const volatile
    2912         * ?+=?( T const volatile * restrict volatile *, ptrdiff_t ),
    2913         * ?-=?( T const volatile * restrict volatile *, ptrdiff_t ),
    2914         * ?+=?( T const volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2915         * ?-=?( T const volatile * _Atomic restrict volatile *, ptrdiff_t );
    2916 
    2917 forall( type T ) T restrict volatile
    2918         * ?+=?( T restrict volatile * restrict volatile *, ptrdiff_t ),
    2919         * ?-=?( T restrict volatile * restrict volatile *, ptrdiff_t ),
    2920         * ?+=?( T restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2921         * ?-=?( T restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
    2922 
    2923 forall( type T ) T _Atomic const restrict
    2924         * ?+=?( T _Atomic const restrict * restrict volatile *, ptrdiff_t ),
    2925         * ?-=?( T _Atomic const restrict * restrict volatile *, ptrdiff_t ),
    2926         * ?+=?( T _Atomic const restrict * _Atomic restrict volatile *, ptrdiff_t ),
    2927         * ?-=?( T _Atomic const restrict * _Atomic restrict volatile *, ptrdiff_t );
    2928 
    2929 forall( type T ) T _Atomic const volatile
    2930         * ?+=?( T _Atomic const volatile * restrict volatile *, ptrdiff_t ),
    2931         * ?-=?( T _Atomic const volatile * restrict volatile *, ptrdiff_t ),
    2932         * ?+=?( T _Atomic const volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2933         * ?-=?( T _Atomic const volatile * _Atomic restrict volatile *, ptrdiff_t );
    2934 
    2935 forall( type T ) T _Atomic restrict volatile
    2936         * ?+=?( T _Atomic restrict volatile * restrict volatile *, ptrdiff_t ),
    2937         * ?-=?( T _Atomic restrict volatile * restrict volatile *, ptrdiff_t ),
    2938         * ?+=?( T _Atomic restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2939         * ?-=?( T _Atomic restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
    2940 
    2941 forall( type T ) T const restrict volatile
    2942         * ?+=?( T const restrict volatile * restrict volatile *, ptrdiff_t ),
    2943         * ?-=?( T const restrict volatile * restrict volatile *, ptrdiff_t ),
    2944         * ?+=?( T const restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2945         * ?-=?( T const restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
    2946 
    2947 forall( type T ) T _Atomic const restrict volatile
    2948         * ?+=?( T _Atomic const restrict volatile * restrict volatile *, ptrdiff_t ),
    2949         * ?-=?( T _Atomic const restrict volatile * restrict volatile *, ptrdiff_t ),
    2950         * ?+=?( T _Atomic const restrict volatile * _Atomic restrict volatile *, ptrdiff_t ),
    2951         * ?-=?( T _Atomic const restrict volatile * _Atomic restrict volatile *, ptrdiff_t );
    2952 
    2953 _Bool
    2954         ?*=?( _Bool volatile *, _Bool ),
    2955         ?/=?( _Bool volatile *, _Bool ),
    2956         ?+=?( _Bool volatile *, _Bool ),
    2957         ?-=?( _Bool volatile *, _Bool ),
    2958         ?%=?( _Bool volatile *, _Bool ),
    2959         ?<<=?( _Bool volatile *, int ),
    2960         ?>>=?( _Bool volatile *, int ),
    2961         ?&=?( _Bool volatile *, _Bool ),
    2962         ?^=?( _Bool volatile *, _Bool ),
    2963         ?|=?( _Bool volatile *, _Bool );
    2964 char
    2965         ?*=?( char volatile *, char ),
    2966         ?/=?( char volatile *, char ),
    2967         ?+=?( char volatile *, char ),
    2968         ?-=?( char volatile *, char ),
    2969         ?%=?( char volatile *, char ),
    2970         ?<<=?( char volatile *, int ),
    2971         ?>>=?( char volatile *, int ),
    2972         ?&=?( char volatile *, char ),
    2973         ?^=?( char volatile *, char ),
    2974         ?|=?( char volatile *, char );
    2975 unsigned char
    2976         ?*=?( unsigned char volatile *, unsigned char ),
    2977         ?/=?( unsigned char volatile *, unsigned char ),
    2978         ?+=?( unsigned char volatile *, unsigned char ),
    2979         ?-=?( unsigned char volatile *, unsigned char ),
    2980         ?%=?( unsigned char volatile *, unsigned char ),
    2981         ?<<=?( unsigned char volatile *, int ),
    2982         ?>>=?( unsigned char volatile *, int ),
    2983         ?&=?( unsigned char volatile *, unsigned char ),
    2984         ?^=?( unsigned char volatile *, unsigned char ),
    2985         ?|=?( unsigned char volatile *, unsigned char );
    2986 signed char
    2987         ?*=?( signed char volatile *, signed char ),
    2988         ?/=?( signed char volatile *, signed char ),
    2989         ?+=?( signed char volatile *, signed char ),
    2990         ?-=?( signed char volatile *, signed char ),
    2991         ?%=?( signed char volatile *, signed char ),
    2992         ?<<=?( signed char volatile *, int ),
    2993         ?>>=?( signed char volatile *, int ),
    2994         ?&=?( signed char volatile *, signed char ),
    2995         ?^=?( signed char volatile *, signed char ),
    2996         ?|=?( signed char volatile *, signed char );
    2997 short int
    2998         ?*=?( short int volatile *, short int ),
    2999         ?/=?( short int volatile *, short int ),
    3000         ?+=?( short int volatile *, short int ),
    3001         ?-=?( short int volatile *, short int ),
    3002         ?%=?( short int volatile *, short int ),
    3003         ?<<=?( short int volatile *, int ),
    3004         ?>>=?( short int volatile *, int ),
    3005         ?&=?( short int volatile *, short int ),
    3006         ?^=?( short int volatile *, short int ),
    3007         ?|=?( short int volatile *, short int );
    3008 unsigned short int
    3009         ?*=?( unsigned short int volatile *, unsigned short int ),
    3010         ?/=?( unsigned short int volatile *, unsigned short int ),
    3011         ?+=?( unsigned short int volatile *, unsigned short int ),
    3012         ?-=?( unsigned short int volatile *, unsigned short int ),
    3013         ?%=?( unsigned short int volatile *, unsigned short int ),
    3014         ?<<=?( unsigned short int volatile *, int ),
    3015         ?>>=?( unsigned short int volatile *, int ),
    3016         ?&=?( unsigned short int volatile *, unsigned short int ),
    3017         ?^=?( unsigned short int volatile *, unsigned short int ),
    3018         ?|=?( unsigned short int volatile *, unsigned short int );
    3019 int
    3020         ?*=?( int volatile *, int ),
    3021         ?/=?( int volatile *, int ),
    3022         ?+=?( int volatile *, int ),
    3023         ?-=?( int volatile *, int ),
    3024         ?%=?( int volatile *, int ),
    3025         ?<<=?( int volatile *, int ),
    3026         ?>>=?( int volatile *, int ),
    3027         ?&=?( int volatile *, int ),
    3028         ?^=?( int volatile *, int ),
    3029         ?|=?( int volatile *, int );
    3030 unsigned int
    3031         ?*=?( unsigned int volatile *, unsigned int ),
    3032         ?/=?( unsigned int volatile *, unsigned int ),
    3033         ?+=?( unsigned int volatile *, unsigned int ),
    3034         ?-=?( unsigned int volatile *, unsigned int ),
    3035         ?%=?( unsigned int volatile *, unsigned int ),
    3036         ?<<=?( unsigned int volatile *, int ),
    3037         ?>>=?( unsigned int volatile *, int ),
    3038         ?&=?( unsigned int volatile *, unsigned int ),
    3039         ?^=?( unsigned int volatile *, unsigned int ),
    3040         ?|=?( unsigned int volatile *, unsigned int );
    3041 long int
    3042         ?*=?( long int volatile *, long int ),
    3043         ?/=?( long int volatile *, long int ),
    3044         ?+=?( long int volatile *, long int ),
    3045         ?-=?( long int volatile *, long int ),
    3046         ?%=?( long int volatile *, long int ),
    3047         ?<<=?( long int volatile *, int ),
    3048         ?>>=?( long int volatile *, int ),
    3049         ?&=?( long int volatile *, long int ),
    3050         ?^=?( long int volatile *, long int ),
    3051         ?|=?( long int volatile *, long int );
    3052 unsigned long int
    3053         ?*=?( unsigned long int volatile *, unsigned long int ),
    3054         ?/=?( unsigned long int volatile *, unsigned long int ),
    3055         ?+=?( unsigned long int volatile *, unsigned long int ),
    3056         ?-=?( unsigned long int volatile *, unsigned long int ),
    3057         ?%=?( unsigned long int volatile *, unsigned long int ),
    3058         ?<<=?( unsigned long int volatile *, int ),
    3059         ?>>=?( unsigned long int volatile *, int ),
    3060         ?&=?( unsigned long int volatile *, unsigned long int ),
    3061         ?^=?( unsigned long int volatile *, unsigned long int ),
    3062         ?|=?( unsigned long int volatile *, unsigned long int );
    3063 long long int
    3064         ?*=?( long long int volatile *, long long int ),
    3065         ?/=?( long long int volatile *, long long int ),
    3066         ?+=?( long long int volatile *, long long int ),
    3067         ?-=?( long long int volatile *, long long int ),
    3068         ?%=?( long long int volatile *, long long int ),
    3069         ?<<=?( long long int volatile *, int ),
    3070         ?>>=?( long long int volatile *, int ),
    3071         ?&=?( long long int volatile *, long long int ),
    3072         ?^=?( long long int volatile *, long long int ),
    3073         ?|=?( long long int volatile *, long long int );
    3074 unsigned long long int
    3075         ?*=?( unsigned long long int volatile *, unsigned long long int ),
    3076         ?/=?( unsigned long long int volatile *, unsigned long long int ),
    3077         ?+=?( unsigned long long int volatile *, unsigned long long int ),
    3078         ?-=?( unsigned long long int volatile *, unsigned long long int ),
    3079         ?%=?( unsigned long long int volatile *, unsigned long long int ),
    3080         ?<<=?( unsigned long long int volatile *, int ),
    3081         ?>>=?( unsigned long long int volatile *, int ),
    3082         ?&=?( unsigned long long int volatile *, unsigned long long int ),
    3083         ?^=?( unsigned long long int volatile *, unsigned long long int ),
    3084         ?|=?( unsigned long long int volatile *, unsigned long long int );
    3085 float
    3086         ?*=?( float volatile *, float ),
    3087         ?/=?( float volatile *, float ),
    3088         ?+=?( float volatile *, float ),
    3089         ?-=?( float volatile *, float );
    3090 double
    3091         ?*=?( double volatile *, double ),
    3092         ?/=?( double volatile *, double ),
    3093         ?+=?( double volatile *, double ),
    3094         ?-=?( double volatile *, double );
    3095 long double
    3096         ?*=?( long double volatile *, long double ),
    3097         ?/=?( long double volatile *, long double ),
    3098         ?+=?( long double volatile *, long double ),
    3099         ?-=?( long double volatile *, long double );
    3100 _Complex float
    3101         ?*=?( _Complex float volatile *, _Complex float ),
    3102         ?/=?( _Complex float volatile *, _Complex float ),
    3103         ?+=?( _Complex float volatile *, _Complex float ),
    3104         ?-=?( _Complex float volatile *, _Complex float );
    3105 _Complex double
    3106         ?*=?( _Complex double volatile *, _Complex double ),
    3107         ?/=?( _Complex double volatile *, _Complex double ),
    3108         ?+=?( _Complex double volatile *, _Complex double ),
    3109         ?-=?( _Complex double volatile *, _Complex double );
    3110 _Complex long double
    3111         ?*=?( _Complex long double volatile *, _Complex long double ),
    3112         ?/=?( _Complex long double volatile *, _Complex long double ),
    3113         ?+=?( _Complex long double volatile *, _Complex long double ),
    3114         ?-=?( _Complex long double volatile *, _Complex long double );
    3115 \end{lstlisting}
    3116 
    3117 For every extended integer type \lstinline$X$ there exist
    3118 % Don't use predefined: keep this out of prelude.cf.
    3119 \begin{lstlisting}
    3120 ?*=?( X volatile *, X ),
    3121 ?/=?( X volatile *, X ),
    3122 ?+=?( X volatile *, X ),
    3123 ?-=?( X volatile *, X ),
    3124 ?%=?( X volatile *, X ),
    3125 ?<<=?( X volatile *, int ),
    3126 ?>>=?( X volatile *, int ),
    3127 ?&=?( X volatile *, X ),
    3128 ?^=?( X volatile *, X ),
    3129 ?|=?( X volatile *, X );
    3130 \end{lstlisting}
    3131 
    3132 For every complete enumerated type \lstinline$E$ there exist
    3133 % Don't use predefined: keep this out of prelude.cf.
    3134 \begin{lstlisting}
    3135 ?*=?( E volatile *, E ),
    3136 ?/=?( E volatile *, E ),
    3137 ?+=?( E volatile *, E ),
    3138 ?-=?( E volatile *, E ),
    3139 ?%=?( E volatile *, E ),
    3140 ?<<=?( E volatile *, int ),
    3141 ?>>=?( E volatile *, int ),
    3142 ?&=?( E volatile *, E ),
    3143 ?^=?( E volatile *, E ),
    3144 ?|=?( E volatile *, E );
    3145 \end{lstlisting}
    3146 
    3147 
    3148 \subsection{Comma operator}
    3149 
    3150 \begin{syntax}
    3151 \lhs{expression}
    3152 \rhs \nonterm{assignment-expression}
    3153 \rhs \nonterm{expression} \lstinline$,$ \nonterm{assignment-expression}
    3154 \end{syntax}
    3155 
    3156 \semantics
    3157 In the comma expression ``\lstinline$a, b$'', the first operand is interpreted as
    3158 ``\lstinline$( void )(a)$'', which shall be unambiguous\index{ambiguous interpretation}. The
    3159 interpretations of the expression are the interpretations of the second operand.
    3160 
    3161 
    3162 \section{Constant expressions}
    3163 
    3164 
    3165 \section{Declarations}
    3166 
    3167 \begin{syntax}
    3168 \oldlhs{declaration}
    3169 \rhs \nonterm{type-declaration}
    3170 \rhs \nonterm{spec-definition}
    3171 \end{syntax}
    3172 
    3173 \constraints
    3174 If an identifier has no linkage\index{no linkage}, there shall be no more than one declaration of
    3175 the identifier ( in a declarator or type specifier ) with compatible types in the same scope and in
    3176 the same name space, except that:
    3177 \begin{itemize}
    3178 \item
    3179 a typedef name may be redefined to denote the same type as it currently does, provided that type is
    3180 not a variably modified type;
    3181 \item
    3182 tags may be redeclared as specified in section 6.7.2.3 of the {\c11} standard.
    3183 \end{itemize}
    3184 \begin{rationale}
    3185 This constraint adds the phrase ``with compatible types'' to the {\c11} constraint, to allow
    3186 overloading.
    3187 \end{rationale}
    3188 
    3189 An identifier declared by a type declaration shall not be redeclared as a parameter in a function
    3190 definition whose declarator includes an identifier list.
    3191 \begin{rationale}
    3192 This restriction echos {\c11}'s ban on the redeclaration of typedef names as parameters. This
    3193 avoids an ambiguity between old-style function declarations and new-style function prototypes:
    3194 \begin{lstlisting}
    3195 void f( Complex,        // ... 3000 characters ...
    3196 void g( Complex,        // ... 3000 characters ...
    3197 int Complex; { ... }
    3198 \end{lstlisting}
    3199 Without the rule, \lstinline$Complex$ would be a type in the first case, and a parameter name in the
    3200 second.
    3201 \end{rationale}
    3202 
    3203 
    3204 \setcounter{subsection}{1}
    3205 \subsection{Type specifiers}
    3206 
    3207 \begin{syntax}
    3208 \oldlhs{type-specifier}
    3209 \rhs \nonterm{forall-specifier}
    3210 \end{syntax}
    3211 
    3212 \semantics
    3213 Forall specifiers are discussed in \VRef{forall}.
    3214 
    3215 
    3216 \subsubsection{Structure and union specifiers}
    3217 
    3218 \semantics
    3219 \CFA extends the {\c11} definition of \define{anonymous structure} to include structure
    3220 specifiers with tags, and extends the {\c11} definition of \define{anonymous union} to include union
    3221 specifiers with tags.
    3222 \begin{rationale}
    3223 This extension imitates an extension in the Plan 9 C compiler \cite{Thompson90new}.
    3224 \end{rationale}
    3225 
    3226 \examples
    3227 \begin{lstlisting}
    3228 struct point {@\impl{point}@
    3229         int x, y;
    3230 };
    3231 struct color_point {@\impl{color_point}@
    3232         enum { RED, BLUE, GREEN } color;
    3233         struct point;
    3234 };
    3235 struct color_point cp;
    3236 cp.x = 0;
    3237 cp.color = RED;
    3238 
    3239 struct literal {@\impl{literal}@
    3240         enum { NUMBER, STRING } tag;
    3241         union {
    3242          double n;
    3243          char *s;
    3244         };
    3245 };
    3246 struct literal *next;
    3247 int length;
    3248 extern int strlen( const char * );
    3249 ...
    3250 if ( next->tag == STRING ) length = strlen( next->s );
    3251 \end{lstlisting}
    3252 
    3253 
    3254 \setcounter{subsubsection}{4}
    3255 \subsubsection{Forall specifiers}\label{forall}
    3256 
    3257 \begin{syntax}
    3258 \lhs{forall-specifier}
    3259 \rhs \lstinline$forall$ \lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
    3260 \end{syntax}
    3261 
    3262 \constraints
    3263 If the \nonterm{declaration-specifiers} of a declaration that contains a \nonterm{forall-specifier}
    3264 declares a structure or union tag, the types of the members of the structure or union shall not use
    3265 any of the type identifiers declared by the \nonterm{type-parameter-list}.
    3266 \begin{rationale}
    3267 This sort of declaration is illegal because the scope of the type identifiers ends at the end of the
    3268 declaration, but the scope of the structure tag does not.
    3269 \begin{lstlisting}
    3270 forall( type T ) struct Pair { T a, b; } mkPair( T, T ); // illegal
    3271 \end{lstlisting}
    3272 If an instance of \lstinline$struct Pair$ was declared later in the current scope, what would the
    3273 members' type be?
    3274 \end{rationale}
    3275 
    3276 \semantics
    3277 The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type
    3278 identifiers, function and object identifiers with no linkage\index{no linkage}.
    3279 
    3280 If, in the declaration ``\lstinline$T D1$'', \lstinline$T$ contains \nonterm{forall-specifier}s and
    3281 \lstinline$D1$ has the form
    3282 \begin{lstlisting}
    3283 D( @\normalsize\nonterm{parameter-type-list}@ )
    3284 \end{lstlisting}
    3285 then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred
    3286  parameter} of the function declarator if and only if it is not an inferred parameter of a function
    3287 declarator in \lstinline$D$, and it is used in the type of a parameter in the following
    3288 \nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a
    3289 specification\index{specification} in one of the \nonterm{forall-specifier}s. The identifiers
    3290 declared by assertions that use an inferred parameter of a function declarator are assertion
    3291 parameters\index{assertion parameters} of that function declarator.
    3292 \begin{rationale}
    3293 Since every inferred parameter is used by some parameter, inference can be understood as a single
    3294 bottom-up pass over the expression tree, that only needs to apply local reasoning at each node.
    3295 
    3296 If this restriction were lifted, it would be possible to write
    3297 \begin{lstlisting}
    3298 forall( type T ) T * alloc( void );@\use{alloc}@
    3299 int *p = alloc();
    3300 \end{lstlisting}
    3301 Here \lstinline$alloc()$ would receive \lstinline$int$ as an inferred argument, and return an
    3302 \lstinline$int *$. In general, if a call to \lstinline$alloc()$ is a subexpression of an expression
    3303 involving polymorphic functions and overloaded identifiers, there could be considerable distance
    3304 between the call and the subexpression that causes \lstinline$T$ to be bound.
    3305 
    3306 With the current restriction, \lstinline$alloc()$ must be given an argument that determines
    3307 \lstinline$T$:
    3308 \begin{lstlisting}
    3309 forall( type T ) T * alloc( T initial_value );@\use{alloc}@
    3310 \end{lstlisting}
    3311 \end{rationale}
    3312 
    3313 If a function declarator is part of a function definition, its inferred parameters and assertion
    3314 parameters have block scope\index{block scope}; otherwise, identifiers declared by assertions have a
    3315 \define{declaration scope}, which terminates at the end of the \nonterm{declaration}.
    3316 
    3317 A function type that has at least one inferred parameter is a \define{polymorphic function} type.
    3318 Function types with no inferred parameters are \define{monomorphic function} types. One function
    3319 type is \define{less polymorphic} than another if it has fewer inferred parameters, or if it has the
    3320 same number of inferred parameters and fewer of its explicit parameters have types that depend on an
    3321 inferred parameter.
    3322 
    3323 The names of inferred parameters and the order of identifiers in forall specifiers are not relevant
    3324 to polymorphic function type compatibility. Let $f$ and $g$ be two polymorphic function types with
    3325 the same number of inferred parameters, and let $f_i$ and $g_i$ be the inferred parameters of $f$
    3326 and $g$ in their order of occurance in the function types' \nonterm{parameter-type-list}s. Let $f'$
    3327 be $f$ with every occurrence of $f_i$ replaced by $g_i$, for all $i$. Then $f$ and $g$ are
    3328 compatible types\index{compatible type} if $f'$'s and $g$'s return types and parameter lists are
    3329 compatible, and if for every assertion parameter of $f'$ there is an assertion parameter in $g$ with
    3330 the same identifier and compatible type, and vice versa.
    3331 
    3332 \examples
    3333 Consider these analogous monomorphic and polymorphic declarations.
    3334 \begin{lstlisting}
    3335 int fi( int );
    3336 forall( type T ) T fT( T );
    3337 \end{lstlisting}
    3338 \lstinline$fi()$ takes an \lstinline$int$ and returns an \lstinline$int$. \lstinline$fT()$ takes a
    3339 \lstinline$T$ and returns a \lstinline$T$, for any type \lstinline$T$.
    3340 \begin{lstlisting}
    3341 int (*pfi )( int ) = fi;
    3342 forall( type T ) T (*pfT )( T ) = fT;
    3343 \end{lstlisting}
    3344 \lstinline$pfi$ and \lstinline$pfT$ are pointers to functions. \lstinline$pfT$ is not
    3345 polymorphic, but the function it points at is.
    3346 \begin{lstlisting}
    3347 int (*fvpfi( void ))( int ) {
    3348         return pfi;
    3349 }
    3350 forall( type T ) T (*fvpfT( void ))( T ) {
    3351         return pfT;
    3352 }
    3353 \end{lstlisting}
    3354 \lstinline$fvpfi()$ and \lstinline$fvpfT()$ are functions taking no arguments and returning pointers
    3355 to functions. \lstinline$fvpfT()$ is monomorphic, but the function that its return value points
    3356 at is polymorphic.
    3357 \begin{lstlisting}
    3358 forall( type T ) int ( *fTpfi( T ) )( int );
    3359 forall( type T ) T ( *fTpfT( T ) )( T );
    3360 forall( type T, type U ) U ( *fTpfU( T ) )( U );
    3361 \end{lstlisting}
    3362 \lstinline$fTpfi()$ is a polymorphic function that returns a pointer to a monomorphic function
    3363 taking an integer and returning an integer. It could return \lstinline$pfi$. \lstinline$fTpfT()$
    3364 is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning
    3365 \lstinline$T$, where \lstinline$T$ is an inferred parameter of \lstinline$fTpfT()$. For instance,
    3366 in the expression ``\lstinline$fTpfT(17)$'', \lstinline$T$ is inferred to be \lstinline$int$, and
    3367 the returned value would have type \lstinline$int ( * )( int )$. ``\lstinline$fTpfT(17)(13)$'' and
    3368 ``\lstinline$fTpfT("yes")("no")$'' are legal, but ``\lstinline$fTpfT(17)("no")$'' is illegal.
    3369 \lstinline$fTpfU()$ is polymorphic ( in type \lstinline$T$), and returns a pointer to a function that
    3370 is polymorphic ( in type \lstinline$U$). ``\lstinline$f5(17)("no")$'' is a legal expression of type
    3371 \lstinline$char *$.
    3372 \begin{lstlisting}
    3373 forall( type T, type U, type V ) U * f( T *, U, V * const );
    3374 forall( type U, type V, type W ) U * g( V *, U, W * const );
    3375 \end{lstlisting}
    3376 The functions \lstinline$f()$ and \lstinline$g()$ have compatible types. Let \(f\) and \(g\) be
    3377 their types; then \(f_1\) = \lstinline$T$, \(f_2\) = \lstinline$U$, \(f_3\) = \lstinline$V$, \(g_1\)
    3378 = \lstinline$V$, \(g_2\) = \lstinline$U$, and \(g_3\) = \lstinline$W$. Replacing every \(f_i\)
    3379 by \(g_i\) in \(f\) gives
    3380 \begin{lstlisting}
    3381 forall( type V, type U, type W ) U * f( V *, U, W * const );
    3382 \end{lstlisting}
    3383 which has a return type and parameter list that is compatible with \(g\).
    3384 \begin{rationale}
    3385 The word ``\lstinline$type$'' in a forall specifier is redundant at the moment, but I want to leave
    3386 room for inferred parameters of ordinary types in case parameterized types get added one day.
    3387 
    3388 Even without parameterized types, I might try to allow
    3389 \begin{lstlisting}
    3390 forall( int n ) int sum( int vector[n] );
    3391 \end{lstlisting}
    3392 but C currently rewrites array parameters as pointer parameters, so the effects of such a change
    3393 require more thought.
    3394 \end{rationale}
    3395 
    3396 \begin{rationale}
    3397 A polymorphic declaration must do two things: it must introduce type parameters, and it must apply
    3398 assertions to those types. Adding this to existing C declaration syntax and semantics was delicate,
    3399 and not entirely successful.
    3400 
    3401 C depends on declaration-before-use, so a forall specifier must introduce type names before they can
    3402 be used in the declaration specifiers. This could be done by making the forall specifier part of
    3403 the declaration specifiers, or by making it a new introductory clause of declarations.
    3404 
    3405 Assertions are also part of polymorphic function types, because it must be clear which functions
    3406 have access to the assertion parameters declared by the assertions. All attempts to put assertions
    3407 inside an introductory clause produced complex semantics and confusing code. Building them into the
    3408 declaration specifiers could be done by placing them in the function's parameter list, or in a
    3409 forall specifier that is a declaration specifier. Assertions are also used with type parameters of
    3410 specifications, and by type declarations. For consistency's sake it seems best to attach assertions
    3411 to the type declarations in forall specifiers, which means that forall specifiers must be
    3412 declaration specifiers.
    3413 \end{rationale}
    3414 %HERE
    3415 
    3416 
    3417 \subsection{Type qualifiers}
    3418 
    3419 \CFA defines a new type qualifier \lstinline$lvalue$\impl{lvalue}\index{lvalue}.
    3420 \begin{syntax}
    3421 \oldlhs{type-qualifier}
    3422 \rhs \lstinline$lvalue$
    3423 \end{syntax}
    3424 
    3425 \constraints
    3426 \lstinline$restrict$\index{register@{\lstinline$restrict$}} Types other than type parameters and
    3427 pointer types whose referenced type is an object type shall not be restrict-qualified.
    3428 
    3429 \semantics
    3430 An object's type may be a restrict-qualified type parameter. \lstinline$restrict$ does not
    3431 establish any special semantics in that case.
    3432 
    3433 \begin{rationale}
    3434 \CFA loosens the constraint on the restrict qualifier so that restrict-qualified pointers may be
    3435 passed to polymorphic functions.
    3436 \end{rationale}
    3437 
    3438 \lstinline$lvalue$ may be used to qualify the return type of a function type. Let \lstinline$T$ be
    3439 an unqualified version of a type; then the result of calling a function with return type
    3440 \lstinline$lvalue T$ is a modifiable lvalue\index{modifiable lvalue} of type \lstinline$T$.
    3441 \lstinline$const$\use{const} and \lstinline$volatile$\use{volatile} qualifiers may also be added to
    3442 indicate that the function result is a constant or volatile lvalue.
    3443 \begin{rationale}
    3444 The \lstinline$const$ and \lstinline$volatile$ qualifiers can only be sensibly used to qualify the
    3445 return type of a function if the \lstinline$lvalue$ qualifier is also used.
    3446 \end{rationale}
    3447 
    3448 An {lvalue}-qualified type may be used in a cast expression\index{cast expression} if the operand is
    3449 an lvalue; the result of the expression is an lvalue.
    3450 
    3451 \begin{rationale}
    3452 \lstinline$lvalue$ provides some of the functionality of {\CC}'s ``\lstinline$T&$'' ( reference to
    3453 object of type \lstinline$T$) type. Reference types have four uses in {\CC}.
    3454 \begin{itemize}
    3455 \item
    3456 They are necessary for user-defined operators that return lvalues, such as ``subscript'' and
    3457 ``dereference''.
    3458 
    3459 \item
    3460 A reference can be used to define an alias for a complicated lvalue expression, as a way of getting
    3461 some of the functionality of the Pascal \lstinline$with$ statement. The following {\CC} code gives
    3462 an example.
    3463 \begin{lstlisting}
    3464 {
    3465         char &code = long_name.some_field[i].data->code;
    3466         code = toupper( code );
    3467 }
    3468 \end{lstlisting}
    3469 This is not very useful.
    3470 
    3471 \item
    3472 A reference parameter can be used to allow a function to modify an argument without forcing the
    3473 caller to pass the address of the argument. This is most useful for user-defined assignment
    3474 operators. In {\CC}, plain assignment is done by a function called ``\lstinline$operator=$'', and
    3475 the two expressions
    3476 \begin{lstlisting}
    3477 a = b;
    3478 operator=( a, b );
    3479 \end{lstlisting}
    3480 are equivalent. If \lstinline$a$ and \lstinline$b$ are of type \lstinline$T$, then the first
    3481 parameter of \lstinline$operator=$ must have type ``\lstinline$T&$''. It cannot have type
    3482 \lstinline$T$, because then assignment couldn't alter the variable, and it can't have type
    3483 ``\lstinline$T *$'', because the assignment would have to be written ``\lstinline$&a = b;$''.
    3484 
    3485 In the case of user-defined operators, this could just as well be handled by using pointer types and
    3486 by changing the rewrite rules so that ``\lstinline$a = b;$'' is equivalent to
    3487 ``\lstinline$operator=(&( a), b )$''. Reference parameters of ``normal'' functions are Bad Things,
    3488 because they remove a useful property of C function calls: an argument can only be modified by a
    3489 function if it is preceded by ``\lstinline$&$''.
    3490 
    3491 \item
    3492 References to const-qualified\index{const-qualified} types can be used instead of value parameters.
    3493 Given the {\CC} function call ``\lstinline$fiddle( a_thing )$'', where the type of
    3494 \lstinline$a_thing$ is \lstinline$Thing$, the type of \lstinline$fiddle$ could be either of
    3495 \begin{lstlisting}
    3496 void fiddle( Thing );
    3497 void fiddle( const Thing & );
    3498 \end{lstlisting}
    3499 If the second form is used, then constructors and destructors are not invoked to create a temporary
    3500 variable at the call site ( and it is bad style for the caller to make any assumptions about such
    3501 things), and within \lstinline$fiddle$ the parameter is subject to the usual problems caused by
    3502 aliases. The reference form might be chosen for efficiency's sake if \lstinline$Thing$s are too
    3503 large or their constructors or destructors are too expensive. An implementation may switch between
    3504 them without causing trouble for well-behaved clients. This leaves the implementor to define ``too
    3505 large'' and ``too expensive''.
    3506 
    3507 I propose to push this job onto the compiler by allowing it to implement
    3508 \begin{lstlisting}
    3509 void fiddle( const volatile Thing );
    3510 \end{lstlisting}
    3511 with call-by-reference. Since it knows all about the size of \lstinline$Thing$s and the parameter
    3512 passing mechanism, it should be able to come up with a better definition of ``too large'', and may
    3513 be able to make a good guess at ``too expensive''.
    3514 \end{itemize}
    3515 
    3516 In summary, since references are only really necessary for returning lvalues, I'll only provide
    3517 lvalue functions.
    3518 \end{rationale}
    3519 
    3520 
    3521 \setcounter{subsection}{8}
    3522 \subsection{Initialization}
    3523 
    3524 An expression that is used as an \nonterm{initializer} is treated as being cast to the type of the
    3525 object being initialized. An expression used in an \nonterm{initializer-list} is treated as being
    3526 cast to the type of the aggregate member that it initializes. In either case the cast must have a
    3527 single unambiguous interpretation\index{interpretations}.
    3528 
    3529 
    3530 \setcounter{subsection}{10}
    3531 \subsection{Specification definitions}
    3532 
    3533 \begin{syntax}
    3534 \lhs{spec-definition}
    3535 \rhs \lstinline$spec$ \nonterm{identifier}
    3536         \lstinline$($ \nonterm{type-parameter-list} \lstinline$)$
    3537         \lstinline${$ \nonterm{spec-declaration-list}\opt \lstinline$}$
    3538 \lhs{spec-declaration-list}
    3539 \rhs \nonterm{spec-declaration} \lstinline$;$
    3540 \rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline$;$
    3541 \lhs{spec-declaration}
    3542 \rhs \nonterm{specifier-qualifier-list} \nonterm{declarator-list}
    3543 \lhs{declarator-list}
    3544 \rhs \nonterm{declarator}
    3545 \rhs \nonterm{declarator-list} \lstinline$,$ \nonterm{declarator}
    3546 \end{syntax}
    3547 \begin{rationale}
    3548 The declarations allowed in a specification are much the same as those allowed in a structure,
    3549 except that bit fields are not allowed, and incomplete types\index{incomplete types} and function
    3550 types are allowed.
    3551 \end{rationale}
    3552 
    3553 \semantics
    3554 A \define{specification definition} defines a name for a \define{specification}: a parameterized
    3555 collection of object and function declarations.
    3556 
    3557 The declarations in a specification consist of the declarations in the
    3558 \nonterm{spec-declaration-list} and declarations produced by any assertions in the
    3559 \nonterm{spec-parameter-list}. If the collection contains two declarations that declare the same
    3560 identifier and have compatible types, they are combined into one declaration with the composite type
    3561 constructed from the two types.
    3562 
    3563 
    3564 \subsubsection{Assertions}
    3565 \begin{syntax}
    3566 \lhs{assertion-list}
    3567 \rhs \nonterm{assertion}
    3568 \rhs \nonterm{assertion-list} \nonterm{assertion}
    3569 \lhs{assertion}
    3570 \rhs \lstinline$|$ \nonterm{identifier} \lstinline$($ \nonterm{type-name-list} \lstinline$)$
    3571 \rhs \lstinline$|$ \nonterm{spec-declaration}
    3572 \lhs{type-name-list}
    3573 \rhs \nonterm{type-name}
    3574 \rhs \nonterm{type-name-list} \lstinline$,$ \nonterm{type-name}
    3575 \end{syntax}
    3576 
    3577 \constraints
    3578 The \nonterm{identifier} in an assertion that is not a \nonterm{spec-declaration} shall be the name
    3579 of a specification. The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for
    3580 each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}. If the
    3581 \nonterm{type-parameter} uses type-class \lstinline$type$\use{type}, the argument shall be the type
    3582 name of an object type\index{object types}; if it uses \lstinline$dtype$, the argument shall be the
    3583 type name of an object type or an incomplete type\index{incomplete types}; and if it uses
    3584 \lstinline$ftype$, the argument shall be the type name of a function type\index{function types}.
    3585 
    3586 \semantics
    3587 An \define{assertion} is a declaration of a collection of objects and functions, called
    3588 \define{assertion parameters}.
    3589 
    3590 The assertion parameters produced by an assertion that applies the name of a specification to type
    3591 arguments are found by taking the declarations specified in the specification and treating each of
    3592 the specification's parameters as a synonym for the corresponding \nonterm{type-name} argument.
    3593 
    3594 The collection of assertion parameters produced by the \nonterm{assertion-list} are found by
    3595 combining the declarations produced by each assertion. If the collection contains two declarations
    3596 that declare the same identifier and have compatible types, they are combined into one declaration
    3597 with the composite type\index{composite type} constructed from the two types.
    3598 
    3599 \examples
    3600 \begin{lstlisting}
    3601 forall( type T | T ?*?( T, T ))@\use{?*?}@
    3602 T square( T val ) {@\impl{square}@
    3603         return val + val;
    3604 }
    3605 
    3606 context summable( type T ) {@\impl{summable}@
    3607         T ?+=?( T *, T );@\use{?+=?}@
    3608         const T 0;@\use{0}@
    3609 };
    3610 context list_of( type List, type Element ) {@\impl{list_of}@
    3611         Element car( List );
    3612         List cdr( List );
    3613         List cons( Element, List );
    3614         List nil;
    3615         int is_nil( List );
    3616 };
    3617 context sum_list( type List, type Element | summable( Element ) | list_of( List, Element ) ) {};
    3618 \end{lstlisting}
    3619 \lstinline$sum_list$ contains seven declarations, which describe a list whose elements can be added
    3620 up. The assertion ``\lstinline$|sum_list( i_list, int )$''\use{sum_list} produces the assertion
    3621 parameters
    3622 \begin{lstlisting}
    3623 int ?+=?( int *, int );
    3624 const int 0;
    3625 int car( i_list );
    3626 i_list cdr( i_list );
    3627 i_list cons( int, i_list );
    3628 i_list nil;
    3629 int is_nil;
    3630 \end{lstlisting}
    3631 
    3632 \subsection{Type declarations}
    3633 \begin{syntax}
    3634 \lhs{type-parameter-list}
    3635 \rhs \nonterm{type-parameter}
    3636 \rhs \nonterm{type-parameter-list} \lstinline$,$ \nonterm{type-parameter}
    3637 \lhs{type-parameter}
    3638 \rhs \nonterm{type-class} \nonterm{identifier} \nonterm{assertion-list}\opt
    3639 \lhs{type-class}
    3640 \rhs \lstinline$type$
    3641 \rhs \lstinline$dtype$
    3642 \rhs \lstinline$ftype$
    3643 \lhs{type-declaration}
    3644 \rhs \nonterm{storage-class-specifier}\opt \lstinline$type$ \nonterm{type-declarator-list} \verb|;|
    3645 \lhs{type-declarator-list}
    3646 \rhs \nonterm{type-declarator}
    3647 \rhs \nonterm{type-declarator-list} \lstinline$,$ \nonterm{type-declarator}
    3648 \lhs{type-declarator}
    3649 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline$=$ \nonterm{type-name}
    3650 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt
    3651 \end{syntax}
    3652 
    3653 \constraints
    3654 If a type declaration has block scope, and the declared identifier has external or internal linkage,
    3655 the declaration shall have no initializer for the identifier.
    3656 
    3657 \semantics
    3658 A \nonterm{type-parameter} or a \nonterm{type-declarator} declares an identifier to be a type
    3659 name\index{type names} for a type incompatible with all other types.
    3660 
    3661 An identifier declared by a \nonterm{type-parameter} has no linkage\index{no linkage}. Identifiers
    3662 declared with type-class \lstinline$type$\use{type} are object types\index{object types}; those
    3663 declared with type-class \lstinline$dtype$\use{dtype} are incomplete types\index{incomplete types};
    3664 and those declared with type-class \lstinline$ftype$\use{ftype} are function types\index{function
    3665  types}. The identifier has block scope\index{block scope} that terminates at the end of the
    3666 \nonterm{spec-declaration-list} or polymorphic function that contains the \nonterm{type-parameter}.
    3667 
    3668 A \nonterm{type-declarator} with an initializer\index{initializer} is a \define{type definition}.
    3669 The declared identifier is an incomplete type\index{incomplete types} within the initializer, and an
    3670 object type\index{object types} after the end of the initializer. The type in the initializer is
    3671 called the \define{implementation type}. Within the scope of the declaration, implicit
    3672 conversions\index{implicit conversions} can be performed between the defined type and the
    3673 implementation type, and between pointers to the defined type and pointers to the implementation
    3674 type.
    3675 
    3676 A type declaration without an initializer\index{initializer} and without a storage-class
    3677 specifier\index{storage-class specifiers} or with storage-class specifier
    3678 \lstinline$static$\use{static} defines an incomplete type\index{incomplete types}. If a translation
    3679 unit\index{translation unit} or block \index{block} contains one or more such declarations for an
    3680 identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block,
    3681 which would define a new type known only within that block).
    3682 \begin{rationale}
    3683 Incomplete type declarations allow compact mutually-recursive types.
    3684 \begin{lstlisting}
    3685 type t1; // Incomplete type declaration.
    3686 type t2 = struct { t1 * p; ... };
    3687 type t1 = struct { t2 * p; ... };
    3688 \end{lstlisting}
    3689 Without them, mutual recursion could be handled by declaring mutually recursive structures, then
    3690 initializing the types to those structures.
    3691 \begin{lstlisting}
    3692 struct s1;
    3693 type t2 = struct s2 { struct s1 * p; ... };
    3694 type t1 = struct s1 { struct s2 * p; ... };
    3695 \end{lstlisting}
    3696 This introduces extra names, and may force the programmer to cast between the types and their
    3697 implementations.
    3698 \end{rationale}
    3699 
    3700 A type declaration without an initializer and with storage-class specifier \index{storage-class
    3701  specifiers} \lstinline$extern$\use{extern} is an \define{opaque type declaration}. Opaque types
    3702 are object types\index{object types}. An opaque type is not a \nonterm{constant-expression};
    3703 neither is a structure or union that has a member whose type is not a \nonterm{constant-expression}.
    3704 Every other object type\index{object types} is a \nonterm{constant-expression}. Objects with static
    3705 storage duration shall be declared with a type that is a \nonterm{constant-expression}.
    3706 \begin{rationale}
    3707 Type declarations can declare identifiers with external linkage, whereas typedef declarations
    3708 declare identifiers that only exist within a translation unit. These opaque types can be used in
    3709 declarations, but the implementation of the type is not visible.
    3710 
    3711 Static objects can not have opaque types because space for them would have to be allocated at
    3712 program start-up. This is a deficiency\index{deficiencies!static opaque objects}, but I don't want
    3713 to deal with ``module initialization'' code just now.
    3714 \end{rationale}
    3715 
    3716 An incomplete type\index{incomplete types} which is not a qualified version\index{qualified type} of
    3717 a type is a value of type-class\index{type-class} \lstinline$dtype$. An object type\index{object
    3718  types} which is not a qualified version of a type is a value of type-classes \lstinline$type$ and
    3719 \lstinline$dtype$. A function type\index{function types} is a value of type-class
    3720 \lstinline$ftype$.
    3721 \begin{rationale}
    3722 Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which
    3723 omits the identifier being declared.
    3724 
    3725 Object types are precisely the types that can be instantiated. Type qualifiers are not included in
    3726 type values because the compiler needs the information they provide at compile time to detect
    3727 illegal statements or to produce efficient machine instructions. For instance, the code that a
    3728 compiler must generate to manipulate an object that has volatile-qualified type may be different
    3729 from the code to manipulate an ordinary object.
    3730 
    3731 Type qualifiers are a weak point of C's type system. Consider the standard library function
    3732 \lstinline$strchr()$ which, given a string and a character, returns a pointer to the first
    3733 occurrence of the character in the string.
    3734 \begin{lstlisting}
    3735 char *strchr( const char *s, int c ) {@\impl{strchr}@
    3736         char real_c = c; // done because c was declared as int.
    3737         for ( ; *s != real_c; s++ )
    3738          if ( *s == '\0' ) return NULL;
    3739         return ( char * )s;
    3740 }
    3741 \end{lstlisting}
    3742 The parameter \lstinline$s$ must be \lstinline$const char *$, because \lstinline$strchr()$ might be
    3743 used to search a constant string, but the return type must be \lstinline$char *$, because the result
    3744 might be used to modify a non-constant string. Hence the body must perform a cast, and ( even worse)
    3745 \lstinline$strchr()$ provides a type-safe way to attempt to modify constant strings. What is needed
    3746 is some way to say that \lstinline$s$'s type might contain qualifiers, and the result type has
    3747 exactly the same qualifiers. Polymorphic functions do not provide a fix for this
    3748 deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of
    3749 type values. Instead, overloading can be used to define \lstinline$strchr()$ for each combination
    3750 of qualifiers.
    3751 \end{rationale}
    3752 
    3753 \begin{rationale}
    3754 Since incomplete types\index{incomplete types} are not type values, they can not be used as the
    3755 initializer in a type declaration, or as the type of a structure or union member. This prevents the
    3756 declaration of types that contain each other.
    3757 \begin{lstlisting}
    3758 type t1;
    3759 type t2 = t1; // illegal: incomplete type t1.
    3760 type t1 = t2;
    3761 \end{lstlisting}
    3762 
    3763 The initializer in a file-scope declaration must be a constant expression. This means type
    3764 declarations can not build on opaque types, which is a deficiency\index{deficiencies!nesting opaque
    3765  types}.
    3766 \begin{lstlisting}
    3767 extern type Huge; // extended-precision integer type.
    3768 type Rational = struct {
    3769         Huge numerator, denominator;    // illegal
    3770 };
    3771 struct Pair {
    3772         Huge first, second;                             // legal
    3773 };
    3774 \end{lstlisting}
    3775 Without this restriction, \CFA might require ``module initialization'' code ( since
    3776 \lstinline$Rational$ has external linkage, it must be created before any other translation unit
    3777 instantiates it), and would force an ordering on the initialization of the translation unit that
    3778 defines \lstinline$Huge$ and the translation that declares \lstinline$Rational$.
    3779 
    3780 A benefit of the restriction is that it prevents the declaration in separate translation units of
    3781 types that contain each other, which would be hard to prevent otherwise.
    3782 \begin{lstlisting}
    3783 //  File a.c:
    3784         extern type t1;
    3785         type t2 = struct { t1 f1; ... } // illegal
    3786 //  File b.c:
    3787         extern type t2;
    3788         type t1 = struct { t2 f2; ... } // illegal
    3789 \end{lstlisting}
    3790 \end{rationale}
    3791 
    3792 \begin{rationale}
    3793 Since a \nonterm{type-declaration} is a \nonterm{declaration} and not a
    3794 \nonterm{struct-declaration}, type declarations can not be structure members. The form of
    3795 \nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline$type$.
    3796 Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued
    3797 expressions. It also side-steps the problem of type-valued expressions producing different values
    3798 in different declarations.
    3799 
    3800 Since a type declaration is not a \nonterm{parameter-declaration}, functions can not have explicit
    3801 type parameters. This may be too restrictive, but it attempts to make compilation simpler. Recall
    3802 that when traditional C scanners read in an identifier, they look it up in the symbol table to
    3803 determine whether or not it is a typedef name, and return a ``type'' or ``identifier'' token
    3804 depending on what they find. A type parameter would add a type name to the current scope. The
    3805 scope manipulations involved in parsing the declaration of a function that takes function pointer
    3806 parameters and returns a function pointer may just be too complicated.
    3807 
    3808 Explicit type parameters don't seem to be very useful, anyway, because their scope would not include
    3809 the return type of the function. Consider the following attempt to define a type-safe memory
    3810 allocation function.
    3811 \begin{lstlisting}
    3812 #include <stdlib.h>
    3813 T * new( type T ) { return ( T * )malloc( sizeof( T) ); };
    3814 @\ldots@
    3815 int * ip = new( int );
    3816 \end{lstlisting}
    3817 This looks sensible, but \CFA's declaration-before-use rules mean that ``\lstinline$T$'' in the
    3818 function body refers to the parameter, but the ``\lstinline$T$'' in the return type refers to the
    3819 meaning of \lstinline$T$ in the scope that contains \lstinline$new$; it could be undefined, or a
    3820 type name, or a function or variable name. Nothing good can result from such a situation.
    3821 \end{rationale}
    3822 
    3823 \examples
    3824 Since type declarations create new types, instances of types are always passed by value.
    3825 \begin{lstlisting}
    3826 type A1 = int[2];
    3827 void f1( A1 a ) { a[0] = 0; };
    3828 typedef int A2[2];
    3829 void f2( A2 a ) { a[0] = 0; };
    3830 A1 v1;
    3831 A2 v2;
    3832 f1( v1 );
    3833 f2( v2 );
    3834 \end{lstlisting}
    3835 \lstinline$V1$ is passed by value, so \lstinline$f1()$'s assignment to \lstinline$a[0]$ does not
    3836 modify v1.  \lstinline$V2$ is converted to a pointer, so \lstinline$f2()$ modifies
    3837 \lstinline$v2[0]$.
    3838 
    3839 A translation unit containing the declarations
    3840 \begin{lstlisting}
    3841 extern type Complex;@\use{Complex}@ // opaque type declaration.
    3842 extern float abs( Complex );@\use{abs}@
    3843 \end{lstlisting}
    3844 can contain declarations of complex numbers, which can be passed to \lstinline$abs$. Some other
    3845 translation unit must implement \lstinline$Complex$ and \lstinline$abs$. That unit might contain
    3846 the declarations
    3847 \begin{lstlisting}
    3848 type Complex = struct { float re, im; };@\impl{Complex}@
    3849 Complex cplx_i = { 0.0, 1.0 };@\impl{cplx_i}@
    3850 float abs( Complex c ) {@\impl{abs( Complex )}@
    3851         return sqrt( c.re * c.re + c.im * c.im );
    3852 }
    3853 \end{lstlisting}
    3854 Note that \lstinline$c$ is implicitly converted to a \lstinline$struct$ so that its components can
    3855 be retrieved.
    3856 
    3857 \begin{lstlisting}
    3858 type Time_of_day = int;@\impl{Time_of_day}@ // seconds since midnight.
    3859 Time_of_day ?+?( Time_of_day t1, int seconds ) {@\impl{?+?}@
    3860         return (( int)t1 + seconds ) % 86400;
    3861 }
    3862 \end{lstlisting}
    3863 \lstinline$t1$ must be cast to its implementation type to prevent infinite recursion.
    3864 
    3865 \begin{rationale}
    3866 Within the scope of a type definition, an instance of the type can be viewed as having that type or
    3867 as having the implementation type. In the \lstinline$Time_of_day$ example, the difference is
    3868 important. Different languages have treated the distinction between the abstraction and the
    3869 implementation in different ways.
    3870 \begin{itemize}
    3871 \item
    3872 Inside a Clu cluster \cite{clu}, the declaration of an instance states which view applies. Two
    3873 primitives called \lstinline$up$ and \lstinline$down$ can be used to convert between the views.
    3874 \item
    3875 The Simula class \cite{Simula87} is essentially a record type. Since the only operations on a
    3876 record are member selection and assignment, which can not be overloaded, there is never any
    3877 ambiguity as to whether the abstraction or the implementation view is being used. In {\CC}
    3878 \cite{c++}, operations on class instances include assignment and ``\lstinline$&$'', which can be
    3879 overloaded. A ``scope resolution'' operator can be used inside the class to specify whether the
    3880 abstract or implementation version of the operation should be used.
    3881 \item
    3882 An Ada derived type definition \cite{ada} creates a new type from an old type, and also implicitly
    3883 declares derived subprograms that correspond to the existing subprograms that use the old type as a
    3884 parameter type or result type. The derived subprograms are clones of the existing subprograms with
    3885 the old type replaced by the derived type. Literals and aggregates of the old type are also cloned.
    3886 In other words, the abstract view provides exactly the same operations as the implementation view.
    3887 This allows the abstract view to be used in all cases.
    3888 
    3889 The derived subprograms can be replaced by programmer-specified subprograms. This is an exception
    3890 to the normal scope rules, which forbid duplicate definitions of a subprogram in a scope. In this
    3891 case, explicit conversions between the derived type and the old type can be used.
    3892 \end{itemize}
    3893 \CFA's rules are like Clu's, except that implicit conversions and
    3894 conversion costs allow it to do away with most uses of \lstinline$up$ and \lstinline$down$.
    3895 \end{rationale}
    3896 
    3897 
    3898 \subsubsection{Default functions and objects}
    3899 
    3900 A declaration\index{type declaration} of a type identifier \lstinline$T$ with type-class
    3901 \lstinline$type$ implicitly declares a \define{default assignment} function
    3902 \lstinline$T ?=?( T *, T )$\use{?=?}, with the same scope\index{scopes} and linkage\index{linkage} as
    3903 the identifier \lstinline$T$.
    3904 \begin{rationale}
    3905 Assignment is central to C's imperative programming style, and every existing C object type has
    3906 assignment defined for it ( except for array types, which are treated as pointer types for purposes
    3907 of assignment). Without this rule, nearly every inferred type parameter would need an accompanying
    3908 assignment assertion parameter. If a type parameter should not have an assignment operation,
    3909 \lstinline$dtype$ should be used. If a type should not have assignment defined, the user can define
    3910 an assignment function that causes a run-time error, or provide an external declaration but no
    3911 definition and thus cause a link-time error.
    3912 \end{rationale}
    3913 
    3914 A definition\index{type definition} of a type identifier \lstinline$T$ with implementation
    3915 type\index{implementation type} \lstinline$I$ and type-class \lstinline$type$ implicitly defines a
    3916 default assignment function. A definition\index{type definition} of a type identifier \lstinline$T$
    3917 with implementation type \lstinline$I$ and an assertion list implicitly defines \define{default
    3918  functions} and \define{default objects} as declared by the assertion declarations. The default
    3919 objects and functions have the same scope\index{scopes} and linkage\index{linkage} as the identifier
    3920 \lstinline$T$. Their values are determined as follows:
    3921 \begin{itemize}
    3922 \item
    3923 If at the definition of \lstinline$T$ there is visible a declaration of an object with the same name
    3924 as the default object, and if the type of that object with all occurrence of \lstinline$I$ replaced
    3925 by \lstinline$T$ is compatible with the type of the default object, then the default object is
    3926 initialized with that object. Otherwise the scope of the declaration of \lstinline$T$ must contain
    3927 a definition of the default object.
    3928 
    3929 \item
    3930 If at the definition of \lstinline$T$ there is visible a declaration of a function with the same
    3931 name as the default function, and if the type of that function with all occurrence of \lstinline$I$
    3932 replaced by \lstinline$T$ is compatible with the type of the default function, then the default
    3933 function calls that function after converting its arguments and returns the converted result.
    3934 
    3935 Otherwise, if \lstinline$I$ contains exactly one anonymous member\index{anonymous member} such that
    3936 at the definition of \lstinline$T$ there is visible a declaration of a function with the same name
    3937 as the default function, and the type of that function with all occurrences of the anonymous
    3938 member's type in its parameter list replaced by \lstinline$T$ is compatible with the type of the
    3939 default function, then the default function calls that function after converting its arguments and
    3940 returns the result.
    3941 
    3942 Otherwise the scope of the declaration of \lstinline$T$ must contain a definition of the default
    3943 function.
    3944 \end{itemize}
    3945 \begin{rationale}
    3946 Note that a pointer to a default function will not compare as equal to a pointer to the inherited
    3947 function.
    3948 \end{rationale}
    3949 
    3950 A function or object with the same type and name as a default function or object that is declared
    3951 within the scope of the definition of \lstinline$T$ replaces the default function or object.
    3952 
    3953 \examples
    3954 \begin{lstlisting}
    3955 context s( type T ) {
    3956         T a, b;
    3957 }
    3958 struct impl { int left, right; } a = { 0, 0 };
    3959 type Pair | s( Pair ) = struct impl;
    3960 Pair b = { 1, 1 };
    3961 \end{lstlisting}
    3962 The definition of \lstinline$Pair$ implicitly defines two objects \lstinline$a$ and \lstinline$b$.
    3963 \lstinline$Pair a$ inherits its value from the \lstinline$struct impl a$. The definition of
    3964 \lstinline$Pair b$ is compulsory because there is no \lstinline$struct impl b$ to construct a value
    3965 from.
    3966 \begin{lstlisting}
    3967 context ss( type T ) {
    3968         T clone( T );
    3969         void munge( T * );
    3970 }
    3971 type Whatsit | ss( Whatsit );@\use{Whatsit}@
    3972 type Doodad | ss( Doodad ) = struct doodad {@\use{Doodad}@
    3973         Whatsit; // anonymous member
    3974         int extra;
    3975 };
    3976 Doodad clone( Doodad ) { ... }
    3977 \end{lstlisting}
    3978 The definition of \lstinline$Doodad$ implicitly defines three functions:
    3979 \begin{lstlisting}
    3980 Doodad ?=?( Doodad *, Doodad );
    3981 Doodad clone( Doodad );
    3982 void munge( Doodad * );
    3983 \end{lstlisting}
    3984 The assignment function inherits \lstinline$struct doodad$'s assignment function because the types
    3985 match when \lstinline$struct doodad$ is replaced by \lstinline$Doodad$ throughout.
    3986 \lstinline$munge()$ inherits \lstinline$Whatsit$'s \lstinline$munge()$ because the types match when
    3987 \lstinline$Whatsit$ is replaced by \lstinline$Doodad$ in the parameter list. \lstinline$clone()$
    3988 does \emph{not} inherit \lstinline$Whatsit$'s \lstinline$clone()$: replacement in the parameter
    3989 list yields ``\lstinline$Whatsit clone( Doodad )$'', which is not compatible with
    3990 \lstinline$Doodad$'s \lstinline$clone()$'s type. Hence the definition of
    3991 ``\lstinline$Doodad clone( Doodad )$'' is necessary.
    3992 
    3993 Default functions and objects are subject to the normal scope rules.
    3994 \begin{lstlisting}
    3995 type T = @\ldots@;
    3996 T a_T = @\ldots@;               // Default assignment used.
    3997 T ?=?( T *, T );
    3998 T a_T = @\ldots@;               // Programmer-defined assignment called.
    3999 \end{lstlisting}
    4000 \begin{rationale}
    4001 A compiler warning would be helpful in this situation.
    4002 \end{rationale}
    4003 
    4004 \begin{rationale}
    4005 The \emph{class} construct of object-oriented programming languages performs three independent
    4006 functions. It \emph{encapsulates} a data structure; it defines a \emph{subtype} relationship, whereby
    4007 instances of one class may be used in contexts that require instances of another; and it allows one
    4008 class to \emph{inherit} the implementation of another.
    4009 
    4010 In \CFA, encapsulation is provided by opaque types and the scope rules, and subtyping is provided
    4011 by specifications and assertions. Inheritance is provided by default functions and objects.
    4012 \end{rationale}
    4013 
    4014 
    4015 \section{Statements and blocks}
    4016 Many statements contain expressions, which may have more than one interpretation. The following
    4017 sections describe how the \CFA translator selects an interpretation. In all cases the result of
    4018 the selection shall be a single unambiguous interpretation\index{interpretations}.
    4019 
    4020 
    4021 \setcounter{subsection}{2}
    4022 \subsection{Expression and null statements}
    4023 
    4024 The expression in an expression statement is treated as being cast to \lstinline$void$.
    4025 
    4026 
    4027 \subsection{Selection statements}
    4028 
    4029 The controlling expression \lstinline$E$ in the switch statement
    4030 \begin{lstlisting}
    4031 switch ( E ) ...
    4032 \end{lstlisting}
    4033 may have more than one interpretation, but it shall have only one interpretation with an integral
    4034 type. An integer promotion\index{integer promotion} is performed on the expression if necessary.
    4035 The constant expressions in \lstinline$case$ statements with the switch are converted to the
    4036 promoted type.
    4037 
    4038 
    4039 \subsection{Iteration statements}
    4040 
    4041 The controlling expression \lstinline$E$ in the loops
    4042 \begin{lstlisting}
    4043 if ( E ) ...
    4044 while ( E ) ...
    4045 do ... while ( E );
    4046 \end{lstlisting}
    4047 is treated as ``\lstinline$( int )((E)!=0)$''.
    4048 
    4049 The statement
    4050 \begin{lstlisting}
    4051 for ( a; b; c ) @\ldots@
    4052 \end{lstlisting}
    4053 is treated as
    4054 \begin{lstlisting}
    4055 for ( ( void )( a ); ( int )(( b )!=0); ( void )( c ) ) @\ldots@
    4056 \end{lstlisting}
    4057 
    4058 
    4059 \subsection{Jump statements}
    4060 
    4061 An expression in a \lstinline$return$ statement is treated as being
    4062 cast to the result type of the function.
    4063 
    4064 
    4065 \setcounter{section}{9}
    4066 \section{Preprocessing directives}
    4067 
    4068 
    4069 \setcounter{subsection}{7}
    4070 \subsection{Predefined macro names}
    4071 
    4072 The implementation shall define the macro names \lstinline$__LINE__$, \lstinline$__FILE__$,
    4073 \lstinline$__DATE__$, and \lstinline$__TIME__$, as in the {\c11} standard. It shall not define the
    4074 macro name \lstinline$__STDC__$.
    4075 
    4076 In addition, the implementation shall define the macro name \lstinline$__CFORALL__$ to be the
    4077 decimal constant 1.
    4078 
    4079 
    4080 \appendix
    4081 
    4082 \chapter{Examples}
    4083 
    4084 \section{C types}
    4085 This section gives example specifications for some groups of types that are important in the C
    4086 language, in terms of the predefined operations that can be applied to those types.
    4087 
    4088 
    4089 \subsection{Scalar, arithmetic, and integral types}
    4090 
    4091 The pointer, integral, and floating-point types are all \define{scalar types}. All of these types
    4092 can be logically negated and compared. The assertion ``\lstinline$scalar( Complex )$'' should be read
    4093 as ``type \lstinline$Complex$ is scalar''.
    4094 \begin{lstlisting}
    4095 context scalar( type T ) {@\impl{scalar}@
    4096         int !?( T );
    4097         int ?<?( T, T ), ?<=?( T, T ), ?==?( T, T ), ?>=?( T, T ), ?>?( T, T ), ?!=?( T, T );
    4098 };
    4099 \end{lstlisting}
    4100 
    4101 The integral and floating-point types are \define{arithmetic types}, which support the basic
    4102 arithmetic operators. The use of an assertion in the \nonterm{spec-parameter-list} declares that,
    4103 in order to be arithmetic, a type must also be scalar ( and hence that scalar operations are
    4104 available ). This is equivalent to inheritance of specifications.
    4105 \begin{lstlisting}
    4106 context arithmetic( type T | scalar( T ) ) {@\impl{arithmetic}@@\use{scalar}@
    4107         T +?( T ), -?( T );
    4108         T ?*?( T, T ), ?/?( T, T ), ?+?( T, T ), ?-?( T, T );
    4109 };
    4110 \end{lstlisting}
    4111 
    4112 The various flavors of \lstinline$char$ and \lstinline$int$ and the enumerated types make up the
    4113 \define{integral types}.
    4114 \begin{lstlisting}
    4115 context integral( type T | arithmetic( T ) ) {@\impl{integral}@@\use{arithmetic}@
    4116         T ~?( T );
    4117         T ?&?( T, T ), ?|?( T, T ), ?^?( T, T );
    4118         T ?%?( T, T );
    4119         T ?<<?( T, T ), ?>>?( T, T );
    4120 };
    4121 \end{lstlisting}
    4122 
    4123 
    4124 \subsection{Modifiable types}
    4125 \index{modifiable lvalue}
    4126 
    4127 The only operation that can be applied to all modifiable lvalues is simple assignment.
    4128 \begin{lstlisting}
    4129 context m_lvalue( type T ) {@\impl{m_lvalue}@
    4130         T ?=?( T *, T );
    4131 };
    4132 \end{lstlisting}
    4133 
    4134 Modifiable scalar lvalues are scalars and are modifiable lvalues, and assertions in the
    4135 \nonterm{spec-parameter-list} reflect those relationships. This is equivalent to multiple
    4136 inheritance of specifications. Scalars can also be incremented and decremented.
    4137 \begin{lstlisting}
    4138 context m_l_scalar( type T | scalar( T ) | m_lvalue( T ) ) {@\impl{m_l_scalar}@
    4139         T ?++( T * ), ?--( T * );@\use{scalar}@@\use{m_lvalue}@
    4140         T ++?( T * ), --?( T * );
    4141 };
    4142 \end{lstlisting}
    4143 
    4144 Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic. Note that this
    4145 results in the ``inheritance'' of \lstinline$scalar$ along both paths.
    4146 \begin{lstlisting}
    4147 context m_l_arithmetic( type T | m_l_scalar( T ) | arithmetic( T ) ) {@\impl{m_l_arithmetic}@
    4148         T ?/=?( T *, T ), ?*=?( T *, T );@\use{m_l_scalar}@@\use{arithmetic}@
    4149         T ?+=?( T *, T ), ?-=?( T *, T );
    4150 };
    4151 
    4152 context m_l_integral( type T | m_l_arithmetic( T ) | integral( T ) ) {@\impl{m_l_integral}@
    4153         T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );@\use{m_l_arithmetic}@
    4154         T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );@\use{integral}@
    4155 };
    4156 \end{lstlisting}
    4157 
    4158 
    4159 \subsection{Pointer and array types}
    4160 
    4161 Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a
    4162 constant pointer to the first element of the array, and the subscript expression
    4163 ``\lstinline$a[i]$'' is equivalent to the dereferencing expression ``\lstinline$(*( a+( i )))$''.
    4164 Technically, pointer arithmetic and pointer comparisons other than ``\lstinline$==$'' and
    4165 ``\lstinline$!=$'' are only defined for pointers to array elements, but the type system does not
    4166 enforce those restrictions. Consequently, there is no need for a separate ``array type''
    4167 specification.
    4168 
    4169 Pointer types are scalar types. Like other scalar types, they have ``\lstinline$+$'' and
    4170 ``\lstinline$-$'' operators, but the types do not match the types of the operations in
    4171 \lstinline$arithmetic$, so these operators cannot be consolidated in \lstinline$scalar$.
    4172 \begin{lstlisting}
    4173 context pointer( type P | scalar( P ) ) {@\impl{pointer}@@\use{scalar}@
    4174         P ?+?( P, long int ), ?+?( long int, P ), ?-?( P, long int );
    4175         ptrdiff_t ?-?( P, P );
    4176 };
    4177 
    4178 context m_l_pointer( type P | pointer( P ) | m_l_scalar( P ) ) {@\impl{m_l_pointer}@
    4179         P ?+=?( P *, long int ), ?-=?( P *, long int );
    4180         P ?=?( P *, void * );
    4181         void * ?=?( void **, P );
    4182 };
    4183 \end{lstlisting}
    4184 
    4185 Specifications that define the dereference operator ( or subscript operator ) require two parameters,
    4186 one for the pointer type and one for the pointed-at ( or element ) type. Different specifications are
    4187 needed for each set of type qualifiers\index{type qualifiers}, because qualifiers are not included
    4188 in types. The assertion ``\lstinline$|ptr_to( Safe_pointer, int )$'' should be read as
    4189 ``\lstinline$Safe_pointer$ acts like a pointer to \lstinline$int$''.
    4190 \begin{lstlisting}
    4191 context ptr_to( type P | pointer( P ), type T ) {@\impl{ptr_to}@@\use{pointer}@
    4192         lvalue T *?( P ); lvalue T ?[?]( P, long int );
    4193 };
    4194 
    4195 context ptr_to_const( type P | pointer( P ), type T ) {@\impl{ptr_to_const}@
    4196         const lvalue T *?( P ); const lvalue T ?[?]( P, long int );@\use{pointer}@
    4197 };
    4198 
    4199 context ptr_to_volatile( type P | pointer( P ), type T ) }@\impl{ptr_to_volatile}@
    4200         volatile lvalue T *?( P ); volatile lvalue T ?[?]( P, long int );@\use{pointer}@
    4201 };
    4202 \end{lstlisting}
    4203 \begin{lstlisting}
    4204 context ptr_to_const_volatile( type P | pointer( P ), type T ) }@\impl{ptr_to_const_volatile}@
    4205         const volatile lvalue T *?( P );@\use{pointer}@
    4206         const volatile lvalue T ?[?]( P, long int );
    4207 };
    4208 \end{lstlisting}
    4209 
    4210 Assignment to pointers is more complicated than is the case with other types, because the target's
    4211 type can have extra type qualifiers in the pointed-at type: a ``\lstinline$T *$'' can be assigned to
    4212 a ``\lstinline$const T *$'', a ``\lstinline$volatile T *$'', and a ``\lstinline$const volatile T *$''.
    4213 Again, the pointed-at type is passed in, so that assertions can connect these specifications to the
    4214 ``\lstinline$ptr_to$'' specifications.
    4215 \begin{lstlisting}
    4216 context m_l_ptr_to( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to}@ type T | ptr_to( P, T )@\use{ptr_to}@ {
    4217         P ?=?( P *, T * );
    4218         T * ?=?( T **, P );
    4219 };
    4220 
    4221 context m_l_ptr_to_const( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_const}@ type T | ptr_to_const( P, T )@\use{ptr_to_const}@) {
    4222         P ?=?( P *, const T * );
    4223         const T * ?=?( const T **, P );
    4224 };
    4225 
    4226 context m_l_ptr_to_volatile( type P | m_l_pointer( P ),@\use{m_l_pointer}@@\impl{m_l_ptr_to_volatile}@ type T | ptr_to_volatile( P, T )) {@\use{ptr_to_volatile}@
    4227         P ?=?( P *, volatile T * );
    4228         volatile T * ?=?( volatile T **, P );
    4229 };
    4230 
    4231 context m_l_ptr_to_const_volatile( type P | ptr_to_const_volatile( P ),@\use{ptr_to_const_volatile}@@\impl{m_l_ptr_to_const_volatile}@
    4232                 type 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}@
    4233         P ?=?( P *, const volatile T * );
    4234         const volatile T * ?=?( const volatile T **, P );
    4235 };
    4236 \end{lstlisting}
    4237 
    4238 Note the regular manner in which type qualifiers appear in those specifications. An alternative
    4239 specification can make use of the fact that qualification of the pointed-at type is part of a
    4240 pointer type to capture that regularity.
    4241 \begin{lstlisting}
    4242 context 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 ) ) {
    4243         MyP ?=?( MyP *, CP );
    4244         CP ?=?( CP *, MyP );
    4245 };
    4246 \end{lstlisting}
    4247 The assertion ``\lstinline$| m_l_ptr_like( Safe_ptr, const int * )$'' should be read as
    4248 ``\lstinline$Safe_ptr$ is a pointer type like \lstinline$const int *$''. This specification has two
    4249 defects, compared to the original four: there is no automatic assertion that dereferencing a
    4250 \lstinline$MyP$ produces an lvalue of the type that \lstinline$CP$ points at, and the
    4251 ``\lstinline$|m_l_pointer( CP )$'' assertion provides only a weak assurance that the argument passed
    4252 to \lstinline$CP$ really is a pointer type.
    4253 
    4254 
    4255 \section{Relationships between operations}
    4256 
    4257 Different operators often have related meanings; for instance, in C, ``\lstinline$+$'',
    4258 ``\lstinline$+=$'', and the two versions of ``\lstinline$++$'' perform variations of addition.
    4259 Languages like {\CC} and Ada allow programmers to define operators for new types, but do not
    4260 require that these relationships be preserved, or even that all of the operators be implemented.
    4261 Completeness and consistency is left to the good taste and discretion of the programmer. It is
    4262 possible to encourage these attributes by providing generic operator functions, or member functions
    4263 of abstract classes, that are defined in terms of other, related operators.
    4264 
    4265 In \CFA, polymorphic functions provide the equivalent of these generic operators, and
    4266 specifications explicitly define the minimal implementation that a programmer should provide. This
    4267 section shows a few examples.
    4268 
    4269 
    4270 \subsection{Relational and equality operators}
    4271 
    4272 The different comparison operators have obvious relationships, but there is no obvious subset of the
    4273 operations to use in the implementation of the others. However, it is usually convenient to
    4274 implement a single comparison function that returns a negative integer, 0, or a positive integer if
    4275 its first argument is respectively less than, equal to, or greater than its second argument; the
    4276 library function \lstinline$strcmp$ is an example.
    4277 
    4278 C and \CFA have an extra, non-obvious comparison operator: ``\lstinline$!$'', logical negation,
    4279 returns 1 if its operand compares equal to 0, and 0 otherwise.
    4280 \begin{lstlisting}
    4281 context comparable( type T ) {
    4282         const T 0;
    4283         int compare( T, T );
    4284 }
    4285 
    4286 forall( type T | comparable( T ) ) int ?<?( T l, T r ) {
    4287         return compare( l, r ) < 0;
    4288 }
    4289 // ... similarly for <=, ==, >=, >, and !=.
    4290 
    4291 forall( type T | comparable( T ) ) int !?( T operand ) {
    4292         return !compare( operand, 0 );
    4293 }
    4294 \end{lstlisting}
    4295 
    4296 
    4297 \subsection{Arithmetic and integer operations}
    4298 
    4299 A complete arithmetic type would provide the arithmetic operators and the corresponding assignment
    4300 operators. Of these, the assignment operators are more likely to be implemented directly, because
    4301 it is usually more efficient to alter the contents of an existing object than to create and return a
    4302 new one. Similarly, a complete integral type would provide integral operations based on integral
    4303 assignment operations.
    4304 \begin{lstlisting}
    4305 context arith_base( type T ) {
    4306         const T 1;
    4307         T ?+=?( T *, T ), ?-=?( T *, T ), ?*=?( T *, T ), ?/=?( T *, T );
    4308 }
    4309 
    4310 forall( type T | arith_base( T ) ) T ?+?( T l, T r ) {
    4311         return l += r;
    4312 }
    4313 
    4314 forall( type T | arith_base( T ) ) T ?++( T * operand ) {
    4315         T temporary = *operand;
    4316         *operand += 1;
    4317         return temporary;
    4318 }
    4319 
    4320 forall( type T | arith_base( T ) ) T ++?( T * operand ) {
    4321         return *operand += 1;
    4322 }
    4323 // ... similarly for -, --, *, and /.
    4324 
    4325 context int_base( type T ) {
    4326         T ?&=?( T *, T ), ?|=?( T *, T ), ?^=?( T *, T );
    4327         T ?%=?( T *, T ), ?<<=?( T *, T ), ?>>=?( T *, T );
    4328 }
    4329 
    4330 forall( type T | int_base( T ) ) T ?&?( T l, T r ) {
    4331         return l &= r;
    4332 }
    4333 // ... similarly for |, ^, %, <<, and >>.
    4334 \end{lstlisting}
    4335 
    4336 Note that, although an arithmetic type would certainly provide comparison functions, and an integral
    4337 type would provide arithmetic operations, there does not have to be any relationship among
    4338 \lstinline$int_base$, \lstinline$arith_base$ and \lstinline$comparable$. Note also that these
    4339 declarations provide guidance and assistance, but they do not define an absolutely minimal set of
    4340 requirements. A truly minimal implementation of an arithmetic type might only provide
    4341 \lstinline$0$, \lstinline$1$, and \lstinline$?-=?$, which would be used by polymorphic
    4342 \lstinline$?+=?$, \lstinline$?*=?$, and \lstinline$?/=?$ functions.
    4343 
    4344 Note also that \lstinline$short$ is an integer type in C11 terms, but has no operations!
    4345 
    4346 
    4347 \chapter{TODO}
    4348 Review index entries.
    4349 
    4350 Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers. This gets
    4351 into \lstinline$noalias$ territory. Qualifying anything (``\lstinline$short restrict rs$'') means
    4352 pointer parameters of \lstinline$?++$, etc, would need restrict qualifiers.
    4353 
    4354 Enumerated types. Constants are not ints. Overloading. Definition should be ``representable as an
    4355 integer type'', not ``as an int''. C11 usual conversions freely convert to and from ordinary
    4356 integer types via assignment, which works between any integer types. Does enum Color ?*?( enum
    4357 Color, enum Color ) really make sense? ?++ does, but it adds (int)1.
    4358 
    4359 Operators on {,signed,unsigned} char and other small types. ?<? harmless; ?*? questionable for
    4360 chars. Generic selections make these choices visible. Safe conversion operators? Predefined
    4361 ``promotion'' function?
    4362 
    4363 \lstinline$register$ assignment might be handled as assignment to a temporary with copying back and
    4364 forth, but copying must not be done by assignment.
    4365 
    4366 Don't use ptrdiff\_t by name in the predefineds.
    4367 
    4368 Polymorphic objects. Polymorphic typedefs and type declarations.
    4369 
    4370 
    4371 \bibliographystyle{plain}
    4372 \bibliography{refrat}
    4373 
    4374 
    4375 \addcontentsline{toc}{chapter}{\indexname} % add index name to table of contents
    4376 \begin{theindex}
    4377 Italic page numbers give the location of the main entry for the referenced term. Plain page numbers
    4378 denote uses of the indexed term. Entries for grammar non-terminals are italicized. A typewriter
    4379 font is used for grammar terminals and program identifiers.
    4380 \indexspace
    4381 \input{refrat.ind}
    4382 \end{theindex}
    4383 
    4384 \end{document}
    4385 
    4386 % Local Variables: %
    4387 % tab-width: 4 %
    4388 % fill-column: 100 %
    4389 % compile-command: "make" %
    4390 % End: %
Note: See TracChangeset for help on using the changeset viewer.