Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/refrat/refrat.tex

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