Changeset 1b7ea43
- Timestamp:
- May 4, 2016, 2:58:28 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 711eee5
- Parents:
- 1048b31 (diff), 7937abf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/LaTeXmacros/common.tex
r1048b31 r1b7ea43 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sat Apr 30 13:52:12201614 %% Update Count : 4113 %% Last Modified On : Wed May 4 08:01:10 2016 14 %% Update Count : 54 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 132 132 % blocks and titles 133 133 \newcommand{\define}[1]{\emph{#1\/}\index{#1}} 134 \newcommand{\rewrite}{\(\Rightarrow\)}135 134 \newcommand{\rewriterules}{\paragraph{Rewrite Rules}~\par\noindent} 136 135 \newcommand{\examples}{\paragraph{Examples}~\par\noindent} … … 144 143 \newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}} 145 144 \newcommand{\rhs}{\hfil\break\hbox{\hskip1in}} 146 \newcommand{\oldlhs}[1]{\emph{#1: \ ldots}\index{#1@{\emph{#1}}|italic}}145 \newcommand{\oldlhs}[1]{\emph{#1: \dots}\index{#1@{\emph{#1}}|italic}} 147 146 \newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}} 148 147 \newcommand{\opt}{$_{opt}$\ } … … 200 199 belowskip=2pt, 201 200 moredelim=**[is][\color{red}]{®}{®}, % red highlighting 202 moredelim=**[is][\color{blue}]{©}{©}, % blue highlighting201 % moredelim=**[is][\color{blue}]{¢}{¢}, % blue highlighting 203 202 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords 204 203 % literate={\\`}{\raisebox{0.3ex}{\ttfamily\upshape \hspace*{-2pt}`}}1, % escape \`, otherwise used for red highlighting 204 literate={...}{{$\dots$}}1 {<-}{{$\leftarrow$}}1 {=>}{{$\Rightarrow$}}1, 205 205 }% 206 207 \lstMakeShortInline© % single-character for \lstinline 206 208 207 209 \makeatletter -
doc/refrat/refrat.tex
r1048b31 r1b7ea43 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 %% 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -*- Mode: Latex -*- %%%%%%%%%%%%%%%%%%%%%%%%%%%%``%% 3 2 %% Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo 4 3 %% … … 11 10 %% Created On : Wed Apr 6 14:52:25 2016 12 11 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sat Apr 30 13:45:40201614 %% Update Count : 2912 %% Last Modified On : Tue May 3 18:00:28 2016 13 %% Update Count : 64 15 14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 15 17 16 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 17 19 % red highlighting ®...® (registered trademark sumbol)20 % blue highlighting ©...© (copyright symbol)21 % latex escape §...§ (section symbol) 22 % keyword escape ¶...¶ (pilcrow symbol) 18 % inline code ©...© (copyright symbol) emacs: C-q M-) 19 % red highlighting ®...® (registered trademark sumbol) emacs: C-q M-. 20 % latex escape §...§ (section symbol) emacs: C-q M-' 21 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 23 22 % math escape $...$ (dollar symbol) 24 23 … … 27 26 28 27 % Latex packages used in the document. 28 \usepackage[T1]{fontenc} % allow Latin1 (extended ASCII) characters 29 \usepackage{textcomp} 30 \usepackage[latin1]{inputenc} 31 \usepackage{upquote} 29 32 \usepackage{fullpage,times} 33 \usepackage{epic,eepic} 30 34 \usepackage{xspace} 31 35 \usepackage{varioref} … … 47 51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 48 52 53 % Names used in the document. 54 55 \newcommand{\Version}{1.0.0} 56 57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 58 49 59 \setcounter{secnumdepth}{3} % number subsubsections 50 60 \setcounter{tocdepth}{3} % subsubsections in table of contents … … 129 139 \subsection{Scopes of identifiers}\index{scopes} 130 140 131 \CFA's scope rules differ from C's in one major respect: a declaration of an identifier may overload\index{overloading} outer declarations of lexically identical identifiers in the same 132 \Index{name space}, instead of hiding them. 133 The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a \lstinline@type@\use{type} or 134 \lstinline@typedef@\use{typedef} declaration and the other is not. The outer declaration becomes 135 \Index{visible} when the scope of the inner declaration terminates. 136 \begin{rationale} 137 Hence, a \CFA program can declare an \lstinline@int v@ and a \lstinline@float v@ in the same scope; 141 \CFA's scope rules differ from C's in one major respect: a declaration of an identifier may overload\index{overloading} outer declarations of lexically identical identifiers in the same \Index{name space}, instead of hiding them. 142 The outer declaration is hidden if the two declarations have \Index{compatible type}, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type, or if one declaration is a ©type©\use{type} or ©typedef©\use{typedef} declaration and the other is not. 143 The outer declaration becomes \Index{visible} when the scope of the inner declaration terminates. 144 \begin{rationale} 145 Hence, a \CFA program can declare an ©int v© and a ©float v© in the same scope; 138 146 a {\CC} program can not. 139 147 \end{rationale} … … 144 152 145 153 \CFA's linkage rules differ from C's in only one respect: instances of a particular identifier with external or internal linkage do not necessarily denote the same object or function. 146 Instead, in the set of translation units and libraries that constitutes an entire program, any two instances of a particular identifier with \Index{external linkage} denote the same object or function if they have 147 \Index{compatible type}s, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type. 154 Instead, in the set of translation units and libraries that constitutes an entire program, any two instances of a particular identifier with \Index{external linkage} denote the same object or function if they have \Index{compatible type}s, or if one declares an array type and the other declares a pointer type and the element type and pointed-at type are compatible, or if one has function type and the other is a pointer to a compatible function type. 148 155 Within one translation unit, each instance of an identifier with \Index{internal linkage} denotes the same object or function in the same circumstances. 149 156 Identifiers with \Index{no linkage} always denote unique entities. 150 157 \begin{rationale} 151 A \CFA program can declare an \lstinline@extern int v@ and an \lstinline@extern float v@;158 A \CFA program can declare an ©extern int v© and an ©extern float v©; 152 159 a C program cannot. 153 160 \end{rationale} … … 172 179 \end{lstlisting} 173 180 174 The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., \lstinline@sumable@.181 The type parameters in an instantiation of a generic type must satisfy any constraints in the forall specifier on the type generator declaration, e.g., ©sumable©. 175 182 The instantiation then has the semantics that would result if the type parameters were substituted into the type generator declaration by macro substitution. 176 183 … … 220 227 \CFA defines situations where values of one type are automatically converted to another type. 221 228 These conversions are called \define{implicit conversion}s. 222 The programmer can request 223 \define{explicit conversion}s using cast expressions. 229 The programmer can request \define{explicit conversion}s using cast expressions. 224 230 225 231 … … 233 239 In \CFA, these conversions play a role in overload resolution, and collectively are called the \define{safe arithmetic conversion}s. 234 240 235 Let \lstinline@int$_r$@ and \lstinline@unsigned$_r$@be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$.236 Let \lstinline@unsigned$_{mr}$@be the unsigned integer type with maximal rank.241 Let ©int$_r$© and ©unsigned$_r$© be the signed and unsigned integer types with integer conversion rank\index{integer conversion rank}\index{rank|see{integer conversion rank}} $r$. 242 Let ©unsigned$_{mr}$© be the unsigned integer type with maximal rank. 237 243 238 244 The following conversions are \emph{direct} safe arithmetic conversions. … … 241 247 The \Index{integer promotion}s. 242 248 \item 243 For every rank $r$ greater than or equal to the rank of \lstinline@int@, conversion from \lstinline@int$_r$@ to \lstinline@unsigned$_r$@.244 \item 245 For every rank $r$ greater than or equal to the rank of \lstinline@int@, where \lstinline@int$_{r+1}$@ exists and can represent all values of \lstinline@unsigned$_r$@, conversion from \lstinline@unsigned$_r$@ to \lstinline@int$_{r+1}$@.246 \item 247 Conversion from \lstinline@unsigned$_{mr}$@ to \lstinline@float@.249 For every rank $r$ greater than or equal to the rank of ©int©, conversion from ©int$_r$© to ©unsigned$_r$©. 250 \item 251 For every rank $r$ greater than or equal to the rank of ©int©, where ©int$_{r+1}$© exists and can represent all values of ©unsigned$_r$©, conversion from ©unsigned$_r$© to ©int$_{r+1}$©. 252 \item 253 Conversion from ©unsigned$_{mr}$© to ©float©. 248 254 \item 249 255 Conversion from an enumerated type to its compatible integer type. 250 256 \item 251 Conversion from \lstinline@float@ to \lstinline@double@, and from \lstinline@double@ to \lstinline@long double@.252 \item 253 Conversion from \lstinline@float _Complex@ to \lstinline@double _Complex@, and from \lstinline@double _Complex@ to \lstinline@long double _Complex@.257 Conversion from ©float© to ©double©, and from ©double© to ©long double©. 258 \item 259 Conversion from ©float _Complex© to ©double _Complex©, and from ©double _Complex© to ©long double _Complex©. 254 260 \begin{sloppypar} 255 261 \item 256 Conversion from \lstinline@float _Imaginary@ to \lstinline@double _Imaginary@, and from \lstinline@double _Imaginary@ to \lstinline@long double _Imaginary@, if the implementation supports imaginary types.262 Conversion from ©float _Imaginary© to ©double _Imaginary©, and from ©double _Imaginary© to ©long double _Imaginary©, if the implementation supports imaginary types. 257 263 \end{sloppypar} 258 264 \end{itemize} 259 265 260 If type \lstinline@T@ can be converted to type \lstinline@U@ by a safe direct arithmetic conversion and type \lstinline@U@ can be converted to type \lstinline@V@ by a safe arithmetic conversion, then the conversion from \lstinline@T@ to type \lstinline@V@is an \emph{indirect} safe arithmetic conversion.266 If type ©T© can be converted to type ©U© by a safe direct arithmetic conversion and type ©U© can be converted to type ©V© by a safe arithmetic conversion, then the conversion from ©T© to type ©V© is an \emph{indirect} safe arithmetic conversion. 261 267 262 268 \begin{rationale} … … 272 278 \label{anon-conv} 273 279 274 If an expression's type is a pointer to a structure or union type that has a member that is an 275 \Index{anonymous structure} or an \Index{anonymous union}, it can be implicitly converted\index{implicit conversion} to a pointer to the anonymous structure's or anonymous union's type. 280 If an expression's type is a pointer to a structure or union type that has a member that is an \Index{anonymous structure} or an \Index{anonymous union}, it can be implicitly converted\index{implicit conversion} to a pointer to the anonymous structure's or anonymous union's type. 276 281 The result of the conversion is a pointer to the member. 277 282 … … 291 296 move_to( &cp1, &cp2 ); 292 297 \end{lstlisting} 293 Thanks to implicit conversion, the two arguments that \lstinline@move_by()@ receives are pointers to 294 \lstinline@cp1@'s second member and \lstinline@cp2@'s second member. 298 Thanks to implicit conversion, the two arguments that ©move_by()© receives are pointers to ©cp1©'s second member and ©cp2©'s second member. 295 299 296 300 … … 334 338 a direct safe arithmetic conversion; 335 339 \item 336 from any object type or incomplete type to \lstinline@void@;337 \item 338 from a pointer to any non- \lstinline@void@ type to a pointer to \lstinline@void@;340 from any object type or incomplete type to ©void©; 341 \item 342 from a pointer to any non-©void© type to a pointer to ©void©; 339 343 \item 340 344 from a pointer to any type to a pointer to a more qualified version of the type\index{qualified type}; … … 347 351 Conversions that are not safe conversions are \define{unsafe conversion}s. 348 352 \begin{rationale} 349 As in C, there is an implicit conversion from \lstinline@void *@to any pointer type.353 As in C, there is an implicit conversion from ©void *© to any pointer type. 350 354 This is clearly dangerous, and {\CC} does not have this implicit conversion. 351 355 \CFA\index{deficiencies!void * conversion} keeps it, in the interest of remaining as pure a superset of C as possible, but discourages it by making it unsafe. … … 373 377 \begin{itemize} 374 378 \item 375 The cost of an implicit conversion from \lstinline@int@ to \lstinline@long@ is 1. 376 The cost of an implicit conversion from \lstinline@long@ to \lstinline@double@ is 3, because it is defined in terms of conversions from \lstinline@long@ to \lstinline@unsigned long@, then to \lstinline@float@, and then to \lstinline@double@. 377 378 \item 379 If \lstinline@int@ can represent all the values of \lstinline@unsigned short@, then the cost of an implicit conversion from \lstinline@unsigned short@ to \lstinline@unsigned@ is 2: 380 \lstinline@unsigned short@ to \lstinline@int@ to \lstinline@unsigned@. 381 Otherwise, \lstinline@unsigned short@ is converted directly to \lstinline@unsigned@, and the cost is 1. 382 383 \item 384 If \lstinline@long@ can represent all the values of \lstinline@unsigned@, then the conversion cost of \lstinline@unsigned@ to \lstinline@long@ is 1. 379 The cost of an implicit conversion from ©int© to ©long© is 1. 380 The cost of an implicit conversion from ©long© to ©double© is 3, because it is defined in terms of conversions from ©long© to ©unsigned long©, then to ©float©, and then to ©double©. 381 382 \item 383 If ©int© can represent all the values of ©unsigned short©, then the cost of an implicit conversion from ©unsigned short© to ©unsigned© is 2: ©unsigned short© to ©int© to ©unsigned©. 384 Otherwise, ©unsigned short© is converted directly to ©unsigned©, and the cost is 1. 385 386 \item 387 If ©long© can represent all the values of ©unsigned©, then the conversion cost of ©unsigned© to ©long© is 1. 385 388 Otherwise, the conversion is an unsafe conversion, and its conversion cost is undefined. 386 389 \end{itemize} … … 390 393 \begin{syntax} 391 394 \oldlhs{keyword} 392 \rhs \lstinline@forall@393 \rhs \lstinline@lvalue@394 \rhs \lstinline@trait@395 \rhs \lstinline@dtype@396 \rhs \lstinline@ftype@397 \rhs \lstinline@otype@395 \rhs ©forall© 396 \rhs ©lvalue© 397 \rhs ©trait© 398 \rhs ©dtype© 399 \rhs ©ftype© 400 \rhs ©otype© 398 401 \end{syntax} 399 402 … … 402 405 403 406 \CFA allows operator \Index{overloading} by associating operators with special function identifiers. 404 Furthermore, the constants `` \lstinline@0@'' and ``\lstinline@1@'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers.407 Furthermore, the constants ``©0©'' and ``©1©'' have special status for many of C's data types (and for many programmer-defined data types as well), so \CFA treats them as overloadable identifiers. 405 408 Programmers can use these identifiers to declare functions and objects that implement operators and constants for their own types. 406 409 … … 411 414 \begin{syntax} 412 415 \oldlhs{identifier} 413 \rhs \lstinline@0@414 \rhs \lstinline@1@416 \rhs ©0© 417 \rhs ©1© 415 418 \end{syntax} 416 419 417 \index{constant identifiers}\index{identifiers!for constants} The tokens `` \lstinline@0@''\impl{0} and ``\lstinline@1@''\impl{1} are identifiers.420 \index{constant identifiers}\index{identifiers!for constants} The tokens ``©0©''\impl{0} and ``©1©''\impl{1} are identifiers. 418 421 No other tokens defined by the rules for integer constants are considered to be identifiers. 419 422 \begin{rationale} 420 Why `` \lstinline@0@'' and ``\lstinline@1@''? Those integers have special status in C.423 Why ``©0©'' and ``©1©''? Those integers have special status in C. 421 424 All scalar types can be incremented and decremented, which is defined in terms of adding or subtracting 1. 422 The operations `` \lstinline@&&@'', ``\lstinline@||@'', and ``\lstinline@!@'' can be applied to any scalar arguments, and are defined in terms of comparison against 0.425 The operations ``©&&©'', ``©||©'', and ``©!©'' can be applied to any scalar arguments, and are defined in terms of comparison against 0. 423 426 A \nonterm{constant-expression} that evaluates to 0 is effectively compatible with every pointer type. 424 427 425 428 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case. 426 429 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value. 427 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline@_Bool@.428 429 Why \emph{just} `` \lstinline@0@'' and ``\lstinline@1@''? Why not other integers? No other integers have special status in C.430 A facility that let programmers declare specific constants---`` \lstinline@const Rational 12@'', for instance---would not be much of an improvement.430 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©. 431 432 Why \emph{just} ``©0©'' and ``©1©''? Why not other integers? No other integers have special status in C. 433 A facility that let programmers declare specific constants---``©const Rational 12©'', for instance---would not be much of an improvement. 431 434 Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed. 432 435 The complexity of such a feature doesn't seem worth the gain. … … 444 447 \begin{tabular}[t]{ll} 445 448 %identifier & operation \\ \hline 446 \lstinline@?[?]@& subscripting \impl{?[?]}\\447 \lstinline@?()@& function call \impl{?()}\\448 \lstinline@?++@& postfix increment \impl{?++}\\449 \lstinline@?--@& postfix decrement \impl{?--}\\450 \lstinline@++?@& prefix increment \impl{++?}\\451 \lstinline@--?@& prefix decrement \impl{--?}\\452 \lstinline@*?@& dereference \impl{*?}\\453 \lstinline@+?@& unary plus \impl{+?}\\454 \lstinline@-?@& arithmetic negation \impl{-?}\\455 \lstinline@~?@& bitwise negation \impl{~?}\\456 \lstinline@!?@& logical complement \impl{"!?}\\457 \lstinline@?*?@& multiplication \impl{?*?}\\458 \lstinline@?/?@& division \impl{?/?}\\449 ©?[?]© & subscripting \impl{?[?]}\\ 450 ©?()© & function call \impl{?()}\\ 451 ©?++© & postfix increment \impl{?++}\\ 452 ©?--© & postfix decrement \impl{?--}\\ 453 ©++?© & prefix increment \impl{++?}\\ 454 ©--?© & prefix decrement \impl{--?}\\ 455 ©*?© & dereference \impl{*?}\\ 456 ©+?© & unary plus \impl{+?}\\ 457 ©-?© & arithmetic negation \impl{-?}\\ 458 ©~?© & bitwise negation \impl{~?}\\ 459 ©!?© & logical complement \impl{"!?}\\ 460 ©?*?© & multiplication \impl{?*?}\\ 461 ©?/?© & division \impl{?/?}\\ 459 462 \end{tabular}\hfil 460 463 \begin{tabular}[t]{ll} 461 464 %identifier & operation \\ \hline 462 \lstinline@?%?@& remainder \impl{?%?}\\463 \lstinline@?+?@& addition \impl{?+?}\\464 \lstinline@?-?@& subtraction \impl{?-?}\\465 \lstinline@?<<?@& left shift \impl{?<<?}\\466 \lstinline@?>>?@& right shift \impl{?>>?}\\467 \lstinline@?<?@& less than \impl{?<?}\\468 \lstinline@?<=?@& less than or equal \impl{?<=?}\\469 \lstinline@?>=?@& greater than or equal \impl{?>=?}\\470 \lstinline@?>?@& greater than \impl{?>?}\\471 \lstinline@?==?@& equality \impl{?==?}\\472 \lstinline@?!=?@& inequality \impl{?"!=?}\\473 \lstinline@?&?@& bitwise AND \impl{?&?}\\465 ©?%?© & remainder \impl{?%?}\\ 466 ©?+?© & addition \impl{?+?}\\ 467 ©?-?© & subtraction \impl{?-?}\\ 468 ©?<<?© & left shift \impl{?<<?}\\ 469 ©?>>?© & right shift \impl{?>>?}\\ 470 ©?<?© & less than \impl{?<?}\\ 471 ©?<=?© & less than or equal \impl{?<=?}\\ 472 ©?>=?© & greater than or equal \impl{?>=?}\\ 473 ©?>?© & greater than \impl{?>?}\\ 474 ©?==?© & equality \impl{?==?}\\ 475 ©?!=?© & inequality \impl{?"!=?}\\ 476 ©?&?© & bitwise AND \impl{?&?}\\ 474 477 \end{tabular}\hfil 475 478 \begin{tabular}[t]{ll} 476 479 %identifier & operation \\ \hline 477 \lstinline@?^?@& exclusive OR \impl{?^?}\\478 \lstinline@?|?@& inclusive OR \impl{?"|?}\\479 \lstinline@?=?@& simple assignment \impl{?=?}\\480 \lstinline@?*=?@& multiplication assignment \impl{?*=?}\\481 \lstinline@?/=?@& division assignment \impl{?/=?}\\482 \lstinline@?%=?@& remainder assignment \impl{?%=?}\\483 \lstinline@?+=?@& addition assignment \impl{?+=?}\\484 \lstinline@?-=?@& subtraction assignment \impl{?-=?}\\485 \lstinline@?<<=?@& left-shift assignment \impl{?<<=?}\\486 \lstinline@?>>=?@& right-shift assignment \impl{?>>=?}\\487 \lstinline@?&=?@& bitwise AND assignment \impl{?&=?}\\488 \lstinline@?^=?@& exclusive OR assignment \impl{?^=?}\\489 \lstinline@?|=?@& inclusive OR assignment \impl{?"|=?}\\480 ©?^?© & exclusive OR \impl{?^?}\\ 481 ©?|?© & inclusive OR \impl{?"|?}\\ 482 ©?=?© & simple assignment \impl{?=?}\\ 483 ©?*=?© & multiplication assignment \impl{?*=?}\\ 484 ©?/=?© & division assignment \impl{?/=?}\\ 485 ©?%=?© & remainder assignment \impl{?%=?}\\ 486 ©?+=?© & addition assignment \impl{?+=?}\\ 487 ©?-=?© & subtraction assignment \impl{?-=?}\\ 488 ©?<<=?© & left-shift assignment \impl{?<<=?}\\ 489 ©?>>=?© & right-shift assignment \impl{?>>=?}\\ 490 ©?&=?© & bitwise AND assignment \impl{?&=?}\\ 491 ©?^=?© & exclusive OR assignment \impl{?^=?}\\ 492 ©?|=?© & inclusive OR assignment \impl{?"|=?}\\ 490 493 \end{tabular} 491 494 \hfil … … 502 505 503 506 \begin{rationale} 504 The use of `` \lstinline@?@'' in identifiers means that some C programs are not \CFA programs. For instance, the sequence of characters ``\lstinline@(i < 0)?--i:i@'' is legal in a C program, but a505 \CFA compiler detects a syntax error because it treats `` \lstinline@?--@'' as an identifier, not as the two tokens ``\lstinline@?@'' and ``\lstinline@--@''.507 The use of ``©?©'' in identifiers means that some C programs are not \CFA programs. For instance, the sequence of characters ``©(i < 0)?--i:i©'' is legal in a C program, but a 508 \CFA compiler detects a syntax error because it treats ``©?--©'' as an identifier, not as the two tokens ``©?©'' and ``©--©''. 506 509 \end{rationale} 507 510 … … 510 513 \begin{itemize} 511 514 \item 512 The logical operators ``\lstinline@&&@'' and ``\lstinline@||@'', and the conditional operator 513 ``\lstinline@?:@''. 515 The logical operators ``©&&©'' and ``©||©'', and the conditional operator ``©?:©''. 514 516 These operators do not always evaluate their operands, and hence can not be properly defined by functions unless some mechanism like call-by-name is added to the language. 515 Note that the definitions of `` \lstinline@&&@'' and ``\lstinline@||@'' say that they work by checking that their arguments are unequal to 0, so defining ``\lstinline@!=@'' and ``\lstinline@0@'' for user-defined types is enough to allow them to be used in logical expressions.517 Note that the definitions of ``©&&©'' and ``©||©'' say that they work by checking that their arguments are unequal to 0, so defining ``©!=©'' and ``©0©'' for user-defined types is enough to allow them to be used in logical expressions. 516 518 517 519 \item … … 522 524 \item 523 525 The ``address of'' operator. 524 It would seem useful to define a unary `` \lstinline@&@'' operator that returns values of some programmer-defined pointer-like type.526 It would seem useful to define a unary ``©&©'' operator that returns values of some programmer-defined pointer-like type. 525 527 The problem lies with the type of the operator. 526 Consider the expression ``\lstinline@p = &x@'', where \lstinline@x@ is of type 527 \lstinline@T@ and \lstinline@p@ has the programmer-defined type \lstinline@T_ptr@. 528 The expression might be treated as a call to the unary function ``\lstinline@&?@''. 529 Now what is the type of the function's parameter? It can not be \lstinline@T@, because then \lstinline@x@ would be passed by value, and there is no way to create a useful pointer-like result from a value. 530 Hence the parameter must have type \lstinline@T *@. 531 But then the expression must be rewritten as ``\lstinline@p = &?( &x )@'' 528 Consider the expression ``©p = &x©'', where ©x© is of type ©T© and ©p© has the programmer-defined type ©T_ptr©. 529 The expression might be treated as a call to the unary function ``©&?©''. 530 Now what is the type of the function's parameter? It can not be ©T©, because then ©x© would be passed by value, and there is no way to create a useful pointer-like result from a value. 531 Hence the parameter must have type ©T *©. 532 But then the expression must be rewritten as ``©p = &?( &x )©'' 532 533 ---which doesn't seem like progress! 533 534 534 535 The rule for address-of expressions would have to be something like ``keep applying address-of functions until you get one that takes a pointer argument, then use the built-in operator and stop''. 535 It seems simpler to define a conversion function from \lstinline@T *@ to \lstinline@T_ptr@.536 537 \item 538 The \lstinline@sizeof@operator.536 It seems simpler to define a conversion function from ©T *© to ©T_ptr©. 537 538 \item 539 The ©sizeof© operator. 539 540 It is already defined for every object type, and intimately tied into the language's storage allocation model. 540 541 Redefining it seems pointless. 541 542 542 543 \item 543 The ``member of'' operators `` \lstinline@.@'' and ``\lstinline@->@''.544 The ``member of'' operators ``©.©'' and ``©->©''. 544 545 These are not really infix operators, since their right ``operand'' is not a value or object. 545 546 … … 578 579 The ``fewest unsafe conversions'' rule ensures that the usual conversions are done, if possible. 579 580 The ``lowest total expression cost'' rule chooses the proper common type. 580 The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: \lstinline@(double)-i@ will be preferred to \lstinline@-(double)i@.581 The odd-looking ``highest argument conversion cost'' rule ensures that, when unary expressions must be converted, conversions of function results are preferred to conversion of function arguments: ©(double)-i© will be preferred to ©-(double)i©. 581 582 582 583 The ``least polymorphic'' rule reduces the number of polymorphic function calls, since such functions are presumably more expensive than monomorphic functions and since the more specific function is presumably more appropriate. 583 It also gives preference to monomorphic values (such as the 584 \lstinline@int@ \lstinline@0@) over polymorphic values (such as the \Index{null pointer} 585 \lstinline@0@\use{0}). 584 It also gives preference to monomorphic values (such as the ©int© ©0©) over polymorphic values (such as the \Index{null pointer} ©0©\use{0}). 586 585 However, interpretations that call polymorphic functions are preferred to interpretations that perform unsafe conversions, because those conversions potentially lose accuracy or violate strong typing. 587 586 … … 603 602 \begin{rationale} 604 603 Predefined functions and constants have internal linkage because that simplifies optimization in traditional compile-and-link environments. 605 For instance, `` \lstinline@an_int + an_int@'' is equivalent to ``\lstinline@?+?(an_int, an_int)@''.604 For instance, ``©an_int + an_int©'' is equivalent to ``©?+?(an_int, an_int)©''. 606 605 If integer addition has not been redefined in the current scope, a compiler can generate code to perform the addition directly. 607 606 If predefined functions had external linkage, this optimization would be difficult. … … 629 628 \rhs \nonterm{constant} 630 629 \rhs \nonterm{string-literal} 631 \rhs \lstinline@(@ \nonterm{expression} \lstinline@)@630 \rhs ©(© \nonterm{expression} ©)© 632 631 \rhs \nonterm{generic-selection} 633 632 \end{syntax} … … 645 644 646 645 A \nonterm{constant} or \nonterm{string-literal} has one valid interpretation, which has the type and value defined by {\c11}. 647 The predefined integer identifiers `` \lstinline@1@'' and ``\lstinline@0@'' have the integer values 1 and 0, respectively.648 The other two predefined `` \lstinline@0@'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type.646 The predefined integer identifiers ``©1©'' and ``©0©'' have the integer values 1 and 0, respectively. 647 The other two predefined ``©0©'' identifiers are bound to polymorphic pointer values that, when specialized\index{specialization} with a data type or function type respectively, produce a null pointer of that type. 649 648 650 649 A parenthesised expression has the same interpretations as the contained \nonterm{expression}. 651 650 652 651 \examples 653 The expression \lstinline@(void *)0@\use{0} specializes the (polymorphic) null pointer to a null pointer to \lstinline@void@. \lstinline@(const void *)0@ does the same, and also uses a safe conversion from \lstinline@void *@ to \lstinline@const void *@. 654 In each case, the null pointer conversion is better\index{best valid interpretations} than the unsafe conversion of the integer 655 \lstinline@0@ to a pointer. 652 The expression ©(void *)0©\use{0} specializes the (polymorphic) null pointer to a null pointer to ©void©. ©(const void *)0© does the same, and also uses a safe conversion from ©void *© to ©const void *©. 653 In each case, the null pointer conversion is better\index{best valid interpretations} than the unsafe conversion of the integer ©0© to a pointer. 656 654 657 655 \begin{rationale} … … 659 657 660 658 \CFA does not have C's concept of ``null pointer constants'', which are not typed values but special strings of tokens. 661 The C token ``\lstinline@0@'' is an expression of type \lstinline@int@ with the value ``zero'', and it \emph{also} is a null pointer constant. 662 Similarly, 663 ``\lstinline@(void *)0@ is an expression of type \lstinline@(void *)@ whose value is a null pointer, and it also is a null pointer constant. 664 However, in C, ``\lstinline@(void *)(void *)0@'' is 659 The C token ``©0©'' is an expression of type ©int© with the value ``zero'', and it \emph{also} is a null pointer constant. 660 Similarly, ``©(void *)0© is an expression of type ©(void *)© whose value is a null pointer, and it also is a null pointer constant. 661 However, in C, ``©(void *)(void *)0©'' is 665 662 \emph{not} a null pointer constant, even though it is null-valued, a pointer, and constant! The semantics of C expressions contain many special cases to deal with subexpressions that are null pointer constants. 666 663 … … 669 666 \begin{lstlisting} 670 667 forall( dtype DT ) DT * const 0; 671 \end{lstlisting} means that \lstinline@0@is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type.668 \end{lstlisting} means that ©0© is a polymorphic object, and contains a value that can have \emph{any} pointer-to-object type or pointer-to-incomplete type. 672 669 The only such value is the null pointer. 673 670 Therefore the type \emph{alone} is enough to identify a null pointer. … … 679 676 680 677 \constraints The best interpretation of the controlling expression shall be unambiguous\index{ambiguous interpretation}, and shall have type compatible with at most one of the types named in its generic association list. 681 If a generic selection has no \lstinline@default@generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list.678 If a generic selection has no ©default© generic association, the best interpretation of its controlling expression shall have type compatible with exactly one of the types named in its generic association list. 682 679 683 680 \semantics … … 690 687 \lhs{postfix-expression} 691 688 \rhs \nonterm{primary-expression} 692 \rhs \nonterm{postfix-expression} \lstinline@[@ \nonterm{expression} \lstinline@]@693 \rhs \nonterm{postfix-expression} \lstinline@(@694 \nonterm{argument-expression-list}\opt \lstinline@)@695 \rhs \nonterm{postfix-expression} \lstinline@.@\nonterm{identifier}696 \rhs \nonterm{postfix-expression} \lstinline@->@\nonterm{identifier}697 \rhs \nonterm{postfix-expression} \lstinline@++@698 \rhs \nonterm{postfix-expression} \lstinline@--@699 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@}@700 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@ \lstinline@{@ \nonterm{initializer-list} \lstinline@,@ \lstinline@}@689 \rhs \nonterm{postfix-expression} ©[© \nonterm{expression} ©]© 690 \rhs \nonterm{postfix-expression} ©(© 691 \nonterm{argument-expression-list}\opt ©)© 692 \rhs \nonterm{postfix-expression} ©.© \nonterm{identifier} 693 \rhs \nonterm{postfix-expression} ©->© \nonterm{identifier} 694 \rhs \nonterm{postfix-expression} ©++© 695 \rhs \nonterm{postfix-expression} ©--© 696 \rhs ©(© \nonterm{type-name} ©)© ©{© \nonterm{initializer-list} ©}© 697 \rhs ©(© \nonterm{type-name} ©)© ©{© \nonterm{initializer-list} ©,© ©}© 701 698 \lhs{argument-expression-list} 702 699 \rhs \nonterm{assignment-expression} 703 \rhs \nonterm{argument-expression-list} \lstinline@,@700 \rhs \nonterm{argument-expression-list} ©,© 704 701 \nonterm{assignment-expression} 705 702 \end{syntax} … … 707 704 \rewriterules 708 705 \begin{lstlisting} 709 a[b] §\rewrite§?[?]( b, a ) // if a has integer type§\use{?[?]}§710 a[b] §\rewrite§?[?]( a, b ) // otherwise711 a( §\emph{arguments}§ ) §\rewrite§?()( a, §\emph{arguments}§ )§\use{?()}§712 a++ §\rewrite§?++(&( a ))§\use{?++}§713 a-- §\rewrite§?--(&( a ))§\use{?--}§706 a[b] => ?[?]( b, a ) // if a has integer type§\use{?[?]}§ 707 a[b] => ?[?]( a, b ) // otherwise 708 a( §\emph{arguments}§ ) => ?()( a, §\emph{arguments}§ )§\use{?()}§ 709 a++ => ?++(&( a ))§\use{?++}§ 710 a-- => ?--(&( a ))§\use{?--}§ 714 711 \end{lstlisting} 715 712 … … 739 736 The interpretations of subscript expressions are the interpretations of the corresponding function call expressions. 740 737 \begin{rationale} 741 C defines subscripting as pointer arithmetic in a way that makes \lstinline@a[i]@ and 742 \lstinline@i[a]@ equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of \lstinline@?[?]@. 738 C defines subscripting as pointer arithmetic in a way that makes ©a[i]© and ©i[a]© equivalent. \CFA provides the equivalence through a rewrite rule to reduce the number of overloadings of ©?[?]©. 743 739 744 740 Subscript expressions are rewritten as function calls that pass the first parameter by value. 745 741 This is somewhat unfortunate, since array-like types tend to be large. 746 The alternative is to use the rewrite rule `` \lstinline@a[b]@ \rewrite \lstinline@?[?](&(a), b)@''.747 However, C semantics forbid this approach: the \lstinline@a@ in ``\lstinline@a[b]@'' can be an arbitrary pointer value, which does not have an address.742 The alternative is to use the rewrite rule ``©a[b] => ?[?](&(a), b)©''. 743 However, C semantics forbid this approach: the ©a© in ``©a[b]©'' can be an arbitrary pointer value, which does not have an address. 748 744 749 745 The repetitive form of the predefined identifiers shows up a deficiency\index{deficiencies!pointers … … 760 756 \nonterm{postfix-expression} in a function call may have some interpretations that are function designators and some that are not. 761 757 762 For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named `` \lstinline@?()@''.758 For those interpretations of the \nonterm{postfix-expression} that are not function designators, the expression is rewritten and becomes a call of a function named ``©?()©''. 763 759 The valid interpretations of the rewritten expression are determined in the manner described below. 764 760 … … 767 763 \begin{itemize} 768 764 \item if the argument corresponds to a parameter in the function designator's prototype, the argument interpretation must have the same type as the corresponding parameter, or be implicitly convertible to the parameter's type 769 \item if the function designator's type does not include a prototype or if the argument corresponds to 770 ``\lstinline@...@'' in a prototype, a \Index{default argument promotion} is applied to it. 765 \item if the function designator's type does not include a prototype or if the argument corresponds to ``©...©'' in a prototype, a \Index{default argument promotion} is applied to it. 771 766 \end{itemize} 772 767 The type of the valid interpretation is the return type of the function designator. 773 768 774 For those combinations where the interpretation of the \nonterm{postfix-expression} is a 775 \Index{polymorphic function} designator and the function designator accepts the number of arguments given, there shall be at least one set of \define{implicit argument}s for the implicit parameters such that 769 For those combinations where the interpretation of the \nonterm{postfix-expression} is a \Index{polymorphic function} designator and the function designator accepts the number of arguments given, there shall be at least one set of \define{implicit argument}s for the implicit parameters such that 776 770 \begin{itemize} 777 771 \item 778 If the declaration of the implicit parameter uses \Index{type-class} \lstinline@type@\use{type}, the implicit argument must be an object type;779 if it uses \lstinline@dtype@, the implicit argument must be an object type or an incomplete type;780 and if it uses \lstinline@ftype@, the implicit argument must be a function type.772 If the declaration of the implicit parameter uses \Index{type-class} ©type©\use{type}, the implicit argument must be an object type; 773 if it uses ©dtype©, the implicit argument must be an object type or an incomplete type; 774 and if it uses ©ftype©, the implicit argument must be a function type. 781 775 782 776 \item if an explicit parameter's type uses any implicit parameters, then the corresponding explicit argument must have a type that is (or can be safely converted\index{safe conversion} to) the type produced by substituting the implicit arguments for the implicit parameters in the explicit parameter type. … … 797 791 \begin{rationale} 798 792 One desirable property of a polymorphic programming language is \define{generalizability}: the ability to replace an abstraction with a more general but equivalent abstraction without requiring changes in any of the uses of the original\cite{Cormack90}. 799 For instance, it should be possible to replace a function ``\lstinline@int f( int );@'' with ``\lstinline@forall( otype T ) T f( T );@'' without affecting any calls of \lstinline@f@. 800 801 \CFA\index{deficiencies!generalizability} does not fully possess this property, because 802 \Index{unsafe conversion} are not done when arguments are passed to polymorphic parameters. 793 For instance, it should be possible to replace a function ``©int f( int );©'' with ``©forall( otype T ) T f( T );©'' without affecting any calls of ©f©. 794 795 \CFA\index{deficiencies!generalizability} does not fully possess this property, because \Index{unsafe conversion} are not done when arguments are passed to polymorphic parameters. 803 796 Consider 804 797 \begin{lstlisting} … … 811 804 f = g( d, f ); // (3) (unsafe conversion to float) 812 805 \end{lstlisting} 813 If \lstinline@g@ was replaced by ``\lstinline@forall( otype T ) T g( T, T );@'', the first and second calls would be unaffected, but the third would change: \lstinline@f@ would be converted to 814 \lstinline@double@, and the result would be a \lstinline@double@. 815 816 Another example is the function ``\lstinline@void h( int *);@''. 817 This function can be passed a 818 \lstinline@void *@ argument, but the generalization ``\lstinline@forall( otype T ) void h( T *);@'' can not. 819 In this case, \lstinline@void@ is not a valid value for \lstinline@T@ because it is not an object type. 820 If unsafe conversions were allowed, \lstinline@T@ could be inferred to be \emph{any} object type, which is undesirable. 806 If ©g© was replaced by ``©forall( otype T ) T g( T, T );©'', the first and second calls would be unaffected, but the third would change: ©f© would be converted to ©double©, and the result would be a ©double©. 807 808 Another example is the function ``©void h( int *);©''. 809 This function can be passed a ©void *© argument, but the generalization ``©forall( otype T ) void h( T *);©'' can not. 810 In this case, ©void© is not a valid value for ©T© because it is not an object type. 811 If unsafe conversions were allowed, ©T© could be inferred to be \emph{any} object type, which is undesirable. 821 812 \end{rationale} 822 813 823 814 \examples 824 A function called `` \lstinline@?()@'' might be part of a numerical differentiation package.815 A function called ``©?()©'' might be part of a numerical differentiation package. 825 816 \begin{lstlisting} 826 817 extern otype Derivative; … … 833 824 d = sin_dx( 12.9 ); 834 825 \end{lstlisting} 835 Here, the only interpretation of \lstinline@sin_dx@ is as an object of type \lstinline@Derivative@.836 For that interpretation, the function call is treated as `` \lstinline@?()( sin_dx, 12.9 )@''.826 Here, the only interpretation of ©sin_dx© is as an object of type ©Derivative©. 827 For that interpretation, the function call is treated as ``©?()( sin_dx, 12.9 )©''. 837 828 \begin{lstlisting} 838 829 int f( long ); // (1) … … 841 832 int i = f( 5 ); // calls (1) 842 833 \end{lstlisting} 843 Function (1) provides a valid interpretation of `` \lstinline@f( 5 )@'', using an implicit \lstinline@int@ to \lstinline@long@conversion.844 The other functions do not, since the second requires two arguments, and since there is no implicit conversion from \lstinline@int@ to \lstinline@int *@that could be used with the third function.834 Function (1) provides a valid interpretation of ``©f( 5 )©'', using an implicit ©int© to ©long© conversion. 835 The other functions do not, since the second requires two arguments, and since there is no implicit conversion from ©int© to ©int *© that could be used with the third function. 845 836 846 837 \begin{lstlisting} … … 848 839 double d = h( 1.5 ); 849 840 \end{lstlisting} 850 ``\lstinline@1.5@'' is a \lstinline@double@ constant, so \lstinline@T@ is inferred to be 851 \lstinline@double@, and the result of the function call is a \lstinline@double@. 841 ``©1.5©'' is a ©double© constant, so ©T© is inferred to be ©double©, and the result of the function call is a ©double©. 852 842 853 843 \begin{lstlisting} 854 844 forall( otype T, otype U ) void g( T, U ); // (4) 855 845 forall( otype T ) void g( T, T ); // (5) 856 forall( otype T ) void g( T, long ); 846 forall( otype T ) void g( T, long ); // (6) 857 847 void g( long, long ); // (7) 858 848 double d; 859 849 int i; 860 850 int *p; 861 g( d, d ); // calls (5)862 g( d, i ); // calls (6)863 g( i, i ); // calls (7)864 g( i, p ); // calls (4)865 \end{lstlisting} 866 The first call has valid interpretations for all four versions of \lstinline@g@. (6) and (7) are discarded because they involve unsafe \lstinline@double@-to-\lstinline@long@conversions. (5) is chosen because it is less polymorphic than (4).851 g( d, d ); // calls (5) 852 g( d, i ); // calls (6) 853 g( i, i ); // calls (7) 854 g( i, p ); // calls (4) 855 \end{lstlisting} 856 The first call has valid interpretations for all four versions of ©g©. (6) and (7) are discarded because they involve unsafe ©double©-to-©long© conversions. (5) is chosen because it is less polymorphic than (4). 867 857 868 858 For the second call, (7) is again discarded. 869 Of the remaining interpretations for (4), (5), and (6) (with \lstinline@i@ converted to \lstinline@long@), (6) is chosen because it is the least polymorphic.859 Of the remaining interpretations for (4), (5), and (6) (with ©i© converted to ©long©), (6) is chosen because it is the least polymorphic. 870 860 871 861 The third call has valid interpretations for all of the functions; … … 883 873 shuffle( 9, 10 ); 884 874 \end{lstlisting} 885 The only possibility for \lstinline@U@ is \lstinline@double@, because that is the type used in the only visible \lstinline@max@ function. 9 and 10 must be converted to \lstinline@double@, and 886 \lstinline@min@ must be specialized with \lstinline@T@ bound to \lstinline@double@. 887 \begin{lstlisting} 888 extern void q( int ); // (8) 889 extern void q( void * ); // (9) 875 The only possibility for ©U© is ©double©, because that is the type used in the only visible ©max© function. 9 and 10 must be converted to ©double©, and ©min© must be specialized with ©T© bound to ©double©. 876 \begin{lstlisting} 877 extern void q( int ); // (8) 878 extern void q( void * ); // (9) 890 879 extern void r(); 891 880 q( 0 ); 892 881 r( 0 ); 893 882 \end{lstlisting} 894 The \lstinline@int 0@ could be passed to (8), or the \lstinline@(void *)@ \Index{specialization} of the null pointer\index{null pointer} \lstinline@0@\use{0} could be passed to (9).895 The former is chosen because the \lstinline@int@ \lstinline@0@is \Index{less polymorphic}.896 For the same reason, \lstinline@int@ \lstinline@0@ is passed to \lstinline@r()@, even though it has \emph{no} declared parameter types.883 The ©int 0© could be passed to (8), or the ©(void *)© \Index{specialization} of the null pointer\index{null pointer} ©0©\use{0} could be passed to (9). 884 The former is chosen because the ©int© ©0© is \Index{less polymorphic}. 885 For the same reason, ©int© ©0© is passed to ©r()©, even though it has \emph{no} declared parameter types. 897 886 898 887 899 888 \subsubsection{Structure and union members} 900 889 901 \semantics In the member selection expression ``\lstinline@s@.\lstinline@m@'', there shall be at least one interpretation of \lstinline@s@ whose type is a structure type or union type containing a member named \lstinline@m@. 902 If two or more interpretations of \lstinline@s@ have members named 903 \lstinline@m@ with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members. 904 If an interpretation of \lstinline@s@ has a member \lstinline@m@ whose type is not compatible with any other 905 \lstinline@s@'s \lstinline@m@, then the expression has an interpretation with the member's type. 890 \semantics In the member selection expression ``©s©.©m©'', there shall be at least one interpretation of ©s© whose type is a structure type or union type containing a member named ©m©. 891 If two or more interpretations of ©s© have members named ©m© with mutually compatible types, then the expression has an \Index{ambiguous interpretation} whose type is the composite type of the types of the members. 892 If an interpretation of ©s© has a member ©m© whose type is not compatible with any other ©s©'s ©m©, then the expression has an interpretation with the member's type. 906 893 The expression has no other interpretations. 907 894 908 The expression `` \lstinline@p->m@'' has the same interpretations as the expression ``\lstinline@(*p).m@''.895 The expression ``©p->m©'' has the same interpretations as the expression ``©(*p).m©''. 909 896 910 897 … … 1001 988 * ?--( _Atomic const restrict volatile T * _Atomic restrict volatile * ); 1002 989 \end{lstlisting} 1003 For every extended integer type \lstinline@X@there exist990 For every extended integer type ©X© there exist 1004 991 % Don't use predefined: keep this out of prelude.cf. 1005 992 \begin{lstlisting} … … 1007 994 ?--( volatile X * ), ?--( _Atomic volatile X * ); 1008 995 \end{lstlisting} 1009 For every complete enumerated type \lstinline@E@there exist996 For every complete enumerated type ©E© there exist 1010 997 % Don't use predefined: keep this out of prelude.cf. 1011 998 \begin{lstlisting} … … 1015 1002 1016 1003 \begin{rationale} 1017 Note that `` \lstinline@++@'' and ``\lstinline@--@'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue.1004 Note that ``©++©'' and ``©--©'' are rewritten as function calls that are given a pointer to that operand. (This is true of all operators that modify an operand.) As Hamish Macdonald has pointed out, this forces the modified operand of such expressions to be an lvalue. 1018 1005 This partially enforces the C semantic rule that such operands must be \emph{modifiable} lvalues. 1019 1006 \end{rationale} … … 1021 1008 \begin{rationale} 1022 1009 In C, a semantic rule requires that pointer operands of increment and decrement be pointers to object types. 1023 Hence, \lstinline@void *@objects cannot be incremented.1024 In \CFA, the restriction follows from the use of a \lstinline@type@ parameter in the predefined function definitions, as opposed to \lstinline@dtype@, since only object types can be inferred arguments corresponding to the type parameter \lstinline@T@.1010 Hence, ©void *© objects cannot be incremented. 1011 In \CFA, the restriction follows from the use of a ©type© parameter in the predefined function definitions, as opposed to ©dtype©, since only object types can be inferred arguments corresponding to the type parameter ©T©. 1025 1012 \end{rationale} 1026 1013 … … 1040 1027 \end{lstlisting} 1041 1028 \begin{sloppypar} 1042 Since \lstinline@&(vs)@ has type \lstinline@volatile short int *@, the best valid interpretation of 1043 \lstinline@vs++@ calls the \lstinline@?++@ function with the \lstinline@volatile short *@ parameter. 1044 \lstinline@s++@ does the same, applying the safe conversion from \lstinline@short int *@ to \lstinline@volatile short int *@. 1045 Note that there is no conversion that adds an \lstinline@_Atomic@ qualifier, so the \lstinline@_Atomic volatile short int@ overloading does not provide a valid interpretation. 1029 Since ©&(vs)© has type ©volatile short int *©, the best valid interpretation of ©vs++© calls the ©?++© function with the ©volatile short *© parameter. 1030 ©s++© does the same, applying the safe conversion from ©short int *© to ©volatile short int *©. 1031 Note that there is no conversion that adds an ©_Atomic© qualifier, so the ©_Atomic volatile short int© overloading does not provide a valid interpretation. 1046 1032 \end{sloppypar} 1047 1033 1048 There is no safe conversion from \lstinline@const short int *@ to \lstinline@volatile short int *@, and no \lstinline@?++@ function that accepts a \lstinline@const *@ parameter, so \lstinline@cs++@has no valid interpretations.1049 1050 The best valid interpretation of \lstinline@as++@ calls the \lstinline@short ?++@ function with the \lstinline@_Atomic volatile short int *@ parameter, applying a safe conversion to add the \lstinline@volatile@qualifier.1034 There is no safe conversion from ©const short int *© to ©volatile short int *©, and no ©?++© function that accepts a ©const *© parameter, so ©cs++© has no valid interpretations. 1035 1036 The best valid interpretation of ©as++© calls the ©short ?++© function with the ©_Atomic volatile short int *© parameter, applying a safe conversion to add the ©volatile© qualifier. 1051 1037 \begin{lstlisting} 1052 1038 char * const restrict volatile * restrict volatile pqpc; … … 1055 1041 ppc++; 1056 1042 \end{lstlisting} 1057 Since \lstinline@&(pqpc)@ has type \lstinline@char * const restrict volatile * restrict volatile *@, the best valid interpretation of \lstinline@pqpc++@ calls the polymorphic \lstinline@?++@ function with the \lstinline@const restrict volatile T * restrict volatile *@ parameter, inferring \lstinline@T@ to be \lstinline@char *@.1058 1059 \lstinline@ppc++@ calls the same function, again inferring \lstinline@T@ to be \lstinline@char *@, and using the safe conversions from \lstinline@T@ to \lstinline@T const@ \lstinline@restrict volatile@.1043 Since ©&(pqpc)© has type ©char * const restrict volatile * restrict volatile *©, the best valid interpretation of ©pqpc++© calls the polymorphic ©?++© function with the ©const restrict volatile T * restrict volatile *© parameter, inferring ©T© to be ©char *©. 1044 1045 ©ppc++© calls the same function, again inferring ©T© to be ©char *©, and using the safe conversions from ©T© to ©T const© ©restrict volatile©. 1060 1046 1061 1047 \begin{rationale} … … 1071 1057 \begin{enumerate} 1072 1058 \item 1073 `` \lstinline@char * p; p++;@''.1074 The argument to \lstinline@?++@ has type \lstinline@char * *@, and the result has type \lstinline@char *@.1075 The expression would be valid if \lstinline@?++@were declared by1059 ``©char * p; p++;©''. 1060 The argument to ©?++© has type ©char * *©, and the result has type ©char *©. 1061 The expression would be valid if ©?++© were declared by 1076 1062 \begin{lstlisting} 1077 1063 forall( otype T ) T * ?++( T * * ); 1078 \end{lstlisting} with \lstinline@T@ inferred to be \lstinline@char@.1079 1080 \item 1081 `` \lstinline@char *restrict volatile qp; qp++@''.1082 The result again has type \lstinline@char *@, but the argument now has type \lstinline@char *restrict volatile *@, so it cannot be passed to the hypothetical function declared in point 1.1064 \end{lstlisting} with ©T© inferred to be ©char©. 1065 1066 \item 1067 ``©char *restrict volatile qp; qp++©''. 1068 The result again has type ©char *©, but the argument now has type ©char *restrict volatile *©, so it cannot be passed to the hypothetical function declared in point 1. 1083 1069 Hence the actual predefined function is 1084 1070 \begin{lstlisting} 1085 1071 forall( otype T ) T * ?++( T * restrict volatile * ); 1086 \end{lstlisting} which also accepts a \lstinline@char * *@ argument, because of the safe conversions that add 1087 \lstinline@volatile@ and \lstinline@restrict@ qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.) 1088 1089 \item 1090 ``\lstinline@char *_Atomic ap; ap++@''. 1091 The result again has type \lstinline@char *@, but no safe conversion adds an \lstinline@_Atomic@ qualifier, so the function in point 2 is not applicable. 1092 A separate overloading of \lstinline@?++@ is required. 1093 1094 \item 1095 ``\lstinline@char const volatile * pq; pq++@''. 1096 Here the result has type 1097 \lstinline@char const volatile *@, so a new overloading is needed: 1072 \end{lstlisting} which also accepts a ©char * *© argument, because of the safe conversions that add ©volatile© and ©restrict© qualifiers. (The parameter is not const-qualified, so constant pointers cannot be incremented.) 1073 1074 \item 1075 ``©char *_Atomic ap; ap++©''. 1076 The result again has type ©char *©, but no safe conversion adds an ©_Atomic© qualifier, so the function in point 2 is not applicable. 1077 A separate overloading of ©?++© is required. 1078 1079 \item 1080 ``©char const volatile * pq; pq++©''. 1081 Here the result has type ©char const volatile *©, so a new overloading is needed: 1098 1082 \begin{lstlisting} 1099 1083 forall( otype T ) T const volatile * ?++( T const volatile *restrict volatile * ); … … 1102 1086 1103 1087 \item 1104 `` \lstinline@float *restrict * prp; prp++@''.1105 The \lstinline@restrict@ qualifier is handled just like \lstinline@const@ and \lstinline@volatile@in the previous case:1088 ``©float *restrict * prp; prp++©''. 1089 The ©restrict© qualifier is handled just like ©const© and ©volatile© in the previous case: 1106 1090 \begin{lstlisting} 1107 1091 forall( otype T ) T restrict * ?++( T restrict *restrict volatile * ); 1108 \end{lstlisting} with \lstinline@T@ inferred to be \lstinline@float *@.1109 This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and \lstinline@T@is not syntactically a pointer type. \CFA loosens the constraint.1092 \end{lstlisting} with ©T© inferred to be ©float *©. 1093 This looks odd, because {\c11} contains a constraint that requires restrict-qualified types to be pointer-to-object types, and ©T© is not syntactically a pointer type. \CFA loosens the constraint. 1110 1094 \end{enumerate} 1111 1095 \end{rationale} … … 1123 1107 \lhs{unary-expression} 1124 1108 \rhs \nonterm{postfix-expression} 1125 \rhs \lstinline@++@\nonterm{unary-expression}1126 \rhs \lstinline@--@\nonterm{unary-expression}1109 \rhs ©++© \nonterm{unary-expression} 1110 \rhs ©--© \nonterm{unary-expression} 1127 1111 \rhs \nonterm{unary-operator} \nonterm{cast-expression} 1128 \rhs \lstinline@sizeof@\nonterm{unary-expression}1129 \rhs \lstinline@sizeof@ \lstinline@(@ \nonterm{type-name} \lstinline@)@1130 \lhs{unary-operator} one of \rhs \lstinline@&@ \lstinline@*@ \lstinline@+@ \lstinline@-@ \lstinline@~@ \lstinline@!@1112 \rhs ©sizeof© \nonterm{unary-expression} 1113 \rhs ©sizeof© ©(© \nonterm{type-name} ©)© 1114 \lhs{unary-operator} one of \rhs ©&© ©*© ©+© ©-© ©~© ©!© 1131 1115 \end{syntax} 1132 1116 1133 1117 \rewriterules 1134 1118 \begin{lstlisting} 1135 *a §\rewrite§ *?( a )§\use{*?}§1136 +a §\rewrite§ +?( a )§\use{+?}§1137 -a §\rewrite§ -?( a )§\use{-?}§1138 ~a §\rewrite§ ~?( a )§\use{~?}§1139 !a §\rewrite§ !?( a )§\use{"!?}§1140 ++a §\rewrite§ ++?(&( a ))§\use{++?}§1141 --a §\rewrite§ --?(&( a ))§\use{--?}§1119 *a => *?( a )§\use{*?}§ 1120 +a => +?( a )§\use{+?}§ 1121 -a => -?( a )§\use{-?}§ 1122 ~a => ~?( a )§\use{~?}§ 1123 !a => !?( a )§\use{"!?}§ 1124 ++a => ++?(&( a ))§\use{++?}§ 1125 --a => --?(&( a ))§\use{--?}§ 1142 1126 \end{lstlisting} 1143 1127 … … 1235 1219 * --?( _Atomic const restrict volatile T * _Atomic restrict volatile * ); 1236 1220 \end{lstlisting} 1237 For every extended integer type \lstinline@X@there exist1221 For every extended integer type ©X© there exist 1238 1222 % Don't use predefined: keep this out of prelude.cf. 1239 1223 \begin{lstlisting} … … 1243 1227 --?( _Atomic volatile X * ); 1244 1228 \end{lstlisting} 1245 For every complete enumerated type \lstinline@E@there exist1229 For every complete enumerated type ©E© there exist 1246 1230 % Don't use predefined: keep this out of prelude.cf. 1247 1231 \begin{lstlisting} … … 1280 1264 1281 1265 \constraints 1282 The operand of the unary ``\lstinline@&@'' operator shall have exactly one 1283 \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. 1266 The operand of the unary ``©&©'' operator shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. 1284 1267 1285 1268 \semantics 1286 The ``\lstinline@&@'' expression has one interpretation which is of type \lstinline@T *@, where 1287 \lstinline@T@ is the type of the operand. 1269 The ``©&©'' expression has one interpretation which is of type ©T *©, where ©T© is the type of the operand. 1288 1270 1289 1271 The interpretations of an indirection expression are the interpretations of the corresponding function call. … … 1314 1296 forall( ftype FT ) int !?( FT * ); 1315 1297 \end{lstlisting} 1316 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1298 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1317 1299 % Don't use predefined: keep this out of prelude.cf. 1318 1300 \begin{lstlisting} … … 1328 1310 long int li; 1329 1311 void eat_double( double );§\use{eat_double}§ 1330 eat_double(-li ); // §\rewrite§eat_double( -?( li ) );1331 \end{lstlisting} 1332 The valid interpretations of `` \lstinline@-li@'' (assuming no extended integer types exist) are1312 eat_double(-li ); // => eat_double( -?( li ) ); 1313 \end{lstlisting} 1314 The valid interpretations of ``©-li©'' (assuming no extended integer types exist) are 1333 1315 \begin{center} 1334 1316 \begin{tabular}{llc} interpretation & result type & expression conversion cost \\ 1335 1317 \hline 1336 \lstinline@-?( (int)li )@ & \lstinline@int@& (unsafe) \\1337 \lstinline@-?( (unsigned)li)@ & \lstinline@unsigned int@& (unsafe) \\1338 \lstinline@-?( (long)li)@ & \lstinline@long@& 0 \\1339 \lstinline@-?( (long unsigned int)li)@ & \lstinline@long unsigned int@& 1 \\1340 \lstinline@-?( (long long int)li)@ & \lstinline@long long int@& 2 \\1341 \lstinline@-?( (long long unsigned int)li)@ & \lstinline@long long unsigned int@& 3 \\1342 \lstinline@-?( (float)li)@ & \lstinline@float@& 4 \\1343 \lstinline@-?( (double)li)@ & \lstinline@double@& 5 \\1344 \lstinline@-?( (long double)li)@ & \lstinline@long double@& 6 \\1345 \lstinline@-?( (_Complex float)li)@ & \lstinline@float@& (unsafe) \\1346 \lstinline@-?( (_Complex double)li)@ & \lstinline@double@& (unsafe) \\1347 \lstinline@-?( (_Complex long double)li)@ & \lstinline@long double@& (unsafe) \\1318 ©-?( (int)li )© & ©int© & (unsafe) \\ 1319 ©-?( (unsigned)li)© & ©unsigned int© & (unsafe) \\ 1320 ©-?( (long)li)© & ©long© & 0 \\ 1321 ©-?( (long unsigned int)li)© & ©long unsigned int© & 1 \\ 1322 ©-?( (long long int)li)© & ©long long int© & 2 \\ 1323 ©-?( (long long unsigned int)li)© & ©long long unsigned int© & 3 \\ 1324 ©-?( (float)li)© & ©float© & 4 \\ 1325 ©-?( (double)li)© & ©double© & 5 \\ 1326 ©-?( (long double)li)© & ©long double© & 6 \\ 1327 ©-?( (_Complex float)li)© & ©float© & (unsafe) \\ 1328 ©-?( (_Complex double)li)© & ©double© & (unsafe) \\ 1329 ©-?( (_Complex long double)li)© & ©long double© & (unsafe) \\ 1348 1330 \end{tabular} 1349 1331 \end{center} 1350 The valid interpretations of the \lstinline@eat_double@call, with the cost of the argument conversion and the cost of the entire expression, are1332 The valid interpretations of the ©eat_double© call, with the cost of the argument conversion and the cost of the entire expression, are 1351 1333 \begin{center} 1352 1334 \begin{tabular}{lcc} interpretation & argument cost & expression cost \\ 1353 1335 \hline 1354 \lstinline@eat_double( (double)-?( (int)li) )@& 7 & (unsafe) \\1355 \lstinline@eat_double( (double)-?( (unsigned)li) )@& 6 & (unsafe) \\1356 \lstinline@eat_double( (double)-?(li) )@& 5 & \(0+5=5\) \\1357 \lstinline@eat_double( (double)-?( (long unsigned int)li) )@& 4 & \(1+4=5\) \\1358 \lstinline@eat_double( (double)-?( (long long int)li) )@& 3 & \(2+3=5\) \\1359 \lstinline@eat_double( (double)-?( (long long unsigned int)li) )@& 2& \(3+2=5\) \\1360 \lstinline@eat_double( (double)-?( (float)li) )@& 1 & \(4+1=5\) \\1361 \lstinline@eat_double( (double)-?( (double)li) )@& 0 & \(5+0=5\) \\1362 \lstinline@eat_double( (double)-?( (long double)li) )@& (unsafe) & (unsafe) \\1363 \lstinline@eat_double( (double)-?( (_Complex float)li) )@& (unsafe) & (unsafe) \\1364 \lstinline@eat_double( (double)-?( (_Complex double)li) )@& (unsafe) & (unsafe) \\1365 \lstinline@eat_double( (double)-?( (_Complex long double)li) )@& (unsafe) & (unsafe) \\1336 ©eat_double( (double)-?( (int)li) )© & 7 & (unsafe) \\ 1337 ©eat_double( (double)-?( (unsigned)li) )© & 6 & (unsafe) \\ 1338 ©eat_double( (double)-?(li) )© & 5 & \(0+5=5\) \\ 1339 ©eat_double( (double)-?( (long unsigned int)li) )© & 4 & \(1+4=5\) \\ 1340 ©eat_double( (double)-?( (long long int)li) )© & 3 & \(2+3=5\) \\ 1341 ©eat_double( (double)-?( (long long unsigned int)li) )© & 2 & \(3+2=5\) \\ 1342 ©eat_double( (double)-?( (float)li) )© & 1 & \(4+1=5\) \\ 1343 ©eat_double( (double)-?( (double)li) )© & 0 & \(5+0=5\) \\ 1344 ©eat_double( (double)-?( (long double)li) )© & (unsafe) & (unsafe) \\ 1345 ©eat_double( (double)-?( (_Complex float)li) )© & (unsafe) & (unsafe) \\ 1346 ©eat_double( (double)-?( (_Complex double)li) )© & (unsafe) & (unsafe) \\ 1347 ©eat_double( (double)-?( (_Complex long double)li) )© & (unsafe) & (unsafe) \\ 1366 1348 \end{tabular} 1367 1349 \end{center} 1368 Each has result type \lstinline@void@, so the best must be selected.1350 Each has result type ©void©, so the best must be selected. 1369 1351 The interpretations involving unsafe conversions are discarded. 1370 The remainder have equal expression conversion costs, so the 1371 ``highest argument conversion cost'' rule is invoked, and the chosen interpretation is 1372 \lstinline@eat_double( (double)-?(li) )@. 1352 The remainder have equal expression conversion costs, so the ``highest argument conversion cost'' rule is invoked, and the chosen interpretation is ©eat_double( (double)-?(li) )©. 1373 1353 1374 1354 … … 1376 1356 1377 1357 \constraints 1378 The operand of \lstinline@sizeof@ or \lstinline@_Alignof@ shall not be \lstinline@type@, \lstinline@dtype@, or \lstinline@ftype@.1379 1380 When the \lstinline@sizeof@\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A \lstinline@sizeof@ or \lstinline@_Alignof@ expression has one interpretation, of type \lstinline@size_t@.1381 1382 When \lstinline@sizeof@is applied to an identifier declared by a \nonterm{type-declaration} or a1358 The operand of ©sizeof© or ©_Alignof© shall not be ©type©, ©dtype©, or ©ftype©. 1359 1360 When the ©sizeof©\use{sizeof} operator is applied to an expression, the expression shall have exactly one \Index{interpretation}\index{ambiguous interpretation}, which shall be unambiguous. \semantics A ©sizeof© or ©_Alignof© expression has one interpretation, of type ©size_t©. 1361 1362 When ©sizeof© is applied to an identifier declared by a \nonterm{type-declaration} or a 1383 1363 \nonterm{type-parameter}, it yields the size in bytes of the type that implements the operand. 1384 1364 When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression. 1385 1365 1386 When \lstinline@_Alignof@is applied to an identifier declared by a \nonterm{type-declaration} or a1366 When ©_Alignof© is applied to an identifier declared by a \nonterm{type-declaration} or a 1387 1367 \nonterm{type-parameter}, it yields the alignment requirement of the type that implements the operand. 1388 1368 When the operand is an opaque type or an inferred type parameter\index{inferred parameter}, the expression is not a constant expression. … … 1398 1378 } 1399 1379 \end{lstlisting} 1400 ``\lstinline@sizeof Rational@'', although not statically known, is fixed. 1401 Within \lstinline@f()@, 1402 ``\lstinline@sizeof(T)@'' is fixed for each call of \lstinline@f()@, but may vary from call to call. 1380 ``©sizeof Rational©'', although not statically known, is fixed. 1381 Within ©f()©, ``©sizeof(T)©'' is fixed for each call of ©f()©, but may vary from call to call. 1403 1382 \end{rationale} 1404 1383 … … 1409 1388 \lhs{cast-expression} 1410 1389 \rhs \nonterm{unary-expression} 1411 \rhs \lstinline@(@ \nonterm{type-name} \lstinline@)@\nonterm{cast-expression}1390 \rhs ©(© \nonterm{type-name} ©)© \nonterm{cast-expression} 1412 1391 \end{syntax} 1413 1392 1414 1393 \constraints 1415 The \nonterm{type-name} in a \nonterm{cast-expression} shall not be \lstinline@type@, 1416 \lstinline@dtype@, or \lstinline@ftype@. 1394 The \nonterm{type-name} in a \nonterm{cast-expression} shall not be ©type©, ©dtype©, or ©ftype©. 1417 1395 1418 1396 \semantics 1419 1397 1420 In a \Index{cast expression} `` \lstinline@(@\nonterm{type-name}\lstinline@)e@'', if1421 \nonterm{type-name} is the type of an interpretation of \lstinline@e@, then that interpretation is the only interpretation of the cast expression;1422 otherwise, \lstinline@e@shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost.1398 In a \Index{cast expression} ``©(©\nonterm{type-name}©)e©'', if 1399 \nonterm{type-name} is the type of an interpretation of ©e©, then that interpretation is the only interpretation of the cast expression; 1400 otherwise, ©e© shall have some interpretation that can be converted to \nonterm{type-name}, and the interpretation of the cast expression is the cast of the interpretation that can be converted at the lowest cost. 1423 1401 The cast expression's interpretation is ambiguous\index{ambiguous interpretation} if more than one interpretation can be converted at the lowest cost or if the selected interpretation is ambiguous. 1424 1402 … … 1433 1411 \lhs{multiplicative-expression} 1434 1412 \rhs \nonterm{cast-expression} 1435 \rhs \nonterm{multiplicative-expression} \lstinline@*@\nonterm{cast-expression}1436 \rhs \nonterm{multiplicative-expression} \lstinline@/@\nonterm{cast-expression}1437 \rhs \nonterm{multiplicative-expression} \lstinline@%@\nonterm{cast-expression}1413 \rhs \nonterm{multiplicative-expression} ©*© \nonterm{cast-expression} 1414 \rhs \nonterm{multiplicative-expression} ©/© \nonterm{cast-expression} 1415 \rhs \nonterm{multiplicative-expression} ©%© \nonterm{cast-expression} 1438 1416 \end{syntax} 1439 1417 1440 1418 \rewriterules 1441 1419 \begin{lstlisting} 1442 a * b §\rewrite§?*?( a, b )§\use{?*?}§1443 a / b §\rewrite§?/?( a, b )§\use{?/?}§1444 a % b §\rewrite§?%?( a, b )§\use{?%?}§1420 a * b => ?*?( a, b )§\use{?*?}§ 1421 a / b => ?/?( a, b )§\use{?/?}§ 1422 a % b => ?%?( a, b )§\use{?%?}§ 1445 1423 \end{lstlisting} 1446 1424 … … 1469 1447 ?*?( _Complex long double, _Complex long double ), ?/?( _Complex long double, _Complex long double ); 1470 1448 \end{lstlisting} 1471 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1449 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1472 1450 % Don't use predefined: keep this out of prelude.cf. 1473 1451 \begin{lstlisting} … … 1476 1454 1477 1455 \begin{rationale} 1478 {\c11} does not include conversions from the \Index{real type}s to \Index{complex type}s in the 1479 \Index{usual arithmetic conversion}s. Instead it specifies conversion of the result of binary operations on arguments from mixed type domains. \CFA's predefined operators match that pattern. 1456 {\c11} does not include conversions from the \Index{real type}s to \Index{complex type}s in the \Index{usual arithmetic conversion}s. Instead it specifies conversion of the result of binary operations on arguments from mixed type domains. \CFA's predefined operators match that pattern. 1480 1457 \end{rationale} 1481 1458 … … 1490 1467 eat_double( li % i ); 1491 1468 \end{lstlisting} 1492 `` \lstinline@li % i@'' is rewritten as ``\lstinline@?%?(li, i )@''.1493 The valid interpretations of \lstinline@?%?(li, i )@, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to \lstinline@double@(assuming no extended integer types are present ) are1469 ``©li % i©'' is rewritten as ``©?%?(li, i )©''. 1470 The valid interpretations of ©?%?(li, i )©, the cost\index{conversion cost} of converting their arguments, and the cost of converting the result to ©double© (assuming no extended integer types are present ) are 1494 1471 \begin{center} 1495 1472 \begin{tabular}{lcc} interpretation & argument cost & result cost \\ 1496 \hline 1497 \lstinline@ ?%?( (int)li, i )@& (unsafe) & 6 \\1498 \lstinline@ ?%?( (unsigned)li,(unsigned)i )@& (unsafe) & 5 \\1499 \lstinline@ ?%?( li, (long)i )@& 1 & 4 \\1500 \lstinline@ ?%?( (long unsigned)li,(long unsigned)i )@& 3 & 3 \\1501 \lstinline@ ?%?( (long long)li,(long long)i )@& 5 & 2 \\1502 \lstinline@ ?%?( (long long unsigned)li, (long long unsigned)i )@& 7 & 1 \\1473 \hline 1474 © ?%?( (int)li, i )© & (unsafe) & 6 \\ 1475 © ?%?( (unsigned)li,(unsigned)i )© & (unsafe) & 5 \\ 1476 © ?%?( li, (long)i )© & 1 & 4 \\ 1477 © ?%?( (long unsigned)li,(long unsigned)i )© & 3 & 3 \\ 1478 © ?%?( (long long)li,(long long)i )© & 5 & 2 \\ 1479 © ?%?( (long long unsigned)li, (long long unsigned)i )© & 7 & 1 \\ 1503 1480 \end{tabular} 1504 1481 \end{center} 1505 The best interpretation of \lstinline@eat_double( li, i )@ is 1506 \lstinline@eat_double( (double)?%?(li, (long)i ))@, which has no unsafe conversions and the lowest total cost. 1507 1508 \begin{rationale} 1509 {\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of \lstinline@int@.If 1510 \lstinline@s@ is a \lstinline@short int@, ``\lstinline@s *s@'' does not have type \lstinline@short int@; 1511 it is treated as ``\lstinline@( (int)s ) * ( (int)s )@'', and has type \lstinline@int@. \CFA matches that pattern; 1512 it does not predefine ``\lstinline@short ?*?( short, short )@''. 1482 The best interpretation of ©eat_double( li, i )© is ©eat_double( (double)?%?(li, (long)i ))©, which has no unsafe conversions and the lowest total cost. 1483 1484 \begin{rationale} 1485 {\c11} defines most arithmetic operations to apply an \Index{integer promotion} to any argument that belongs to a type that has an \Index{integer conversion rank} less than that of ©int©. 1486 If ©s© is a ©short int©, ``©s *s©'' does not have type ©short int©; 1487 it is treated as ``©( (int)s ) * ( (int)s )©'', and has type ©int©. \CFA matches that pattern; 1488 it does not predefine ``©short ?*?( short, short )©''. 1513 1489 1514 1490 These ``missing'' operators limit polymorphism. … … 1519 1495 square( s ); 1520 1496 \end{lstlisting} 1521 Since \CFA does not define a multiplication operator for \lstinline@short int@, 1522 \lstinline@square( s )@ is treated as \lstinline@square( (int)s )@, and the result has type 1523 \lstinline@int@. 1497 Since \CFA does not define a multiplication operator for ©short int©, ©square( s )© is treated as ©square( (int)s )©, and the result has type ©int©. 1524 1498 This is mildly surprising, but it follows the {\c11} operator pattern. 1525 1499 … … 1530 1504 product( sa, 5); 1531 1505 \end{lstlisting} 1532 This has no valid interpretations, because \CFA has no conversion from ``array of 1533 \lstinline@short int@'' to ``array of \lstinline@int@''. 1506 This has no valid interpretations, because \CFA has no conversion from ``array of ©short int©'' to ``array of ©int©''. 1534 1507 The alternatives in such situations include 1535 1508 \begin{itemize} 1536 1509 \item 1537 Defining monomorphic overloadings of \lstinline@product@ for \lstinline@short@ and the other 1538 ``small'' types. 1539 \item 1540 Defining ``\lstinline@short ?*?( short, short )@'' within the scope containing the call to 1541 \lstinline@product@. 1542 \item 1543 Defining \lstinline@product@ to take as an argument a conversion function from the ``small'' type to the operator's argument type. 1510 Defining monomorphic overloadings of ©product© for ©short© and the other ``small'' types. 1511 \item 1512 Defining ``©short ?*?( short, short )©'' within the scope containing the call to ©product©. 1513 \item 1514 Defining ©product© to take as an argument a conversion function from the ``small'' type to the operator's argument type. 1544 1515 \end{itemize} 1545 1516 \end{rationale} … … 1551 1522 \lhs{additive-expression} 1552 1523 \rhs \nonterm{multiplicative-expression} 1553 \rhs \nonterm{additive-expression} \lstinline@+@\nonterm{multiplicative-expression}1554 \rhs \nonterm{additive-expression} \lstinline@-@\nonterm{multiplicative-expression}1524 \rhs \nonterm{additive-expression} ©+© \nonterm{multiplicative-expression} 1525 \rhs \nonterm{additive-expression} ©-© \nonterm{multiplicative-expression} 1555 1526 \end{syntax} 1556 1527 1557 1528 \rewriterules 1558 1529 \begin{lstlisting} 1559 a + b §\rewrite§?+?( a, b )§\use{?+?}§1560 a - b §\rewrite§?-?( a, b )§\use{?-?}§1530 a + b => ?+?( a, b )§\use{?+?}§ 1531 a - b => ?-?( a, b )§\use{?-?}§ 1561 1532 \end{lstlisting} 1562 1533 … … 1611 1582 * ?-?( _Atomic const restrict volatile T *, _Atomic const restrict volatile T * ); 1612 1583 \end{lstlisting} 1613 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1584 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1614 1585 % Don't use predefined: keep this out of prelude.cf. 1615 1586 \begin{lstlisting} … … 1621 1592 1622 1593 \begin{rationale} 1623 \lstinline@ptrdiff_t@ is an implementation-defined identifier defined in \lstinline@<stddef.h>@that is synonymous with a signed integral type that is large enough to hold the difference between two pointers.1594 ©ptrdiff_t© is an implementation-defined identifier defined in ©<stddef.h>© that is synonymous with a signed integral type that is large enough to hold the difference between two pointers. 1624 1595 It seems reasonable to use it for pointer addition as well. (This is technically a difference between \CFA and C, which only specifies that pointer addition uses an \emph{integral} argument.) Hence it is also used for subscripting, which is defined in terms of pointer addition. 1625 The {\c11} standard uses \lstinline@size_t@ in several cases where a library function takes an argument that is used as a subscript, but \lstinline@size_t@is unsuitable here because it is an unsigned type.1596 The {\c11} standard uses ©size_t© in several cases where a library function takes an argument that is used as a subscript, but ©size_t© is unsuitable here because it is an unsigned type. 1626 1597 \end{rationale} 1627 1598 … … 1632 1603 \lhs{shift-expression} 1633 1604 \rhs \nonterm{additive-expression} 1634 \rhs \nonterm{shift-expression} \lstinline@<<@\nonterm{additive-expression}1635 \rhs \nonterm{shift-expression} \lstinline@>>@\nonterm{additive-expression}1605 \rhs \nonterm{shift-expression} ©<<© \nonterm{additive-expression} 1606 \rhs \nonterm{shift-expression} ©>>© \nonterm{additive-expression} 1636 1607 \end{syntax} 1637 1608 1638 \rewriterules \use{?>>?}%use{?<<?}1639 \begin{lstlisting} 1640 a << b §\rewrite§ ?<<?( a, b )1641 a >> b §\rewrite§ ?>>?( a, b )1609 \rewriterules 1610 \begin{lstlisting} 1611 a << b => ?<<?( a, b )§\use{?<<?}§ 1612 a >> b => ?>>?( a, b )§\use{?>>?}§ 1642 1613 \end{lstlisting} 1643 1614 … … 1651 1622 long long unsigned int ?<<?( long long unsigned int, int ), ?>>?( long long unsigned int, int); 1652 1623 \end{lstlisting} 1653 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1624 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1654 1625 % Don't use predefined: keep this out of prelude.cf. 1655 1626 \begin{lstlisting} … … 1671 1642 \lhs{relational-expression} 1672 1643 \rhs \nonterm{shift-expression} 1673 \rhs \nonterm{relational-expression} \lstinline@< @\nonterm{shift-expression}1674 \rhs \nonterm{relational-expression} \lstinline@> @\nonterm{shift-expression}1675 \rhs \nonterm{relational-expression} \lstinline@<=@\nonterm{shift-expression}1676 \rhs \nonterm{relational-expression} \lstinline@>=@\nonterm{shift-expression}1644 \rhs \nonterm{relational-expression} ©< © \nonterm{shift-expression} 1645 \rhs \nonterm{relational-expression} ©> © \nonterm{shift-expression} 1646 \rhs \nonterm{relational-expression} ©<=© \nonterm{shift-expression} 1647 \rhs \nonterm{relational-expression} ©>=© \nonterm{shift-expression} 1677 1648 \end{syntax} 1678 1649 1679 \rewriterules \use{?>?}\use{?>=?}%use{?<?}%use{?<=?}1680 \begin{lstlisting} 1681 a < b §\rewrite§ ?<?( a, b )1682 a > b §\rewrite§ ?>?( a, b )1683 a <= b §\rewrite§ ?<=?( a, b )1684 a >= b §\rewrite§ ?>=?( a, b )1650 \rewriterules 1651 \begin{lstlisting} 1652 a < b => ?<?( a, b )§\use{?<?}§ 1653 a > b => ?>?( a, b )§\use{?>?}§ 1654 a <= b => ?<=?( a, b )§\use{?<=?}§ 1655 a >= b => ?>=?( a, b )§\use{?>=?}§ 1685 1656 \end{lstlisting} 1686 1657 … … 1714 1685 ?>=?( _Atomic const restrict volatile DT *, _Atomic const restrict volatile DT * ); 1715 1686 \end{lstlisting} 1716 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1687 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1717 1688 % Don't use predefined: keep this out of prelude.cf. 1718 1689 \begin{lstlisting} … … 1732 1703 \lhs{equality-expression} 1733 1704 \rhs \nonterm{relational-expression} 1734 \rhs \nonterm{equality-expression} \lstinline@==@\nonterm{relational-expression}1735 \rhs \nonterm{equality-expression} \lstinline@!=@\nonterm{relational-expression}1705 \rhs \nonterm{equality-expression} ©==© \nonterm{relational-expression} 1706 \rhs \nonterm{equality-expression} ©!=© \nonterm{relational-expression} 1736 1707 \end{syntax} 1737 1708 1738 1709 \rewriterules 1739 1710 \begin{lstlisting} 1740 a == b §\rewrite§?==?( a, b )§\use{?==?}§1741 a != b §\rewrite§?!=?( a, b )§\use{?"!=?}§1711 a == b => ?==?( a, b )§\use{?==?}§ 1712 a != b => ?!=?( a, b )§\use{?"!=?}§ 1742 1713 \end{lstlisting} 1743 1714 … … 1792 1763 ?==?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ), ?!=?( forall( ftype FT2) FT2*, forall( ftype FT3) FT3 * ); 1793 1764 \end{lstlisting} 1794 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1765 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1795 1766 % Don't use predefined: keep this out of prelude.cf. 1796 1767 \begin{lstlisting} … … 1800 1771 1801 1772 \begin{rationale} 1802 The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to \lstinline@void@and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type.1773 The polymorphic equality operations come in three styles: comparisons between pointers of compatible types, between pointers to ©void© and pointers to object types or incomplete types, and between the \Index{null pointer} constant and pointers to any type. 1803 1774 In the last case, a special constraint rule for null pointer constant operands has been replaced by a consequence of the \CFA type system. 1804 1775 \end{rationale} … … 1821 1792 \lhs{AND-expression} 1822 1793 \rhs \nonterm{equality-expression} 1823 \rhs \nonterm{AND-expression} \lstinline@&@\nonterm{equality-expression}1794 \rhs \nonterm{AND-expression} ©&© \nonterm{equality-expression} 1824 1795 \end{syntax} 1825 1796 1826 1797 \rewriterules 1827 1798 \begin{lstlisting} 1828 a & b §\rewrite§?&?( a, b )§\use{?&?}§1799 a & b => ?&?( a, b )§\use{?&?}§ 1829 1800 \end{lstlisting} 1830 1801 … … 1838 1809 long long unsigned int ?&?( long long unsigned int, long long unsigned int ); 1839 1810 \end{lstlisting} 1840 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1811 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1841 1812 % Don't use predefined: keep this out of prelude.cf. 1842 1813 \begin{lstlisting} … … 1853 1824 \lhs{exclusive-OR-expression} 1854 1825 \rhs \nonterm{AND-expression} 1855 \rhs \nonterm{exclusive-OR-expression} \lstinline@^@\nonterm{AND-expression}1826 \rhs \nonterm{exclusive-OR-expression} ©^© \nonterm{AND-expression} 1856 1827 \end{syntax} 1857 1828 1858 1829 \rewriterules 1859 1830 \begin{lstlisting} 1860 a ^ b §\rewrite§?^?( a, b )§\use{?^?}§1831 a ^ b => ?^?( a, b )§\use{?^?}§ 1861 1832 \end{lstlisting} 1862 1833 … … 1870 1841 long long unsigned int ?^?( long long unsigned int, long long unsigned int ); 1871 1842 \end{lstlisting} 1872 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1843 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1873 1844 % Don't use predefined: keep this out of prelude.cf. 1874 1845 \begin{lstlisting} … … 1885 1856 \lhs{inclusive-OR-expression} 1886 1857 \rhs \nonterm{exclusive-OR-expression} 1887 \rhs \nonterm{inclusive-OR-expression} \lstinline@|@\nonterm{exclusive-OR-expression}1858 \rhs \nonterm{inclusive-OR-expression} ©|© \nonterm{exclusive-OR-expression} 1888 1859 \end{syntax} 1889 1860 1890 \rewriterules \use{?"|?}1891 \begin{lstlisting} 1892 a | b §\rewrite§ ?|?( a, b )1861 \rewriterules 1862 \begin{lstlisting} 1863 a | b => ?|?( a, b )§\use{?"|?}§ 1893 1864 \end{lstlisting} 1894 1865 … … 1902 1873 long long unsigned int ?|?( long long unsigned int, long long unsigned int ); 1903 1874 \end{lstlisting} 1904 For every extended integer type \lstinline@X@ with \Index{integer conversion rank} greater than the rank of \lstinline@int@there exist1875 For every extended integer type ©X© with \Index{integer conversion rank} greater than the rank of ©int© there exist 1905 1876 % Don't use predefined: keep this out of prelude.cf. 1906 1877 \begin{lstlisting} … … 1917 1888 \lhs{logical-AND-expression} 1918 1889 \rhs \nonterm{inclusive-OR-expression} 1919 \rhs \nonterm{logical-AND-expression} \lstinline@&&@\nonterm{inclusive-OR-expression}1890 \rhs \nonterm{logical-AND-expression} ©&&© \nonterm{inclusive-OR-expression} 1920 1891 \end{syntax} 1921 1892 1922 \semantics The operands of the expression ``\lstinline@a && b@'' are treated as 1923 ``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b)!=0)@'', which shall both be unambiguous. 1924 The expression has only one interpretation, which is of type \lstinline@int@. 1925 \begin{rationale} 1926 When the operands of a logical expression are values of built-in types, and ``\lstinline@!=@'' has not been redefined for those types, the compiler can optimize away the function calls. 1927 1928 A common C idiom omits comparisons to \lstinline@0@ in the controlling expressions of loops and 1929 \lstinline@if@ statements. 1930 For instance, the loop below iterates as long as \lstinline@rp@ points at a \lstinline@Rational@ value that is non-zero. 1893 \semantics The operands of the expression ``©a && b©'' are treated as ``©(int)((a)!=0)©'' and ``©(int)((b)!=0)©'', which shall both be unambiguous. 1894 The expression has only one interpretation, which is of type ©int©. 1895 \begin{rationale} 1896 When the operands of a logical expression are values of built-in types, and ``©!=©'' has not been redefined for those types, the compiler can optimize away the function calls. 1897 1898 A common C idiom omits comparisons to ©0© in the controlling expressions of loops and ©if© statements. 1899 For instance, the loop below iterates as long as ©rp© points at a ©Rational© value that is non-zero. 1931 1900 1932 1901 \begin{lstlisting} … … 1937 1906 while ( rp && *rp ) { ... } 1938 1907 \end{lstlisting} 1939 The logical expression calls the \lstinline@Rational@ inequality operator, passing it \lstinline@*rp@ and the \lstinline@Rational 0@, and getting a 1 or 0 as a result.1940 In contrast, {\CC} would apply a programmer-defined \lstinline@Rational@-to-\lstinline@int@ conversion to \lstinline@*rp@in the equivalent situation.1941 The conversion to \lstinline@int@would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind.1908 The logical expression calls the ©Rational© inequality operator, passing it ©*rp© and the ©Rational 0©, and getting a 1 or 0 as a result. 1909 In contrast, {\CC} would apply a programmer-defined ©Rational©-to-©int© conversion to ©*rp© in the equivalent situation. 1910 The conversion to ©int© would produce a general integer value, which is unfortunate, and possibly dangerous if the conversion was not written with this situation in mind. 1942 1911 \end{rationale} 1943 1912 … … 1948 1917 \lhs{logical-OR-expression} 1949 1918 \rhs \nonterm{logical-AND-expression} 1950 \rhs \nonterm{logical-OR-expression} \lstinline@||@\nonterm{logical-AND-expression}1919 \rhs \nonterm{logical-OR-expression} ©||© \nonterm{logical-AND-expression} 1951 1920 \end{syntax} 1952 1921 1953 1922 \semantics 1954 1923 1955 The operands of the expression `` \lstinline@a || b@'' are treated as ``\lstinline@(int)((a)!=0)@'' and ``\lstinline@(int)((b))!=0)@'', which shall both be unambiguous.1956 The expression has only one interpretation, which is of type \lstinline@int@.1924 The operands of the expression ``©a || b©'' are treated as ``©(int)((a)!=0)©'' and ``©(int)((b))!=0)©'', which shall both be unambiguous. 1925 The expression has only one interpretation, which is of type ©int©. 1957 1926 1958 1927 … … 1962 1931 \lhs{conditional-expression} 1963 1932 \rhs \nonterm{logical-OR-expression} 1964 \rhs \nonterm{logical-OR-expression} \lstinline@?@\nonterm{expression}1965 \lstinline@:@\nonterm{conditional-expression}1933 \rhs \nonterm{logical-OR-expression} ©?© \nonterm{expression} 1934 ©:© \nonterm{conditional-expression} 1966 1935 \end{syntax} 1967 1936 1968 1937 \semantics 1969 In the conditional expression\use{?:} `` \lstinline@a?b:c@'', if the second and third operands both have an interpretation with \lstinline@void@ type, then the expression has an interpretation with type \lstinline@void@, equivalent to1938 In the conditional expression\use{?:} ``©a?b:c©'', if the second and third operands both have an interpretation with ©void© type, then the expression has an interpretation with type ©void©, equivalent to 1970 1939 \begin{lstlisting} 1971 1940 ( int)(( a)!=0) ? ( void)( b) : ( void)( c) 1972 1941 \end{lstlisting} 1973 1942 1974 If the second and third operands both have interpretations with non- \lstinline@void@ types, the expression is treated as if it were the call ``\lstinline@cond((a)!=0, b, c)@'', with \lstinline@cond@declared as1943 If the second and third operands both have interpretations with non-©void© types, the expression is treated as if it were the call ``©cond((a)!=0, b, c)©'', with ©cond© declared as 1975 1944 \begin{lstlisting} 1976 1945 forall( otype T ) T cond( int, T, T ); … … 2024 1993 rand() ? i : l; 2025 1994 \end{lstlisting} 2026 The best interpretation infers the expression's type to be \lstinline@long@ and applies the safe 2027 \lstinline@int@-to-\lstinline@long@ conversion to \lstinline@i@. 1995 The best interpretation infers the expression's type to be ©long© and applies the safe ©int©-to-©long© conversion to ©i©. 2028 1996 2029 1997 \begin{lstlisting} … … 2032 2000 rand() ? cip : vip; 2033 2001 \end{lstlisting} 2034 The expression has type \lstinline@const volatile int *@, with safe conversions applied to the second and third operands to add \lstinline@volatile@ and \lstinline@const@qualifiers, respectively.2002 The expression has type ©const volatile int *©, with safe conversions applied to the second and third operands to add ©volatile© and ©const© qualifiers, respectively. 2035 2003 2036 2004 \begin{lstlisting} 2037 2005 rand() ? cip : 0; 2038 2006 \end{lstlisting} 2039 The expression has type \lstinline@const int *@, with a specialization conversion applied to 2040 \lstinline@0@. 2007 The expression has type ©const int *©, with a specialization conversion applied to ©0©. 2041 2008 2042 2009 … … 2049 2016 \nonterm{assignment-expression} 2050 2017 \lhs{assignment-operator} one of 2051 \rhs \lstinline@=@\ \ \lstinline@*=@\ \ \lstinline@/=@\ \ \lstinline@%=@\ \ \lstinline@+=@\ \ \lstinline@-=@\ \ 2052 \lstinline@<<=@\ \ \lstinline@>>=@\ \ \lstinline@&=@\ \ \lstinline@^=@\ \ \lstinline@|=@ 2018 \rhs ©=©\ \ ©*=©\ \ ©/=©\ \ ©%=©\ \ ©+=©\ \ ©-=©\ \ ©<<=©\ \ ©>>=©\ \ ©&=©\ \ ©^=©\ \ ©|=© 2053 2019 \end{syntax} 2054 2020 2055 2021 \rewriterules 2056 Let `` \(\leftarrow\)'' be any of the assignment operators.2022 Let ``©<-©'' be any of the assignment operators. 2057 2023 Then 2058 \use{?=?}\use{?*=?}\use{?/=?}\use{?%=?}\use{?+=?}\use{?-=?} 2059 \use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?} 2060 \begin{lstlisting} 2061 a §$\leftarrow$§ b §\rewrite§ ?§$\leftarrow$§?( &( a ), b ) 2024 \use{?=?}\use{?*=?}\use{?/=?}\use{?%=?}\use{?+=?}\use{?-=?}\use{?>>=?}\use{?&=?}\use{?^=?}\use{?"|=?}%use{?<<=?} 2025 \begin{lstlisting} 2026 a <- b => ?<-?( &( a ), b ) 2062 2027 \end{lstlisting} 2063 2028 2064 2029 \semantics 2065 2030 Each interpretation of the left operand of an assignment expression is considered separately. 2066 For each interpretation that is a bit-field or is declared with the \lstinline@register@storage class specifier, the expression has one valid interpretation, with the type of the left operand.2031 For each interpretation that is a bit-field or is declared with the ©register© storage class specifier, the expression has one valid interpretation, with the type of the left operand. 2067 2032 The right operand is cast to that type, and the assignment expression is ambiguous if either operand is. 2068 2033 For the remaining interpretations, the expression is rewritten, and the interpretations of the assignment expression are the interpretations of the corresponding function call. … … 2297 2262 \end{lstlisting} 2298 2263 \begin{rationale} 2299 The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a \lstinline@dtype@ parameter, instead of a \lstinline@type@parameter, because the left operand may be a pointer to an incomplete type.2300 \end{rationale} 2301 2302 For every complete structure or union type \lstinline@S@there exist2264 The pattern of overloadings for simple assignment resembles that of pointer increment and decrement, except that the polymorphic pointer assignment functions declare a ©dtype© parameter, instead of a ©type© parameter, because the left operand may be a pointer to an incomplete type. 2265 \end{rationale} 2266 2267 For every complete structure or union type ©S© there exist 2303 2268 % Don't use predefined: keep this out of prelude.cf. 2304 2269 \begin{lstlisting} … … 2306 2271 \end{lstlisting} 2307 2272 2308 For every extended integer type \lstinline@X@there exist2273 For every extended integer type ©X© there exist 2309 2274 % Don't use predefined: keep this out of prelude.cf. 2310 2275 \begin{lstlisting} … … 2312 2277 \end{lstlisting} 2313 2278 2314 For every complete enumerated type \lstinline@E@there exist2279 For every complete enumerated type ©E© there exist 2315 2280 % Don't use predefined: keep this out of prelude.cf. 2316 2281 \begin{lstlisting} … … 2318 2283 \end{lstlisting} 2319 2284 \begin{rationale} 2320 The right-hand argument is \lstinline@int@ because enumeration constants have type \lstinline@int@.2285 The right-hand argument is ©int© because enumeration constants have type ©int©. 2321 2286 \end{rationale} 2322 2287 … … 2579 2544 \end{lstlisting} 2580 2545 2581 For every extended integer type \lstinline@X@there exist2546 For every extended integer type ©X© there exist 2582 2547 % Don't use predefined: keep this out of prelude.cf. 2583 2548 \begin{lstlisting} … … 2594 2559 \end{lstlisting} 2595 2560 2596 For every complete enumerated type \lstinline@E@there exist2561 For every complete enumerated type ©E© there exist 2597 2562 % Don't use predefined: keep this out of prelude.cf. 2598 2563 \begin{lstlisting} … … 2615 2580 \lhs{expression} 2616 2581 \rhs \nonterm{assignment-expression} 2617 \rhs \nonterm{expression} \lstinline@,@\nonterm{assignment-expression}2582 \rhs \nonterm{expression} ©,© \nonterm{assignment-expression} 2618 2583 \end{syntax} 2619 2584 2620 2585 \semantics 2621 In the comma expression ``\lstinline@a, b@'', the first operand is interpreted as 2622 ``\lstinline@( void )(a)@'', which shall be unambiguous\index{ambiguous interpretation}. 2586 In the comma expression ``©a, b©'', the first operand is interpreted as ``©( void )(a)©'', which shall be unambiguous\index{ambiguous interpretation}. 2623 2587 The interpretations of the expression are the interpretations of the second operand. 2624 2588 … … 2655 2619 { ... } 2656 2620 \end{lstlisting} 2657 Without the rule, \lstinline@Complex@would be a type in the first case, and a parameter name in the second.2621 Without the rule, ©Complex© would be a type in the first case, and a parameter name in the second. 2658 2622 \end{rationale} 2659 2623 … … 2712 2676 \begin{syntax} 2713 2677 \lhs{forall-specifier} 2714 \rhs \lstinline@forall@ \lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@2678 \rhs ©forall© ©(© \nonterm{type-parameter-list} ©)© 2715 2679 \end{syntax} 2716 2680 … … 2724 2688 } mkPair( T, T ); // illegal 2725 2689 \end{lstlisting} 2726 If an instance of \lstinline@struct Pair@was declared later in the current scope, what would the members' type be?2690 If an instance of ©struct Pair© was declared later in the current scope, what would the members' type be? 2727 2691 \end{rationale} 2728 2692 \end{comment} … … 2731 2695 The \nonterm{type-parameter-list}s and assertions of the \nonterm{forall-specifier}s declare type identifiers, function and object identifiers with \Index{no linkage}. 2732 2696 2733 If, in the declaration ``\lstinline@T D@'', \lstinline@T@ contains \nonterm{forall-specifier}s and 2734 \lstinline@D@ has the form 2697 If, in the declaration ``©T D©'', ©T© contains \nonterm{forall-specifier}s and ©D© has the form 2735 2698 \begin{lstlisting} 2736 2699 D( §\normalsize\nonterm{parameter-type-list}§ ) 2737 \end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in \lstinline@D@, and it is used in the type of a parameter in the following 2738 \nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a 2739 \Index{specification} in one of the \nonterm{forall-specifier}s. 2700 \end{lstlisting} then a type identifier declared by one of the \nonterm{forall-specifier}s is an \define{inferred parameter} of the function declarator if and only if it is not an inferred parameter of a function declarator in ©D©, and it is used in the type of a parameter in the following 2701 \nonterm{type-parameter-list} or it and an inferred parameter are used as arguments of a \Index{specification} in one of the \nonterm{forall-specifier}s. 2740 2702 The identifiers declared by assertions that use an inferred parameter of a function declarator are \Index{assertion parameter}s of that function declarator. 2741 2703 … … 2748 2710 forall( otype T ) T * alloc( void );§\use{alloc}§ int *p = alloc(); 2749 2711 \end{lstlisting} 2750 Here \lstinline@alloc()@ would receive \lstinline@int@ as an inferred argument, and return an 2751 \lstinline@int *@. 2752 In general, if a call to \lstinline@alloc()@ is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes \lstinline@T@ to be bound. 2753 2754 With the current restriction, \lstinline@alloc()@ must be given an argument that determines 2755 \lstinline@T@: 2712 Here ©alloc()© would receive ©int© as an inferred argument, and return an ©int *©. 2713 In general, if a call to ©alloc()© is a subexpression of an expression involving polymorphic functions and overloaded identifiers, there could be considerable distance between the call and the subexpression that causes ©T© to be bound. 2714 2715 With the current restriction, ©alloc()© must be given an argument that determines ©T©: 2756 2716 \begin{lstlisting} 2757 2717 forall( otype T ) T * alloc( T initial_value );§\use{alloc}§ … … 2761 2721 2762 2722 If a function declarator is part of a function definition, its inferred parameters and assertion parameters have \Index{block scope}; 2763 otherwise, identifiers declared by assertions have a 2764 \define{declaration scope}, which terminates at the end of the \nonterm{declaration}. 2723 otherwise, identifiers declared by assertions have a \define{declaration scope}, which terminates at the end of the \nonterm{declaration}. 2765 2724 2766 2725 A function type that has at least one inferred parameter is a \define{polymorphic function} type. … … 2771 2730 Let $f$ and $g$ be two polymorphic function types with the same number of inferred parameters, and let $f_i$ and $g_i$ be the inferred parameters of $f$ and $g$ in their order of occurance in the function types' \nonterm{parameter-type-list}s. 2772 2731 Let $f'$ be $f$ with every occurrence of $f_i$ replaced by $g_i$, for all $i$. 2773 Then $f$ and $g$ are 2774 \Index{compatible type}s if $f'$'s and $g$'s return types and parameter lists are compatible, and if for every assertion parameter of $f'$ there is an assertion parameter in $g$ with the same identifier and compatible type, and vice versa. 2732 Then $f$ and $g$ are \Index{compatible type}s if $f'$'s and $g$'s return types and parameter lists are compatible, and if for every assertion parameter of $f'$ there is an assertion parameter in $g$ with the same identifier and compatible type, and vice versa. 2775 2733 2776 2734 \examples … … 2780 2738 forall( otype T ) T fT( T ); 2781 2739 \end{lstlisting} 2782 \lstinline@fi()@ takes an \lstinline@int@ and returns an \lstinline@int@. \lstinline@fT()@ takes a 2783 \lstinline@T@ and returns a \lstinline@T@, for any type \lstinline@T@. 2740 ©fi()© takes an ©int© and returns an ©int©. ©fT()© takes a ©T© and returns a ©T©, for any type ©T©. 2784 2741 \begin{lstlisting} 2785 2742 int (*pfi )( int ) = fi; 2786 2743 forall( otype T ) T (*pfT )( T ) = fT; 2787 2744 \end{lstlisting} 2788 \lstinline@pfi@ and \lstinline@pfT@ are pointers to functions. \lstinline@pfT@is not polymorphic, but the function it points at is.2745 ©pfi© and ©pfT© are pointers to functions. ©pfT© is not polymorphic, but the function it points at is. 2789 2746 \begin{lstlisting} 2790 2747 int (*fvpfi( void ))( int ) { … … 2795 2752 } 2796 2753 \end{lstlisting} 2797 \lstinline@fvpfi()@ and \lstinline@fvpfT()@ are functions taking no arguments and returning pointers to functions. \lstinline@fvpfT()@is monomorphic, but the function that its return value points at is polymorphic.2754 ©fvpfi()© and ©fvpfT()© are functions taking no arguments and returning pointers to functions. ©fvpfT()© is monomorphic, but the function that its return value points at is polymorphic. 2798 2755 \begin{lstlisting} 2799 2756 forall( otype T ) int ( *fTpfi( T ) )( int ); … … 2801 2758 forall( otype T, otype U ) U ( *fTpfU( T ) )( U ); 2802 2759 \end{lstlisting} 2803 \lstinline@fTpfi()@ is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer. 2804 It could return \lstinline@pfi@. \lstinline@fTpfT()@ is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning 2805 \lstinline@T@, where \lstinline@T@ is an inferred parameter of \lstinline@fTpfT()@. 2806 For instance, in the expression ``\lstinline@fTpfT(17)@'', \lstinline@T@ is inferred to be \lstinline@int@, and the returned value would have type \lstinline@int ( * )( int )@. ``\lstinline@fTpfT(17)(13)@'' and 2807 ``\lstinline@fTpfT("yes")("no")@'' are legal, but ``\lstinline@fTpfT(17)("no")@'' is illegal. 2808 \lstinline@fTpfU()@ is polymorphic ( in type \lstinline@T@), and returns a pointer to a function that is polymorphic ( in type \lstinline@U@). ``\lstinline@f5(17)("no")@'' is a legal expression of type 2809 \lstinline@char *@. 2760 ©fTpfi()© is a polymorphic function that returns a pointer to a monomorphic function taking an integer and returning an integer. 2761 It could return ©pfi©. ©fTpfT()© is subtle: it is a polymorphic function returning a \emph{monomorphic} function taking and returning 2762 ©T©, where ©T© is an inferred parameter of ©fTpfT()©. 2763 For instance, in the expression ``©fTpfT(17)©'', ©T© is inferred to be ©int©, and the returned value would have type ©int ( * )( int )©. ``©fTpfT(17)(13)©'' and ``©fTpfT("yes")("no")©'' are legal, but ``©fTpfT(17)("no")©'' is illegal. 2764 ©fTpfU()© is polymorphic ( in type ©T©), and returns a pointer to a function that is polymorphic ( in type ©U©). ``©f5(17)("no")©'' is a legal expression of type ©char *©. 2810 2765 \begin{lstlisting} 2811 2766 forall( otype T, otype U, otype V ) U * f( T *, U, V * const ); 2812 2767 forall( otype U, otype V, otype W ) U * g( V *, U, W * const ); 2813 2768 \end{lstlisting} 2814 The functions \lstinline@f()@ and \lstinline@g()@have compatible types.2769 The functions ©f()© and ©g()© have compatible types. 2815 2770 Let \(f\) and \(g\) be their types; 2816 then \(f_1\) = \lstinline@T@, \(f_2\) = \lstinline@U@, \(f_3\) = \lstinline@V@, \(g_1\)2817 = \lstinline@V@, \(g_2\) = \lstinline@U@, and \(g_3\) = \lstinline@W@.2771 then \(f_1\) = ©T©, \(f_2\) = ©U©, \(f_3\) = ©V©, \(g_1\) 2772 = ©V©, \(g_2\) = ©U©, and \(g_3\) = ©W©. 2818 2773 Replacing every \(f_i\) by \(g_i\) in \(f\) gives 2819 2774 \begin{lstlisting} … … 2821 2776 \end{lstlisting} which has a return type and parameter list that is compatible with \(g\). 2822 2777 \begin{rationale} 2823 The word `` \lstinline@type@'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day.2778 The word ``©type©'' in a forall specifier is redundant at the moment, but I want to leave room for inferred parameters of ordinary types in case parameterized types get added one day. 2824 2779 2825 2780 Even without parameterized types, I might try to allow … … 2847 2802 \subsection{Type qualifiers} 2848 2803 2849 \CFA defines a new type qualifier \lstinline@lvalue@\impl{lvalue}\index{lvalue}.2804 \CFA defines a new type qualifier ©lvalue©\impl{lvalue}\index{lvalue}. 2850 2805 \begin{syntax} 2851 2806 \oldlhs{type-qualifier} 2852 \rhs \lstinline@lvalue@2807 \rhs ©lvalue© 2853 2808 \end{syntax} 2854 2809 … … 2858 2813 \semantics 2859 2814 An object's type may be a restrict-qualified type parameter. 2860 \lstinline@restrict@does not establish any special semantics in that case.2815 ©restrict© does not establish any special semantics in that case. 2861 2816 2862 2817 \begin{rationale} … … 2864 2819 \end{rationale} 2865 2820 2866 \lstinline@lvalue@ may be used to qualify the return type of a function type. 2867 Let \lstinline@T@ be an unqualified version of a type; 2868 then the result of calling a function with return type 2869 \lstinline@lvalue T@ is a \Index{modifiable lvalue} of type \lstinline@T@. 2870 \lstinline@const@\use{const} and \lstinline@volatile@\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue. 2871 \begin{rationale} 2872 The \lstinline@const@ and \lstinline@volatile@ qualifiers can only be sensibly used to qualify the return type of a function if the \lstinline@lvalue@ qualifier is also used. 2821 ©lvalue© may be used to qualify the return type of a function type. 2822 Let ©T© be an unqualified version of a type; 2823 then the result of calling a function with return type ©lvalue T© is a \Index{modifiable lvalue} of type ©T©. 2824 ©const©\use{const} and ©volatile©\use{volatile} qualifiers may also be added to indicate that the function result is a constant or volatile lvalue. 2825 \begin{rationale} 2826 The ©const© and ©volatile© qualifiers can only be sensibly used to qualify the return type of a function if the ©lvalue© qualifier is also used. 2873 2827 \end{rationale} 2874 2828 … … 2877 2831 2878 2832 \begin{rationale} 2879 \lstinline@lvalue@ provides some of the functionality of {\CC}'s ``\lstinline@T&@'' ( reference to object of type \lstinline@T@) type.2833 ©lvalue© provides some of the functionality of {\CC}'s ``©T&©'' ( reference to object of type ©T©) type. 2880 2834 Reference types have four uses in {\CC}. 2881 2835 \begin{itemize} … … 2884 2838 2885 2839 \item 2886 A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal \lstinline@with@statement.2840 A reference can be used to define an alias for a complicated lvalue expression, as a way of getting some of the functionality of the Pascal ©with© statement. 2887 2841 The following {\CC} code gives an example. 2888 2842 \begin{lstlisting} … … 2897 2851 A reference parameter can be used to allow a function to modify an argument without forcing the caller to pass the address of the argument. 2898 2852 This is most useful for user-defined assignment operators. 2899 In {\CC}, plain assignment is done by a function called `` \lstinline@operator=@'', and the two expressions2853 In {\CC}, plain assignment is done by a function called ``©operator=©'', and the two expressions 2900 2854 \begin{lstlisting} 2901 2855 a = b; 2902 2856 operator=( a, b ); 2903 2857 \end{lstlisting} are equivalent. 2904 If \lstinline@a@ and \lstinline@b@ are of type \lstinline@T@, then the first parameter of \lstinline@operator=@ must have type ``\lstinline@T&@''. 2905 It cannot have type 2906 \lstinline@T@, because then assignment couldn't alter the variable, and it can't have type 2907 ``\lstinline@T *@'', because the assignment would have to be written ``\lstinline@&a = b;@''. 2908 2909 In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``\lstinline@a = b;@'' is equivalent to 2910 ``\lstinline@operator=(&( a), b )@''. 2911 Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``\lstinline@&@''. 2858 If ©a© and ©b© are of type ©T©, then the first parameter of ©operator=© must have type ``©T&©''. 2859 It cannot have type ©T©, because then assignment couldn't alter the variable, and it can't have type ``©T *©'', because the assignment would have to be written ``©&a = b;©''. 2860 2861 In the case of user-defined operators, this could just as well be handled by using pointer types and by changing the rewrite rules so that ``©a = b;©'' is equivalent to ``©operator=(&( a), b )©''. 2862 Reference parameters of ``normal'' functions are Bad Things, because they remove a useful property of C function calls: an argument can only be modified by a function if it is preceded by ``©&©''. 2912 2863 2913 2864 \item 2914 2865 References to \Index{const-qualified} types can be used instead of value parameters. Given the 2915 {\CC} function call `` \lstinline@fiddle( a_thing )@'', where the type of \lstinline@a_thing@is2916 \lstinline@Thing@, the type of \lstinline@fiddle@could be either of2866 {\CC} function call ``©fiddle( a_thing )©'', where the type of ©a_thing© is 2867 ©Thing©, the type of ©fiddle© could be either of 2917 2868 \begin{lstlisting} 2918 2869 void fiddle( Thing ); 2919 2870 void fiddle( const Thing & ); 2920 2871 \end{lstlisting} 2921 If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within \lstinline@fiddle@the parameter is subject to the usual problems caused by aliases.2922 The reference form might be chosen for efficiency's sake if \lstinline@Thing@s are too large or their constructors or destructors are too expensive.2872 If the second form is used, then constructors and destructors are not invoked to create a temporary variable at the call site ( and it is bad style for the caller to make any assumptions about such things), and within ©fiddle© the parameter is subject to the usual problems caused by aliases. 2873 The reference form might be chosen for efficiency's sake if ©Thing©s are too large or their constructors or destructors are too expensive. 2923 2874 An implementation may switch between them without causing trouble for well-behaved clients. 2924 2875 This leaves the implementor to define ``too large'' and ``too expensive''. … … 2928 2879 void fiddle( const volatile Thing ); 2929 2880 \end{lstlisting} with call-by-reference. 2930 Since it knows all about the size of \lstinline@Thing@s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''.2881 Since it knows all about the size of ©Thing©s and the parameter passing mechanism, it should be able to come up with a better definition of ``too large'', and may be able to make a good guess at ``too expensive''. 2931 2882 \end{itemize} 2932 2883 … … 2948 2899 \begin{syntax} 2949 2900 \lhs{spec-definition} 2950 \rhs \lstinline@spec@\nonterm{identifier}2951 \lstinline@(@ \nonterm{type-parameter-list} \lstinline@)@2952 \lstinline@{@ \nonterm{spec-declaration-list}\opt \lstinline@}@2901 \rhs ©spec© \nonterm{identifier} 2902 ©(© \nonterm{type-parameter-list} ©)© 2903 ©{© \nonterm{spec-declaration-list}\opt ©}© 2953 2904 \lhs{spec-declaration-list} 2954 \rhs \nonterm{spec-declaration} \lstinline@;@2955 \rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} \lstinline@;@2905 \rhs \nonterm{spec-declaration} ©;© 2906 \rhs \nonterm{spec-declaration-list} \nonterm{spec-declaration} ©;© 2956 2907 \lhs{spec-declaration} 2957 2908 \rhs \nonterm{specifier-qualifier-list} \nonterm{declarator-list} 2958 2909 \lhs{declarator-list} 2959 2910 \rhs \nonterm{declarator} 2960 \rhs \nonterm{declarator-list} \lstinline@,@\nonterm{declarator}2911 \rhs \nonterm{declarator-list} ©,© \nonterm{declarator} 2961 2912 \end{syntax} 2962 2913 \begin{rationale} … … 2980 2931 \rhs \nonterm{assertion-list} \nonterm{assertion} 2981 2932 \lhs{assertion} 2982 \rhs \lstinline@|@ \nonterm{identifier} \lstinline@(@ \nonterm{type-name-list} \lstinline@)@2983 \rhs \lstinline@|@\nonterm{spec-declaration}2933 \rhs ©|© \nonterm{identifier} ©(© \nonterm{type-name-list} ©)© 2934 \rhs ©|© \nonterm{spec-declaration} 2984 2935 \lhs{type-name-list} 2985 2936 \rhs \nonterm{type-name} 2986 \rhs \nonterm{type-name-list} \lstinline@,@\nonterm{type-name}2937 \rhs \nonterm{type-name-list} ©,© \nonterm{type-name} 2987 2938 \end{syntax} 2988 2939 … … 2991 2942 The \nonterm{type-name-list} shall contain one \nonterm{type-name} argument for each \nonterm{type-parameter} in that specification's \nonterm{spec-parameter-list}. 2992 2943 If the 2993 \nonterm{type-parameter} uses type-class \lstinline@type@\use{type}, the argument shall be the type name of an \Index{object type};2994 if it uses \lstinline@dtype@, the argument shall be the type name of an object type or an \Index{incomplete type};2995 and if it uses \lstinline@ftype@, the argument shall be the type name of a \Index{function type}.2944 \nonterm{type-parameter} uses type-class ©type©\use{type}, the argument shall be the type name of an \Index{object type}; 2945 if it uses ©dtype©, the argument shall be the type name of an object type or an \Index{incomplete type}; 2946 and if it uses ©ftype©, the argument shall be the type name of a \Index{function type}. 2996 2947 2997 2948 \semantics 2998 An \define{assertion} is a declaration of a collection of objects and functions, called 2999 \define{assertion parameters}. 2949 An \define{assertion} is a declaration of a collection of objects and functions, called \define{assertion parameters}. 3000 2950 3001 2951 The assertion parameters produced by an assertion that applies the name of a specification to type arguments are found by taking the declarations specified in the specification and treating each of the specification's parameters as a synonym for the corresponding \nonterm{type-name} argument. … … 3023 2973 trait sum_list( otype List, otype Element | summable( Element ) | list_of( List, Element ) ) {}; 3024 2974 \end{lstlisting} 3025 \lstinline@sum_list@contains seven declarations, which describe a list whose elements can be added up.3026 The assertion `` \lstinline@|sum_list( i_list, int )@''\use{sum_list} produces the assertion parameters2975 ©sum_list© contains seven declarations, which describe a list whose elements can be added up. 2976 The assertion ``©|sum_list( i_list, int )©''\use{sum_list} produces the assertion parameters 3027 2977 \begin{lstlisting} 3028 2978 int ?+=?( int *, int ); … … 3041 2991 \lhs{type-parameter-list} 3042 2992 \rhs \nonterm{type-parameter} 3043 \rhs \nonterm{type-parameter-list} \lstinline@,@\nonterm{type-parameter}2993 \rhs \nonterm{type-parameter-list} ©,© \nonterm{type-parameter} 3044 2994 \lhs{type-parameter} 3045 2995 \rhs \nonterm{type-class} \nonterm{identifier} \nonterm{assertion-list}\opt 3046 2996 \lhs{type-class} 3047 \rhs \lstinline@type@3048 \rhs \lstinline@dtype@3049 \rhs \lstinline@ftype@2997 \rhs ©type© 2998 \rhs ©dtype© 2999 \rhs ©ftype© 3050 3000 \lhs{type-declaration} 3051 \rhs \nonterm{storage-class-specifier}\opt \lstinline@type@\nonterm{type-declarator-list} \verb|;|3001 \rhs \nonterm{storage-class-specifier}\opt ©type© \nonterm{type-declarator-list} \verb|;| 3052 3002 \lhs{type-declarator-list} 3053 3003 \rhs \nonterm{type-declarator} 3054 \rhs \nonterm{type-declarator-list} \lstinline@,@\nonterm{type-declarator}3004 \rhs \nonterm{type-declarator-list} ©,© \nonterm{type-declarator} 3055 3005 \lhs{type-declarator} 3056 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt \lstinline@=@\nonterm{type-name}3006 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt ©=© \nonterm{type-name} 3057 3007 \rhs \nonterm{identifier} \nonterm{assertion-list}\opt 3058 3008 \end{syntax} … … 3065 3015 3066 3016 An identifier declared by a \nonterm{type-parameter} has \Index{no linkage}. 3067 Identifiers declared with type-class \lstinline@type@\use{type} are \Index{object type}s; 3068 those declared with type-class 3069 \lstinline@dtype@\use{dtype} are \Index{incomplete type}s; 3070 and those declared with type-class 3071 \lstinline@ftype@\use{ftype} are \Index{function type}s. 3017 Identifiers declared with type-class ©type©\use{type} are \Index{object type}s; 3018 those declared with type-class ©dtype©\use{dtype} are \Index{incomplete type}s; 3019 and those declared with type-class ©ftype©\use{ftype} are \Index{function type}s. 3072 3020 The identifier has \Index{block scope} that terminates at the end of the \nonterm{spec-declaration-list} or polymorphic function that contains the \nonterm{type-parameter}. 3073 3021 … … 3077 3025 Within the scope of the declaration, \Index{implicit conversion}s can be performed between the defined type and the implementation type, and between pointers to the defined type and pointers to the implementation type. 3078 3026 3079 A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier \lstinline@static@\use{static} defines an \Index{incomplete type}. 3080 If a 3081 \Index{translation unit} or \Index{block} contains one or more such declarations for an identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block, which would define a new type known only within that block). 3027 A type declaration without an \Index{initializer} and without a \Index{storage-class specifier} or with storage-class specifier ©static©\use{static} defines an \Index{incomplete type}. 3028 If a \Index{translation unit} or \Index{block} contains one or more such declarations for an identifier, it must contain exactly one definition of the identifier ( but not in an enclosed block, which would define a new type known only within that block). 3082 3029 \begin{rationale} 3083 3030 Incomplete type declarations allow compact mutually-recursive types. … … 3096 3043 \end{rationale} 3097 3044 3098 A type declaration without an initializer and with \Index{storage-class specifier} 3099 \lstinline@extern@\use{extern} is an \define{opaque type declaration}. 3100 Opaque types are 3101 \Index{object type}s. 3045 A type declaration without an initializer and with \Index{storage-class specifier} ©extern©\use{extern} is an \define{opaque type declaration}. 3046 Opaque types are \Index{object type}s. 3102 3047 An opaque type is not a \nonterm{constant-expression}; 3103 neither is a structure or union that has a member whose type is not a \nonterm{constant-expression}. Every other3104 \Index{object type} is a \nonterm{constant-expression}.3048 neither is a structure or union that has a member whose type is not a \nonterm{constant-expression}. 3049 Every other \Index{object type} is a \nonterm{constant-expression}. 3105 3050 Objects with static storage duration shall be declared with a type that is a \nonterm{constant-expression}. 3106 3051 \begin{rationale} … … 3112 3057 \end{rationale} 3113 3058 3114 An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} \lstinline@dtype@. 3115 An object type\index{object types} which is not a qualified version of a type is a value of type-classes \lstinline@type@ and \lstinline@dtype@. 3116 A 3117 \Index{function type} is a value of type-class \lstinline@ftype@. 3059 An \Index{incomplete type} which is not a qualified version\index{qualified type} of a type is a value of \Index{type-class} ©dtype©. 3060 An object type\index{object types} which is not a qualified version of a type is a value of type-classes ©type© and ©dtype©. 3061 A \Index{function type} is a value of type-class ©ftype©. 3118 3062 \begin{rationale} 3119 3063 Syntactically, a type value is a \nonterm{type-name}, which is a declaration for an object which omits the identifier being declared. … … 3124 3068 3125 3069 Type qualifiers are a weak point of C's type system. 3126 Consider the standard library function 3127 \lstinline@strchr()@ which, given a string and a character, returns a pointer to the first occurrence of the character in the string. 3070 Consider the standard library function ©strchr()© which, given a string and a character, returns a pointer to the first occurrence of the character in the string. 3128 3071 \begin{lstlisting} 3129 3072 char *strchr( const char *s, int c ) {§\impl{strchr}§ … … 3134 3077 } 3135 3078 \end{lstlisting} 3136 The parameter \lstinline@s@ must be \lstinline@const char *@, because \lstinline@strchr()@ might be used to search a constant string, but the return type must be \lstinline@char *@, because the result might be used to modify a non-constant string. 3137 Hence the body must perform a cast, and ( even worse) 3138 \lstinline@strchr()@ provides a type-safe way to attempt to modify constant strings. 3139 What is needed is some way to say that \lstinline@s@'s type might contain qualifiers, and the result type has exactly the same qualifiers. 3079 The parameter ©s© must be ©const char *©, because ©strchr()© might be used to search a constant string, but the return type must be ©char *©, because the result might be used to modify a non-constant string. 3080 Hence the body must perform a cast, and ( even worse) ©strchr()© provides a type-safe way to attempt to modify constant strings. 3081 What is needed is some way to say that ©s©'s type might contain qualifiers, and the result type has exactly the same qualifiers. 3140 3082 Polymorphic functions do not provide a fix for this deficiency\index{deficiencies!pointers to qualified types}, because type qualifiers are not part of type values. 3141 Instead, overloading can be used to define \lstinline@strchr()@for each combination of qualifiers.3083 Instead, overloading can be used to define ©strchr()© for each combination of qualifiers. 3142 3084 \end{rationale} 3143 3085 … … 3163 3105 }; 3164 3106 \end{lstlisting} 3165 Without this restriction, \CFA might require ``module initialization'' code ( since 3166 \lstinline@Rational@ has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines \lstinline@Huge@ and the translation that declares \lstinline@Rational@. 3107 Without this restriction, \CFA might require ``module initialization'' code ( since ©Rational© has external linkage, it must be created before any other translation unit instantiates it), and would force an ordering on the initialization of the translation unit that defines ©Huge© and the translation that declares ©Rational©. 3167 3108 3168 3109 A benefit of the restriction is that it prevents the declaration in separate translation units of types that contain each other, which would be hard to prevent otherwise. … … 3170 3111 // File a.c: 3171 3112 extern type t1; 3172 type t2 = struct { t1 f1; ... } 3113 type t2 = struct { t1 f1; ... } // illegal 3173 3114 // File b.c: 3174 3115 extern type t2; 3175 type t1 = struct { t2 f2; ... } 3116 type t1 = struct { t2 f2; ... } // illegal 3176 3117 \end{lstlisting} 3177 3118 \end{rationale} … … 3181 3122 \nonterm{struct-declaration}, type declarations can not be structure members. 3182 3123 The form of 3183 \nonterm{type-declaration} forbids arrays of, pointers to, and functions returning \lstinline@type@.3124 \nonterm{type-declaration} forbids arrays of, pointers to, and functions returning ©type©. 3184 3125 Hence the syntax of \nonterm{type-specifier} does not have to be extended to allow type-valued expressions. 3185 3126 It also side-steps the problem of type-valued expressions producing different values in different declarations. … … 3196 3137 #include <stdlib.h> 3197 3138 T * new( otype T ) { return ( T * )malloc( sizeof( T) ); }; 3198 §\ldots§int * ip = new( int );3199 \end{lstlisting} 3200 This looks sensible, but \CFA's declaration-before-use rules mean that `` \lstinline@T@'' in the function body refers to the parameter, but the ``\lstinline@T@'' in the return type refers to the meaning of \lstinline@T@ in the scope that contains \lstinline@new@;3139 ... int * ip = new( int ); 3140 \end{lstlisting} 3141 This looks sensible, but \CFA's declaration-before-use rules mean that ``©T©'' in the function body refers to the parameter, but the ``©T©'' in the return type refers to the meaning of ©T© in the scope that contains ©new©; 3201 3142 it could be undefined, or a type name, or a function or variable name. 3202 3143 Nothing good can result from such a situation. … … 3215 3156 f2( v2 ); 3216 3157 \end{lstlisting} 3217 \lstinline@V1@ is passed by value, so \lstinline@f1()@'s assignment to \lstinline@a[0]@ does not modify v1. \lstinline@V2@ is converted to a pointer, so \lstinline@f2()@ modifies \lstinline@v2[0]@.3158 ©V1© is passed by value, so ©f1()©'s assignment to ©a[0]© does not modify v1. ©V2© is converted to a pointer, so ©f2()© modifies ©v2[0]©. 3218 3159 3219 3160 A translation unit containing the declarations … … 3221 3162 extern type Complex;§\use{Complex}§ // opaque type declaration 3222 3163 extern float abs( Complex );§\use{abs}§ 3223 \end{lstlisting} can contain declarations of complex numbers, which can be passed to \lstinline@abs@.3224 Some other translation unit must implement \lstinline@Complex@ and \lstinline@abs@.3164 \end{lstlisting} can contain declarations of complex numbers, which can be passed to ©abs©. 3165 Some other translation unit must implement ©Complex© and ©abs©. 3225 3166 That unit might contain the declarations 3226 3167 \begin{lstlisting} … … 3231 3172 } 3232 3173 \end{lstlisting} 3233 Note that \lstinline@c@ is implicitly converted to a \lstinline@struct@so that its components can be retrieved.3174 Note that ©c© is implicitly converted to a ©struct© so that its components can be retrieved. 3234 3175 3235 3176 \begin{lstlisting} … … 3239 3180 } 3240 3181 \end{lstlisting} 3241 \lstinline@t1@must be cast to its implementation type to prevent infinite recursion.3182 ©t1© must be cast to its implementation type to prevent infinite recursion. 3242 3183 3243 3184 \begin{rationale} 3244 3185 Within the scope of a type definition, an instance of the type can be viewed as having that type or as having the implementation type. 3245 In the \lstinline@Time_of_day@example, the difference is important.3186 In the ©Time_of_day© example, the difference is important. 3246 3187 Different languages have treated the distinction between the abstraction and the implementation in different ways. 3247 3188 \begin{itemize} 3248 3189 \item 3249 3190 Inside a Clu cluster \cite{CLU}, the declaration of an instance states which view applies. 3250 Two primitives called \lstinline@up@ and \lstinline@down@can be used to convert between the views.3191 Two primitives called ©up© and ©down© can be used to convert between the views. 3251 3192 \item 3252 3193 The Simula class \cite{SIMULA87} is essentially a record type. 3253 3194 Since the only operations on a record are member selection and assignment, which can not be overloaded, there is never any ambiguity as to whether the abstraction or the implementation view is being used. 3254 3195 In {\CC} 3255 \cite{C++}, operations on class instances include assignment and `` \lstinline@&@'', which can be overloaded.3196 \cite{C++}, operations on class instances include assignment and ``©&©'', which can be overloaded. 3256 3197 A ``scope resolution'' operator can be used inside the class to specify whether the abstract or implementation version of the operation should be used. 3257 3198 \item … … 3266 3207 In this case, explicit conversions between the derived type and the old type can be used. 3267 3208 \end{itemize} 3268 \CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of \lstinline@up@ and \lstinline@down@.3209 \CFA's rules are like Clu's, except that implicit conversions and conversion costs allow it to do away with most uses of ©up© and ©down©. 3269 3210 \end{rationale} 3270 3211 … … 3272 3213 \subsubsection{Default functions and objects} 3273 3214 3274 A declaration\index{type declaration} of a type identifier \lstinline@T@ with type-class 3275 \lstinline@type@ implicitly declares a \define{default assignment} function 3276 \lstinline@T ?=?( T *, T )@\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@. 3215 A declaration\index{type declaration} of a type identifier ©T© with type-class ©type© implicitly declares a \define{default assignment} function ©T ?=?( T *, T )©\use{?=?}, with the same \Index{scope} and \Index{linkage} as the identifier ©T©. 3277 3216 \begin{rationale} 3278 3217 Assignment is central to C's imperative programming style, and every existing C object type has assignment defined for it ( except for array types, which are treated as pointer types for purposes of assignment). 3279 3218 Without this rule, nearly every inferred type parameter would need an accompanying assignment assertion parameter. 3280 If a type parameter should not have an assignment operation, 3281 \lstinline@dtype@ should be used. 3219 If a type parameter should not have an assignment operation, ©dtype© should be used. 3282 3220 If a type should not have assignment defined, the user can define an assignment function that causes a run-time error, or provide an external declaration but no definition and thus cause a link-time error. 3283 3221 \end{rationale} 3284 3222 3285 A definition\index{type definition} of a type identifier \lstinline@T@ with \Index{implementation type} \lstinline@I@ and type-class \lstinline@type@ implicitly defines a default assignment function. 3286 A definition\index{type definition} of a type identifier \lstinline@T@ with implementation type \lstinline@I@ and an assertion list implicitly defines \define{default function}s and 3287 \define{default object}s as declared by the assertion declarations. 3288 The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier \lstinline@T@. 3223 A definition\index{type definition} of a type identifier ©T© with \Index{implementation type} ©I© and type-class ©type© implicitly defines a default assignment function. 3224 A definition\index{type definition} of a type identifier ©T© with implementation type ©I© and an assertion list implicitly defines \define{default function}s and \define{default object}s as declared by the assertion declarations. 3225 The default objects and functions have the same \Index{scope} and \Index{linkage} as the identifier ©T©. 3289 3226 Their values are determined as follows: 3290 3227 \begin{itemize} 3291 3228 \item 3292 If at the definition of \lstinline@T@ there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of \lstinline@I@ replaced by \lstinline@T@is compatible with the type of the default object, then the default object is initialized with that object.3293 Otherwise the scope of the declaration of \lstinline@T@must contain a definition of the default object.3229 If at the definition of ©T© there is visible a declaration of an object with the same name as the default object, and if the type of that object with all occurrence of ©I© replaced by ©T© is compatible with the type of the default object, then the default object is initialized with that object. 3230 Otherwise the scope of the declaration of ©T© must contain a definition of the default object. 3294 3231 3295 3232 \item 3296 If at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of \lstinline@I@ replaced by \lstinline@T@is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result.3297 3298 Otherwise, if \lstinline@I@ contains exactly one anonymous member\index{anonymous member} such that at the definition of \lstinline@T@ there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by \lstinline@T@is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result.3299 3300 Otherwise the scope of the declaration of \lstinline@T@must contain a definition of the default function.3233 If at the definition of ©T© there is visible a declaration of a function with the same name as the default function, and if the type of that function with all occurrence of ©I© replaced by ©T© is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the converted result. 3234 3235 Otherwise, if ©I© contains exactly one anonymous member\index{anonymous member} such that at the definition of ©T© there is visible a declaration of a function with the same name as the default function, and the type of that function with all occurrences of the anonymous member's type in its parameter list replaced by ©T© is compatible with the type of the default function, then the default function calls that function after converting its arguments and returns the result. 3236 3237 Otherwise the scope of the declaration of ©T© must contain a definition of the default function. 3301 3238 \end{itemize} 3302 3239 \begin{rationale} … … 3304 3241 \end{rationale} 3305 3242 3306 A function or object with the same type and name as a default function or object that is declared within the scope of the definition of \lstinline@T@replaces the default function or object.3243 A function or object with the same type and name as a default function or object that is declared within the scope of the definition of ©T© replaces the default function or object. 3307 3244 3308 3245 \examples … … 3314 3251 Pair b = { 1, 1 }; 3315 3252 \end{lstlisting} 3316 The definition of \lstinline@Pair@ implicitly defines two objects \lstinline@a@ and \lstinline@b@. 3317 \lstinline@Pair a@ inherits its value from the \lstinline@struct impl a@. 3318 The definition of 3319 \lstinline@Pair b@ is compulsory because there is no \lstinline@struct impl b@ to construct a value from. 3253 The definition of ©Pair© implicitly defines two objects ©a© and ©b©. 3254 ©Pair a© inherits its value from the ©struct impl a©. 3255 The definition of ©Pair b© is compulsory because there is no ©struct impl b© to construct a value from. 3320 3256 \begin{lstlisting} 3321 3257 trait ss( otype T ) { … … 3330 3266 Doodad clone( Doodad ) { ... } 3331 3267 \end{lstlisting} 3332 The definition of \lstinline@Doodad@implicitly defines three functions:3268 The definition of ©Doodad© implicitly defines three functions: 3333 3269 \begin{lstlisting} 3334 3270 Doodad ?=?( Doodad *, Doodad ); … … 3336 3272 void munge( Doodad * ); 3337 3273 \end{lstlisting} 3338 The assignment function inherits \lstinline@struct doodad@'s assignment function because the types match when \lstinline@struct doodad@ is replaced by \lstinline@Doodad@ throughout. 3339 \lstinline@munge()@ inherits \lstinline@Whatsit@'s \lstinline@munge()@ because the types match when 3340 \lstinline@Whatsit@ is replaced by \lstinline@Doodad@ in the parameter list. \lstinline@clone()@ does \emph{not} inherit \lstinline@Whatsit@'s \lstinline@clone()@: replacement in the parameter list yields ``\lstinline@Whatsit clone( Doodad )@'', which is not compatible with 3341 \lstinline@Doodad@'s \lstinline@clone()@'s type. 3342 Hence the definition of 3343 ``\lstinline@Doodad clone( Doodad )@'' is necessary. 3274 The assignment function inherits ©struct doodad©'s assignment function because the types match when ©struct doodad© is replaced by ©Doodad© throughout. 3275 ©munge()© inherits ©Whatsit©'s ©munge()© because the types match when ©Whatsit© is replaced by ©Doodad© in the parameter list. ©clone()© does \emph{not} inherit ©Whatsit©'s ©clone()©: replacement in the parameter list yields ``©Whatsit clone( Doodad )©'', which is not compatible with ©Doodad©'s ©clone()©'s type. 3276 Hence the definition of ``©Doodad clone( Doodad )©'' is necessary. 3344 3277 3345 3278 Default functions and objects are subject to the normal scope rules. 3346 3279 \begin{lstlisting} 3347 otype T = §\ldots§;3348 T a_T = §\ldots§; // Default assignment used.3280 otype T = ...; 3281 T a_T = ...; // Default assignment used. 3349 3282 T ?=?( T *, T ); 3350 T a_T = §\ldots§; // Programmer-defined assignment called.3283 T a_T = ...; // Programmer-defined assignment called. 3351 3284 \end{lstlisting} 3352 3285 \begin{rationale} … … 3381 3314 \begin{syntax} 3382 3315 \oldlhs{labeled-statement} 3383 \rhs \lstinline@case@\nonterm{case-value-list} : \nonterm{statement}3316 \rhs ©case© \nonterm{case-value-list} : \nonterm{statement} 3384 3317 \lhs{case-value-list} 3385 3318 \rhs \nonterm{case-value} 3386 \rhs \nonterm{case-value-list} \lstinline@,@\nonterm{case-value}3319 \rhs \nonterm{case-value-list} ©,© \nonterm{case-value} 3387 3320 \lhs{case-value} 3388 3321 \rhs \nonterm{constant-expression} 3389 3322 \rhs \nonterm{subrange} 3390 3323 \lhs{subrange} 3391 \rhs \nonterm{constant-expression} \lstinline@~@\nonterm{constant-expression}3324 \rhs \nonterm{constant-expression} ©~© \nonterm{constant-expression} 3392 3325 \end{syntax} 3393 3326 … … 3402 3335 case 1~4, 9~14, 27~32: 3403 3336 \end{lstlisting} 3404 The \lstinline@case@ and \lstinline@default@ clauses are restricted within the \lstinline@switch@ and \lstinline@choose@statements, precluding Duff's device.3337 The ©case© and ©default© clauses are restricted within the ©switch© and ©choose© statements, precluding Duff's device. 3405 3338 3406 3339 3407 3340 \subsection{Expression and null statements} 3408 3341 3409 The expression in an expression statement is treated as being cast to \lstinline@void@.3342 The expression in an expression statement is treated as being cast to ©void©. 3410 3343 3411 3344 … … 3414 3347 \begin{syntax} 3415 3348 \oldlhs{selection-statement} 3416 \rhs \lstinline@choose@ \lstinline@(@ \nonterm{expression} \lstinline@)@\nonterm{statement}3349 \rhs ©choose© ©(© \nonterm{expression} ©)© \nonterm{statement} 3417 3350 \end{syntax} 3418 3351 3419 The controlling expression \lstinline@E@ in the \lstinline@switch@ and \lstinline@choose@statement:3352 The controlling expression ©E© in the ©switch© and ©choose© statement: 3420 3353 \begin{lstlisting} 3421 3354 switch ( E ) ... … … 3423 3356 \end{lstlisting} may have more than one interpretation, but it shall have only one interpretation with an integral type. 3424 3357 An \Index{integer promotion} is performed on the expression if necessary. 3425 The constant expressions in \lstinline@case@statements with the switch are converted to the promoted type.3358 The constant expressions in ©case© statements with the switch are converted to the promoted type. 3426 3359 3427 3360 … … 3429 3362 \subsubsection[The choose statement]{The \lstinline@choose@ statement} 3430 3363 3431 The \lstinline@choose@ statement is the same as the \lstinline@switch@ statement except control transfers to the end of the \lstinline@choose@ statement at a \lstinline@case@ or \lstinline@default@labeled statement.3432 The \lstinline@fallthru@ statement is used to fall through to the next \lstinline@case@ or \lstinline@default@labeled statement.3364 The ©choose© statement is the same as the ©switch© statement except control transfers to the end of the ©choose© statement at a ©case© or ©default© labeled statement. 3365 The ©fallthru© statement is used to fall through to the next ©case© or ©default© labeled statement. 3433 3366 The following have identical meaning: 3434 3367 \begin{flushleft} … … 3455 3388 \end{tabular} 3456 3389 \end{flushleft} 3457 The \lstinline@choose@ statement addresses the problem of accidental fall-through associated with the \lstinline@switch@statement.3390 The ©choose© statement addresses the problem of accidental fall-through associated with the ©switch© statement. 3458 3391 3459 3392 3460 3393 \subsection{Iteration statements} 3461 3394 3462 The controlling expression \lstinline@E@in the loops3395 The controlling expression ©E© in the loops 3463 3396 \begin{lstlisting} 3464 3397 if ( E ) ... 3465 3398 while ( E ) ... 3466 3399 do ... while ( E ); 3467 \end{lstlisting} is treated as ``\lstinline@( int )((E)!=0)@''. 3400 \end{lstlisting} 3401 is treated as ``©( int )((E)!=0)©''. 3468 3402 3469 3403 The statement 3470 3404 \begin{lstlisting} 3471 for ( a; b; c ) §\ldots§3405 for ( a; b; c ) ... 3472 3406 \end{lstlisting} is treated as 3473 3407 \begin{lstlisting} … … 3480 3414 \begin{syntax} 3481 3415 \oldlhs{jump-statement} 3482 \rhs \lstinline@continue@\nonterm{identifier}\opt3483 \rhs \lstinline@break@\nonterm{identifier}\opt3416 \rhs ©continue© \nonterm{identifier}\opt 3417 \rhs ©break© \nonterm{identifier}\opt 3484 3418 \rhs \ldots 3485 \rhs \lstinline@throw@\nonterm{assignment-expression}\opt3486 \rhs \lstinline@throwResume@\nonterm{assignment-expression}\opt \nonterm{at-expression}\opt3487 \lhs{at-expression} \lstinline@_At@\nonterm{assignment-expression}3419 \rhs ©throw© \nonterm{assignment-expression}\opt 3420 \rhs ©throwResume© \nonterm{assignment-expression}\opt \nonterm{at-expression}\opt 3421 \lhs{at-expression} ©_At© \nonterm{assignment-expression} 3488 3422 \end{syntax} 3489 3423 3490 Labeled \lstinline@continue@ and \lstinline@break@ allow useful but restricted control-flow that reduces the need for the \lstinline@goto@statement for exiting multiple nested control-structures.3424 Labeled ©continue© and ©break© allow useful but restricted control-flow that reduces the need for the ©goto© statement for exiting multiple nested control-structures. 3491 3425 \begin{lstlisting} 3492 3426 L1: { // compound … … 3517 3451 \subsubsection[The continue statement]{The \lstinline@continue@ statement} 3518 3452 3519 The identifier in a \lstinline@continue@statement shall name a label located on an enclosing iteration statement.3453 The identifier in a ©continue© statement shall name a label located on an enclosing iteration statement. 3520 3454 3521 3455 3522 3456 \subsubsection[The break statement]{The \lstinline@break@ statement} 3523 3457 3524 The identifier in a \lstinline@break@statement shall name a label located on an enclosing compound, selection or iteration statement.3458 The identifier in a ©break© statement shall name a label located on an enclosing compound, selection or iteration statement. 3525 3459 3526 3460 3527 3461 \subsubsection[The return statement]{The \lstinline@return@ statement} 3528 3462 3529 An expression in a \lstinline@return@statement is treated as being cast to the result type of the function.3463 An expression in a ©return© statement is treated as being cast to the result type of the function. 3530 3464 3531 3465 … … 3542 3476 \begin{syntax} 3543 3477 \lhs{exception-statement} 3544 \rhs \lstinline@try@\nonterm{compound-statement} \nonterm{handler-list}3545 \rhs \lstinline@try@\nonterm{compound-statement} \nonterm{finally-clause}3546 \rhs \lstinline@try@\nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause}3478 \rhs ©try© \nonterm{compound-statement} \nonterm{handler-list} 3479 \rhs ©try© \nonterm{compound-statement} \nonterm{finally-clause} 3480 \rhs ©try© \nonterm{compound-statement} \nonterm{handler-list} \nonterm{finally-clause} 3547 3481 \lhs{handler-list} 3548 3482 \rhs \nonterm{handler-clause} 3549 \rhs \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@\nonterm{compound-statement}3550 \rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \ldots \lstinline@)@\nonterm{compound-statement}3551 \rhs \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@\nonterm{compound-statement}3552 \rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \ldots \lstinline@)@\nonterm{compound-statement}3483 \rhs ©catch© ©(© \ldots ©)© \nonterm{compound-statement} 3484 \rhs \nonterm{handler-clause} ©catch© ©(© \ldots ©)© \nonterm{compound-statement} 3485 \rhs ©catchResume© ©(© \ldots ©)© \nonterm{compound-statement} 3486 \rhs \nonterm{handler-clause} ©catchResume© ©(© \ldots ©)© \nonterm{compound-statement} 3553 3487 \lhs{handler-clause} 3554 \rhs \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@\nonterm{compound-statement}3555 \rhs \nonterm{handler-clause} \lstinline@catch@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@\nonterm{compound-statement}3556 \rhs \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@\nonterm{compound-statement}3557 \rhs \nonterm{handler-clause} \lstinline@catchResume@ \lstinline@(@ \nonterm{exception-declaration} \lstinline@)@\nonterm{compound-statement}3488 \rhs ©catch© ©(© \nonterm{exception-declaration} ©)© \nonterm{compound-statement} 3489 \rhs \nonterm{handler-clause} ©catch© ©(© \nonterm{exception-declaration} ©)© \nonterm{compound-statement} 3490 \rhs ©catchResume© ©(© \nonterm{exception-declaration} ©)© \nonterm{compound-statement} 3491 \rhs \nonterm{handler-clause} ©catchResume© ©(© \nonterm{exception-declaration} ©)© \nonterm{compound-statement} 3558 3492 \lhs{finally-clause} 3559 \rhs \lstinline@finally@\nonterm{compound-statement}3493 \rhs ©finally© \nonterm{compound-statement} 3560 3494 \lhs{exception-declaration} 3561 3495 \rhs \nonterm{type-specifier} … … 3565 3499 \rhs \nonterm{new-abstract-declarator-tuple} 3566 3500 \lhs{asynchronous-statement} 3567 \rhs \lstinline@enable@\nonterm{identifier-list} \nonterm{compound-statement}3568 \rhs \lstinline@disable@\nonterm{identifier-list} \nonterm{compound-statement}3501 \rhs ©enable© \nonterm{identifier-list} \nonterm{compound-statement} 3502 \rhs ©disable© \nonterm{identifier-list} \nonterm{compound-statement} 3569 3503 \end{syntax} 3570 3504 … … 3574 3508 \subsubsection[The try statement]{The \lstinline@try@ statement} 3575 3509 3576 The \lstinline@try@statement is a block with associated handlers, called a \Index{guarded block};3510 The ©try© statement is a block with associated handlers, called a \Index{guarded block}; 3577 3511 all other blocks are \Index{unguarded block}s. 3578 A \lstinline@goto@, \lstinline@break@, \lstinline@return@, or \lstinline@continue@statement can be used to transfer control out of a try block or handler, but not into one.3512 A ©goto©, ©break©, ©return©, or ©continue© statement can be used to transfer control out of a try block or handler, but not into one. 3579 3513 3580 3514 3581 3515 \subsubsection[The enable/disable statements]{The \lstinline@enable@/\lstinline@disable@ statements} 3582 3516 3583 The \lstinline@enable@/\lstinline@disable@statements toggle delivery of \Index{asynchronous exception}s.3517 The ©enable©/©disable© statements toggle delivery of \Index{asynchronous exception}s. 3584 3518 3585 3519 … … 3591 3525 \subsection{Predefined macro names} 3592 3526 3593 The implementation shall define the macro names \lstinline@__LINE__@, \lstinline@__FILE__@, 3594 \lstinline@__DATE__@, and \lstinline@__TIME__@, as in the {\c11} standard. 3595 It shall not define the macro name \lstinline@__STDC__@. 3596 3597 In addition, the implementation shall define the macro name \lstinline@__CFORALL__@ to be the decimal constant 1. 3527 The implementation shall define the macro names ©__LINE__©, ©__FILE__©, ©__DATE__©, and ©__TIME__©, as in the {\c11} standard. 3528 It shall not define the macro name ©__STDC__©. 3529 3530 In addition, the implementation shall define the macro name ©__CFORALL__© to be the decimal constant 1. 3598 3531 3599 3532 … … 3612 3545 The pointer, integral, and floating-point types are all \define{scalar types}. 3613 3546 All of these types can be logically negated and compared. 3614 The assertion `` \lstinline@scalar( Complex )@'' should be read as ``type \lstinline@Complex@is scalar''.3547 The assertion ``©scalar( Complex )©'' should be read as ``type ©Complex© is scalar''. 3615 3548 \begin{lstlisting} 3616 3549 trait scalar( otype T ) {§\impl{scalar}§ … … 3630 3563 \end{lstlisting} 3631 3564 3632 The various flavors of \lstinline@char@ and \lstinline@int@ and the enumerated types make up the 3633 \define{integral types}. 3565 The various flavors of ©char© and ©int© and the enumerated types make up the \define{integral types}. 3634 3566 \begin{lstlisting} 3635 3567 trait integral( otype T | arithmetic( T ) ) {§\impl{integral}§§\use{arithmetic}§ … … 3664 3596 3665 3597 Modifiable arithmetic lvalues are both modifiable scalar lvalues and arithmetic. 3666 Note that this results in the ``inheritance'' of \lstinline@scalar@along both paths.3598 Note that this results in the ``inheritance'' of ©scalar© along both paths. 3667 3599 \begin{lstlisting} 3668 3600 trait m_l_arithmetic( otype T | m_l_scalar( T ) | arithmetic( T ) ) {§\impl{m_l_arithmetic}§ … … 3679 3611 \subsection{Pointer and array types} 3680 3612 3681 Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a constant pointer to the first element of the array, and the subscript expression 3682 ``\lstinline@a[i]@'' is equivalent to the dereferencing expression ``\lstinline@(*( a+( i )))@''. 3683 Technically, pointer arithmetic and pointer comparisons other than ``\lstinline@==@'' and 3684 ``\lstinline@!=@'' are only defined for pointers to array elements, but the type system does not enforce those restrictions. 3613 Array types can barely be said to exist in {\c11}, since in most cases an array name is treated as a constant pointer to the first element of the array, and the subscript expression ``©a[i]©'' is equivalent to the dereferencing expression ``©(*( a+( i )))©''. 3614 Technically, pointer arithmetic and pointer comparisons other than ``©==©'' and ``©!=©'' are only defined for pointers to array elements, but the type system does not enforce those restrictions. 3685 3615 Consequently, there is no need for a separate ``array type'' specification. 3686 3616 3687 3617 Pointer types are scalar types. 3688 Like other scalar types, they have ``\lstinline@+@'' and 3689 ``\lstinline@-@'' operators, but the types do not match the types of the operations in 3690 \lstinline@arithmetic@, so these operators cannot be consolidated in \lstinline@scalar@. 3618 Like other scalar types, they have ``©+©'' and ``©-©'' operators, but the types do not match the types of the operations in ©arithmetic©, so these operators cannot be consolidated in ©scalar©. 3691 3619 \begin{lstlisting} 3692 3620 trait pointer( type P | scalar( P ) ) {§\impl{pointer}§§\use{scalar}§ … … 3703 3631 Specifications that define the dereference operator ( or subscript operator ) require two parameters, one for the pointer type and one for the pointed-at ( or element ) type. 3704 3632 Different specifications are needed for each set of \Index{type qualifier}s, because qualifiers are not included in types. 3705 The assertion ``\lstinline@|ptr_to( Safe_pointer, int )@'' should be read as 3706 ``\lstinline@Safe_pointer@ acts like a pointer to \lstinline@int@''. 3633 The assertion ``©|ptr_to( Safe_pointer, int )©'' should be read as ``©Safe_pointer© acts like a pointer to ©int©''. 3707 3634 \begin{lstlisting} 3708 3635 trait ptr_to( otype P | pointer( P ), otype T ) {§\impl{ptr_to}§§\use{pointer}§ … … 3724 3651 \end{lstlisting} 3725 3652 3726 Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``\lstinline@T *@'' can be assigned to a ``\lstinline@const T *@'', a ``\lstinline@volatile T *@'', and a ``\lstinline@const volatile T *@''. 3727 Again, the pointed-at type is passed in, so that assertions can connect these specifications to the 3728 ``\lstinline@ptr_to@'' specifications. 3653 Assignment to pointers is more complicated than is the case with other types, because the target's type can have extra type qualifiers in the pointed-at type: a ``©T *©'' can be assigned to a ``©const T *©'', a ``©volatile T *©'', and a ``©const volatile T *©''. 3654 Again, the pointed-at type is passed in, so that assertions can connect these specifications to the ``©ptr_to©'' specifications. 3729 3655 \begin{lstlisting} 3730 3656 trait m_l_ptr_to( otype P | m_l_pointer( P ),§\use{m_l_pointer}§§\impl{m_l_ptr_to}§ otype T | ptr_to( P, T )§\use{ptr_to}§ { … … 3755 3681 }; 3756 3682 \end{lstlisting} 3757 The assertion ``\lstinline@| m_l_ptr_like( Safe_ptr, const int * )@'' should be read as 3758 ``\lstinline@Safe_ptr@ is a pointer type like \lstinline@const int *@''. 3759 This specification has two defects, compared to the original four: there is no automatic assertion that dereferencing a 3760 \lstinline@MyP@ produces an lvalue of the type that \lstinline@CP@ points at, and the 3761 ``\lstinline@|m_l_pointer( CP )@'' assertion provides only a weak assurance that the argument passed to \lstinline@CP@ really is a pointer type. 3683 The assertion ``©| m_l_ptr_like( Safe_ptr, const int * )©'' should be read as ``©Safe_ptr© is a pointer type like ©const int *©''. 3684 This specification has two defects, compared to the original four: there is no automatic assertion that dereferencing a ©MyP© produces an lvalue of the type that ©CP© points at, and the ``©|m_l_pointer( CP )©'' assertion provides only a weak assurance that the argument passed to ©CP© really is a pointer type. 3762 3685 3763 3686 … … 3765 3688 3766 3689 Different operators often have related meanings; 3767 for instance, in C, ``\lstinline@+@'', 3768 ``\lstinline@+=@'', and the two versions of ``\lstinline@++@'' perform variations of addition. 3690 for instance, in C, ``©+©'', ``©+=©'', and the two versions of ``©++©'' perform variations of addition. 3769 3691 Languages like {\CC} and Ada allow programmers to define operators for new types, but do not require that these relationships be preserved, or even that all of the operators be implemented. 3770 3692 Completeness and consistency is left to the good taste and discretion of the programmer. … … 3779 3701 The different comparison operators have obvious relationships, but there is no obvious subset of the operations to use in the implementation of the others. 3780 3702 However, it is usually convenient to implement a single comparison function that returns a negative integer, 0, or a positive integer if its first argument is respectively less than, equal to, or greater than its second argument; 3781 the library function \lstinline@strcmp@is an example.3782 3783 C and \CFA have an extra, non-obvious comparison operator: `` \lstinline@!@'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise.3703 the library function ©strcmp© is an example. 3704 3705 C and \CFA have an extra, non-obvious comparison operator: ``©!©'', logical negation, returns 1 if its operand compares equal to 0, and 0 otherwise. 3784 3706 \begin{lstlisting} 3785 3707 trait comparable( otype T ) { … … 3829 3751 \end{lstlisting} 3830 3752 3831 Note that, although an arithmetic type would certainly provide comparison functions, and an integral type would provide arithmetic operations, there does not have to be any relationship among 3832 \lstinline@int_base@, \lstinline@arith_base@ and \lstinline@comparable@. 3753 Note that, although an arithmetic type would certainly provide comparison functions, and an integral type would provide arithmetic operations, there does not have to be any relationship among ©int_base©, ©arith_base© and ©comparable©. 3833 3754 Note also that these declarations provide guidance and assistance, but they do not define an absolutely minimal set of requirements. 3834 A truly minimal implementation of an arithmetic type might only provide \lstinline@0@, \lstinline@1@, and \lstinline@?-=?@, which would be used by polymorphic \lstinline@?+=?@, \lstinline@?*=?@, and \lstinline@?/=?@functions.3835 3836 Note also that \lstinline@short@is an integer type in C11 terms, but has no operations!3755 A truly minimal implementation of an arithmetic type might only provide ©0©, ©1©, and ©?-=?©, which would be used by polymorphic ©?+=?©, ©?*=?©, and ©?/=?© functions. 3756 3757 Note also that ©short© is an integer type in C11 terms, but has no operations! 3837 3758 3838 3759 … … 3841 3762 3842 3763 Restrict allowed to qualify anything, or type/dtype parameters, but only affects pointers. 3843 This gets into \lstinline@noalias@territory.3844 Qualifying anything (`` \lstinline@short restrict rs@'') means pointer parameters of \lstinline@?++@, etc, would need restrict qualifiers.3764 This gets into ©noalias© territory. 3765 Qualifying anything (``©short restrict rs©'') means pointer parameters of ©?++©, etc, would need restrict qualifiers. 3845 3766 3846 3767 Enumerated types. … … 3852 3773 Color, enum Color ) really make sense? ?++ does, but it adds (int)1. 3853 3774 3854 Operators on {,signed,unsigned} char and other small types. \lstinline@?<?@harmless;3775 Operators on {,signed,unsigned} char and other small types. ©?<?© harmless; 3855 3776 ?*? questionable for chars. 3856 3777 Generic selections make these choices visible. 3857 Safe conversion operators? Predefined 3858 ``promotion'' function? 3859 3860 \lstinline@register@ assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment. 3861 3862 Don't use \lstinline@ptrdiff_t@ by name in the predefineds. 3778 Safe conversion operators? Predefined ``promotion'' function? 3779 3780 ©register© assignment might be handled as assignment to a temporary with copying back and forth, but copying must not be done by assignment. 3781 3782 Don't use ©ptrdiff_t© by name in the predefineds. 3863 3783 3864 3784 Polymorphic objects. -
doc/user/user.tex
r1048b31 r1b7ea43 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sat Apr 30 13:54:32201614 %% Update Count : 2 2113 %% Last Modified On : Tue May 3 08:05:33 2016 14 %% Update Count : 246 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 17 17 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 18 19 % red highlighting ®...® (registered trademark sumbol)20 % blue highlighting ©...© (copyright symbol)21 % latex escape §...§ (section symbol) 22 % keyword escape ¶...¶ (pilcrow symbol) 19 % inline code ©...© (copyright symbol) emacs: C-q M-) 20 % red highlighting ®...® (registered trademark sumbol) emacs: C-q M-. 21 % latex escape §...§ (section symbol) emacs: C-q M-' 22 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 23 23 % math escape $...$ (dollar symbol) 24 24 … … 180 180 \CC~\cite{c++,ANSI14:C++} is an example of a similar project; 181 181 however, it largely extended the language, and did not address existing problems.\footnote{% 182 Two important existing problems addressed were changing the type of character literals from \lstinline@int@ to \lstinline@char@ and enumerator from \lstinline@int@to the type of its enumerators.}182 Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.} 183 183 Fortran~\cite{Fortran08}, Ada~\cite{Ada12}, and Cobol~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features are added and problems fixed within the framework of the existing language. 184 184 Java~\cite{Java8}, Go~\cite{Go}, Rust~\cite{Rust} and D~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent. … … 205 205 206 206 However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC. 207 For example, the C math-library provides the following routines for computing the absolute value of the basic type: \lstinline@abs@, \lstinline@labs@, \lstinline@llabs@, \lstinline@fabs@, \lstinline@fabsf@, \lstinline@fabsl@, \lstinline@cabsf@, \lstinline@cabs@, and \lstinline@cabsl@.208 Whereas, \CFA wraps each of these routines into one with the common name \lstinline@abs@.207 For example, the C math-library provides the following routines for computing the absolute value of the basic type: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©. 208 Whereas, \CFA wraps each of these routines into one with the common name ©abs©. 209 209 \begin{lstlisting} 210 210 char abs( char ); … … 221 221 long double _Complex abs( long double _Complex ); 222 222 \end{lstlisting} 223 The problem is the name clash between the library routine \lstinline@abs@ and the \CFA names \lstinline@abs@.224 Hence, names appearing in an \lstinline@extern "C"@block have \newterm{C linkage}.223 The problem is the name clash between the library routine ©abs© and the \CFA names ©abs©. 224 Hence, names appearing in an ©extern "C"© block have \newterm{C linkage}. 225 225 Then overloading polymorphism uses a mechanism called \newterm{name mangling} to create unique names that are different from C names, which are not mangled. 226 226 Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed. 227 227 There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type. 228 228 This example strongly illustrates a core idea in \CFA: \emph{the power of a name}. 229 The name `` \lstinline@abs@'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.230 Hence, knowing the name \lstinline@abs@should be sufficient to apply it to any type where it is applicable.229 The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value. 230 Hence, knowing the name ©abs© should be sufficient to apply it to any type where it is applicable. 231 231 The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated. 232 232 … … 234 234 \section[Compiling CFA Program]{Compiling \CFA Program} 235 235 236 The command \lstinline@cfa@ is used to compile \CFA program(s). 237 This command works like the GNU \lstinline@gcc@\index{gcc} command, e.g.: 238 \begin{lstlisting} 239 cfa [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] 240 \end{lstlisting} 241 \indexc{cfa}\index{compilation!cfa@\lstinline$cfa$} 242 By default, \CFA programs having the following \lstinline@gcc@ flags turned on: 236 The command ©cfa© is used to compile \CFA program(s). 237 This command works like the GNU ©gcc©\index{gcc} command, e.g.: 238 \begin{lstlisting} 239 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] 240 \end{lstlisting} 241 By default, \CFA programs having the following ©gcc© flags turned on: 243 242 \begin{description} 244 \item\hspace*{-4pt}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{ \lstinline$-std=gnu99$}}243 \item\hspace*{-4pt}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}} 245 244 The 1999 C standard plus GNU extensions. 246 \item\hspace*{-4pt}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{ \lstinline$-fgnu89-¶inline¶$}}245 \item\hspace*{-4pt}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{©-fgnu89-¶inline¶©}} 247 246 Use the traditional GNU semantics for inline routines in C99 mode. 248 247 \end{description} 249 248 The following new \CFA option is available: 250 249 \begin{description} 251 \item\hspace*{-4pt}\Indexc{-CFA}\index{compilation option!-CFA@{ \lstinline$-CFA$}}250 \item\hspace*{-4pt}\Indexc{-CFA}\index{compilation option!-CFA@{©-CFA©}} 252 251 Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator. 253 252 \end{description} … … 255 254 The following preprocessor variables are available: 256 255 \begin{description} 257 \item\hspace*{-4pt}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{ \lstinline$__CFA__$}}256 \item\hspace*{-4pt}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}} 258 257 is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{ 259 258 The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed. 260 259 Hence, the need to have three variables for the major, minor and patch version number.} 261 260 262 \item\hspace*{-4pt}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{ \lstinline$__CFA_MINOR__$}}261 \item\hspace*{-4pt}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}} 263 262 is always available during preprocessing and its value is the current minor \Index{version number} of \CFA. 264 263 265 \item\hspace*{-4pt}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@ \lstinline$__CFA_PATCH__$}264 \item\hspace*{-4pt}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©} 266 265 is always available during preprocessing and its value is the current patch \Index{version number} of \CFA. 267 266 268 \item\hspace*{-4pt}\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@ \lstinline$__CFORALL__$}267 \item\hspace*{-4pt}\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} 269 268 is always available during preprocessing and it has no value. 270 269 \end{description} … … 279 278 #endif 280 279 \end{lstlisting} 281 which conditionally includes the correct header file, if the program is compiled using \lstinline@gcc@ or \lstinline@cfa@.280 which conditionally includes the correct header file, if the program is compiled using ©gcc© or ©cfa©. 282 281 283 282 … … 300 299 \begin{enumerate} 301 300 \item 302 A sequence of underscores is disallowed, e.g., \lstinline@12__34@is invalid.301 A sequence of underscores is disallowed, e.g., ©12__34© is invalid. 303 302 \item 304 303 Underscores may only appear within a sequence of digits (regardless of the digit radix). 305 In other words, an underscore cannot start or end a sequence of digits, e.g., \lstinline@_1@, \lstinline@1_@ and \lstinline@_1_@are invalid (actually, the 1st and 3rd examples are identifier names).304 In other words, an underscore cannot start or end a sequence of digits, e.g., ©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names). 306 305 \item 307 306 A numeric prefix may end with an underscore; 308 307 a numeric infix may begin and/or end with an underscore; 309 308 a numeric suffix may begin with an underscore. 310 For example, the octal \lstinline@0@ or hexadecimal \lstinline@0x@ prefix may end with an underscore \lstinline@0_377@ or \lstinline@0x_ff@;311 the exponent infix \lstinline@E@ may start or end with an underscore \lstinline@1.0_E10@, \lstinline@1.0E_10@ or \lstinline@1.0_E_10@;312 the type suffixes \lstinline@U@, \lstinline@L@, etc. may start with an underscore \lstinline@1_U@, \lstinline@1_ll@ or \lstinline@1.0E10_f@.309 For example, the octal ©0© or hexadecimal ©0x© prefix may end with an underscore ©0_377© or ©0x_ff©; 310 the exponent infix ©E© may start or end with an underscore ©1.0_E10©, ©1.0E_10© or ©1.0_E_10©; 311 the type suffixes ©U©, ©L©, etc. may start with an underscore ©1_U©, ©1_ll© or ©1.0E10_f©. 313 312 \end{enumerate} 314 313 It is significantly easier to read and enter long constants when they are broken up into smaller groupings (most cultures use comma or period among digits for the same purpose). … … 345 344 C and the new \CFA declarations may appear together in the same program block, but cannot be mixed within a specific declaration. 346 345 347 In \CFA declarations, the same tokens are used as in C: the character \lstinline@*@ is used to indicate a pointer, square brackets \lstinline@[@\,\lstinline@]@ are used to represent an array, and parentheses \lstinline@()@are used to indicate a routine parameter.346 In \CFA declarations, the same tokens are used as in C: the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array, and parentheses ©()© are used to indicate a routine parameter. 348 347 However, unlike C, \CFA type declaration tokens are specified from left to right and the entire type specification is distributed across all variables in the declaration list. 349 For instance, variables \lstinline@x@ and \lstinline@y@of type pointer to integer are defined in \CFA as follows:348 For instance, variables ©x© and ©y© of type pointer to integer are defined in \CFA as follows: 350 349 \begin{quote2} 351 350 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} … … 399 398 \end{quote2} 400 399 401 All type qualifiers, i.e., \lstinline@const@ and \lstinline@volatile@, are used in the normal way with the new declarations but appear left to right, e.g.:400 All type qualifiers, i.e., ©const© and ©volatile©, are used in the normal way with the new declarations but appear left to right, e.g.: 402 401 \begin{quote2} 403 402 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} … … 419 418 \end{tabular} 420 419 \end{quote2} 421 All declaration qualifiers, i.e., \lstinline@extern@, \lstinline@static@, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}420 All declaration qualifiers, i.e., ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier} 422 421 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} e.g.: 423 422 \begin{quote2} … … 441 440 \end{quote2} 442 441 443 Unsupported are K\&R C declarations where the base type defaults to \lstinline@int@, if no type is specified\footnote{442 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified\footnote{ 444 443 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}}, 445 444 e.g.: … … 458 457 \section{Type Operators} 459 458 460 The new declaration syntax can be used in other contexts where types are required, e.g., casts and the pseudo-routine \lstinline@sizeof@:459 The new declaration syntax can be used in other contexts where types are required, e.g., casts and the pseudo-routine ©sizeof©: 461 460 \begin{quote2} 462 461 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} … … 484 483 } 485 484 \end{lstlisting} 486 where routine \lstinline@f@has three output (return values) and three input parameters.485 where routine ©f© has three output (return values) and three input parameters. 487 486 Existing C syntax cannot be extended with multiple return types because it is impossible to embed a single routine name within multiple return type specifications. 488 487 489 In detail, the brackets, \lstinline@[]@, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{488 In detail, the brackets, ©[]©, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{ 490 489 Michael Tiemann, with help from Doug Lea, provided named return values in g++, circa 1989.} 491 490 The value of each local return variable is automatically returned at routine termination. … … 511 510 int (*f(x))[ 5 ] int x; {} 512 511 \end{lstlisting} 513 The string `` \lstinline@int (*f(x))[ 5 ]@'' declares a K\&R style routine of type returning a pointer to an array of 5 integers, while the string ``\lstinline@[ 5 ] int x@'' declares a \CFA style parameter x of type array of 5 integers.514 Since the strings overlap starting with the open bracket, \lstinline@[@, there is an ambiguous interpretation for the string.512 The string ``©int (*f(x))[ 5 ]©'' declares a K\&R style routine of type returning a pointer to an array of 5 integers, while the string ``©[ 5 ] int x©'' declares a \CFA style parameter x of type array of 5 integers. 513 Since the strings overlap starting with the open bracket, ©[©, there is an ambiguous interpretation for the string. 515 514 As well, \CFA-style declarations cannot be used to declare parameters for C-style routine-definitions because of the following ambiguity: 516 515 \begin{lstlisting} … … 518 517 int f( int (* foo) ); // foo is redefined as a parameter name 519 518 \end{lstlisting} 520 The string `` \lstinline@int (* foo)@'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo.521 The redefinition of a type name in a parameter list is the only context in C where the character \lstinline@*@can appear to the left of a type name, and \CFA relies on all type modifier characters appearing to the right of the type name.519 The string ``©int (* foo)©'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo. 520 The redefinition of a type name in a parameter list is the only context in C where the character ©*© can appear to the left of a type name, and \CFA relies on all type modifier characters appearing to the right of the type name. 522 521 The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts. 523 522 … … 538 537 \subsection{Returning Values} 539 538 540 Named return values handle the case where it is necessary to define a local variable whose value is then returned in a \lstinline@return@statement, as in:539 Named return values handle the case where it is necessary to define a local variable whose value is then returned in a ©return© statement, as in: 541 540 \begin{lstlisting} 542 541 int f() { … … 546 545 } 547 546 \end{lstlisting} 548 Because the value in the return variable is automatically returned when a \CFA routine terminates, the \lstinline@return@statement \emph{does not} contain an expression, as in:547 Because the value in the return variable is automatically returned when a \CFA routine terminates, the ©return© statement \emph{does not} contain an expression, as in: 549 548 \begin{lstlisting} 550 549 ®[ int x ]® f() { … … 553 552 } 554 553 \end{lstlisting} 555 When the return is encountered, the current value of \lstinline@x@is returned to the calling routine.556 As well, ``falling off the end'' of a routine without a \lstinline@return@statement is permitted, as in:554 When the return is encountered, the current value of ©x© is returned to the calling routine. 555 As well, ``falling off the end'' of a routine without a ©return© statement is permitted, as in: 557 556 \begin{lstlisting} 558 557 [ int x ] f() { … … 560 559 } // implicitly return x 561 560 \end{lstlisting} 562 In this case, the current value of \lstinline@x@ is returned to the calling routine just as if a \lstinline@return@had been encountered.561 In this case, the current value of ©x© is returned to the calling routine just as if a ©return© had been encountered. 563 562 564 563 … … 836 835 \end{tabular} 837 836 \end{quote2} 838 In the left example in C, types \lstinline@C@, \lstinline@U@ and \lstinline@T@ are implicitly hoisted outside of type \lstinline@S@into the containing block scope.839 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator `` \lstinline@.@'' for type qualification, as does Java, rather than the \CC type-selection operator ``\lstinline@::@''.837 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope. 838 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does Java, rather than the \CC type-selection operator ``©::©''. 840 839 841 840 … … 862 861 Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks; 863 862 the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program. 864 The following program in undefined in \CFA (and \lstinline@gcc@\index{gcc})863 The following program in undefined in \CFA (and ©gcc©\index{gcc}) 865 864 \begin{lstlisting} 866 865 [* [int]( int )] foo() { // int (*foo())( int ) … … 891 890 [ §\emph{exprlist}§ ] 892 891 \end{lstlisting} 893 where \lstinline@$\emph{exprlist}$@is a list of one or more expressions separated by commas.894 The brackets, \lstinline$[]$, allow differentiating between tuples and expressions containing the C comma operator.892 where ©$\emph{exprlist}$© is a list of one or more expressions separated by commas. 893 The brackets, ©[]©, allow differentiating between tuples and expressions containing the C comma operator. 895 894 The following are examples of tuples: 896 895 \begin{lstlisting} … … 899 898 [ v+w, x*y, 3.14159, f() ] 900 899 \end{lstlisting} 901 Tuples are permitted to contain sub-tuples (i.e., nesting), such as \lstinline@[ [ 14, 21 ], 9 ]@, which is a 2-element tuple whose first element is itself a tuple.900 Tuples are permitted to contain sub-tuples (i.e., nesting), such as ©[ [ 14, 21 ], 9 ]©, which is a 2-element tuple whose first element is itself a tuple. 902 901 Note, a tuple is not a record (structure); 903 902 a record denotes a single value with substructure, whereas a tuple is multiple values with no substructure (see flattening coercion in Section 12.1). … … 911 910 [ §\emph{typelist}§ ] 912 911 \end{lstlisting} 913 where \lstinline@$\emph{typelist}$@is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.912 where ©$\emph{typelist}$© is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications. 914 913 Examples of tuple types include: 915 914 \begin{lstlisting} … … 919 918 [ * [ 5 ] int, * * char, * [ [ int, int ] ] (int, int) ] 920 919 \end{lstlisting} 921 Like tuples, tuple types may be nested, such as \lstinline@[ [ int, int ], int ]@, which is a 2-element tuple type whose first element is itself a tuple type.920 Like tuples, tuple types may be nested, such as ©[ [ int, int ], int ]©, which is a 2-element tuple type whose first element is itself a tuple type. 922 921 923 922 Examples of declarations using tuple types are: … … 955 954 tuple does not have structure like a record; a tuple is simply converted into a list of components. 956 955 \begin{rationale} 957 The present implementation of \CFA does not support nested routine calls when the inner routine returns multiple values; i.e., a statement such as \lstinline@g( f() )@is not supported.956 The present implementation of \CFA does not support nested routine calls when the inner routine returns multiple values; i.e., a statement such as ©g( f() )© is not supported. 958 957 Using a temporary variable to store the results of the inner routine and then passing this variable to the outer routine works, however. 959 958 \end{rationale} … … 984 983 \begin{rationale} 985 984 Unfortunately, C's syntax for subscripts precluded treating them as tuples. 986 The C subscript list has the form \lstinline@[i][j]...@ and not \lstinline@i, j, ...]@.987 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g., \lstinline@f[g()]@always means a single subscript value because there is only one set of brackets.988 Fixing this requires a major change to C because the syntactic form \lstinline@M[i, j, k]@ already has a particular meaning: \lstinline@i, j, k@is a comma expression.985 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©. 986 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g., ©f[g()]© always means a single subscript value because there is only one set of brackets. 987 Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression. 989 988 \end{rationale} 990 989 … … 1005 1004 [ a, b, c, d ] = w 1006 1005 \end{lstlisting} 1007 \lstinline@w@is implicitly opened to yield a tuple of four values, which are then assigned individually.1006 ©w© is implicitly opened to yield a tuple of four values, which are then assigned individually. 1008 1007 1009 1008 A \newterm{flattening coercion} coerces a nested tuple, i.e., a tuple with one or more components, which are themselves tuples, into a flattened tuple, which is a tuple whose components are not tuples, as in: … … 1013 1012 First the right-hand tuple is flattened and then the values are assigned individually. 1014 1013 Flattening is also performed on tuple types. 1015 For example, the type \lstinline@[ int, [ int, int ], int ]@ can be coerced, using flattening, into the type \lstinline@[ int, int, int, int ]@.1014 For example, the type ©[ int, [ int, int ], int ]© can be coerced, using flattening, into the type ©[ int, int, int, int ]©. 1016 1015 1017 1016 A \newterm{structuring coercion} is the opposite of flattening; 1018 1017 a tuple is structured into a more complex nested tuple. 1019 For example, structuring the tuple \lstinline@[ 1, 2, 3, 4 ]@ into the tuple \lstinline@[ 1, [ 2, 3 ], 4 ]@ or the tuple type \lstinline@[ int, int, int, int ]@ into the tuple type \lstinline@[ int, [ int, int ], int ]@.1018 For example, structuring the tuple ©[ 1, 2, 3, 4 ]© into the tuple ©[ 1, [ 2, 3 ], 4 ]© or the tuple type ©[ int, int, int, int ]© into the tuple type ©[ int, [ int, int ], int ]©. 1020 1019 In the following example, the last assignment illustrates all the tuple coercions: 1021 1020 \begin{lstlisting} … … 1025 1024 \end{lstlisting} 1026 1025 Starting on the right-hand tuple in the last assignment statement, w is opened, producing a tuple of four values; 1027 therefore, the right-hand tuple is now the tuple \lstinline@[ [ 1, 2, 3, 4 ], 5 ]@.1028 This tuple is then flattened, yielding \lstinline@[ 1, 2, 3, 4, 5 ]@, which is structured into \lstinline@[ 1, [ 2, 3, 4, 5 ] ]@to match the tuple type of the left-hand side.1029 The tuple \lstinline@[ 2, 3, 4, 5 ]@is then closed to create a tuple value.1030 Finally, \lstinline@x@ is assigned \lstinline@1@ and \lstinline@w@is assigned the tuple value using multiple assignment (see Section 14).1026 therefore, the right-hand tuple is now the tuple ©[ [ 1, 2, 3, 4 ], 5 ]©. 1027 This tuple is then flattened, yielding ©[ 1, 2, 3, 4, 5 ]©, which is structured into ©[ 1, [ 2, 3, 4, 5 ] ]© to match the tuple type of the left-hand side. 1028 The tuple ©[ 2, 3, 4, 5 ]© is then closed to create a tuple value. 1029 Finally, ©x© is assigned ©1© and ©w© is assigned the tuple value using multiple assignment (see Section 14). 1031 1030 \begin{rationale} 1032 1031 A possible additional language extension is to use the structuring coercion for tuples to initialize a complex record with a tuple. … … 1042 1041 \end{lstlisting} 1043 1042 The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement. 1044 \lstinline@$\emph{expr}$@is any standard arithmetic expression.1043 ©$\emph{expr}$© is any standard arithmetic expression. 1045 1044 Clearly, the types of the entities being assigned must be type compatible with the value of the expression. 1046 1045 … … 1068 1067 *a1 = t; *a2 = t; *a3 = t; 1069 1068 \end{lstlisting} 1070 The temporary \lstinline@t@is necessary to store the value of the expression to eliminate conversion issues.1069 The temporary ©t© is necessary to store the value of the expression to eliminate conversion issues. 1071 1070 The temporaries for the addresses are needed so that locations on the left-hand side do not change as the values are assigned. 1072 In this case, \lstinline@y[i]@ uses the previous value of \lstinline@i@and not the new value set at the beginning of the mass assignment.1071 In this case, ©y[i]© uses the previous value of ©i© and not the new value set at the beginning of the mass assignment. 1073 1072 1074 1073 … … 1086 1085 [ x, y, z ] = [ 1, 2, 3 ]; 1087 1086 \end{lstlisting} 1088 Here, the values \lstinline@1@, \lstinline@2@ and \lstinline@3@ are assigned, respectively, to the variables \lstinline@x@, \lstinline@y@ and \lstinline@z@.1087 Here, the values ©1©, ©2© and ©3© are assigned, respectively, to the variables ©x©, ©y© and ©z©. 1089 1088 A more complex example is: 1090 1089 \begin{lstlisting} 1091 1090 [ i, y[ i ], z ] = [ 1, i, a + b ]; 1092 1091 \end{lstlisting} 1093 Here, the values \lstinline@1@, \lstinline@i@ and \lstinline@a + b@ are assigned to the variables \lstinline@i@, \lstinline@y[i]@ and \lstinline@z@, respectively.1092 Here, the values ©1©, ©i© and ©a + b© are assigned to the variables ©i©, ©y[i]© and ©z©, respectively. 1094 1093 Note, the parallel semantics of 1095 1094 multiple assignment ensures: … … 1097 1096 [ x, y ] = [ y, x ]; 1098 1097 \end{lstlisting} 1099 correctly interchanges (swaps) the values stored in \lstinline@x@ and \lstinline@y@.1098 correctly interchanges (swaps) the values stored in ©x© and ©y©. 1100 1099 The following cases are errors: 1101 1100 \begin{lstlisting} … … 1139 1138 §\emph{expr}§ -> [ §\emph{fieldlist}§ ] 1140 1139 \end{lstlisting} 1141 \emph{expr} is any expression yielding a value of type record, e.g., \lstinline@struct@, \lstinline@union@.1140 \emph{expr} is any expression yielding a value of type record, e.g., ©struct©, ©union©. 1142 1141 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}. 1143 1142 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is … … 1155 1154 also, it is unnecessary to specify all the fields of a struct in a multiple record-field tuple. 1156 1155 1157 If a field of a \lstinline@struct@ is itself another \lstinline@struct@, multiple fields of this subrecord can be specified using a nested record-field tuple, as in the following example:1156 If a field of a ©struct© is itself another ©struct©, multiple fields of this subrecord can be specified using a nested record-field tuple, as in the following example: 1158 1157 \begin{lstlisting} 1159 1158 struct inner { … … 1172 1171 \section{Labelled Break/Continue} 1173 1172 1174 While C provides \lstinline@break@ and \lstinline@continue@statements for altering control flow, both are restricted to one level of nesting for a particular control structure.1175 Unfortunately, this restriction forces programmers to use \lstinline@goto@to achieve the equivalent for more than one level of nesting.1176 To prevent having to make this switch, the \lstinline@break@ and \lstinline@continue@are extended with a target label to support static multi-level exit~\cite{Buhr85,Java}.1177 For the labelled \lstinline@break@, it is possible to specify which control structure is the target for exit, as in:1173 While C provides ©break© and ©continue© statements for altering control flow, both are restricted to one level of nesting for a particular control structure. 1174 Unfortunately, this restriction forces programmers to use ©goto© to achieve the equivalent for more than one level of nesting. 1175 To prevent having to make this switch, the ©break© and ©continue© are extended with a target label to support static multi-level exit~\cite{Buhr85,Java}. 1176 For the labelled ©break©, it is possible to specify which control structure is the target for exit, as in: 1178 1177 \begin{quote2} 1179 1178 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} … … 1205 1204 \end{quote2} 1206 1205 The inner most loop has three exit points, which cause termination of one or more of the three nested loops, respectively. 1207 For the labelled \lstinline@continue@, it is possible to specify which control structure is the target for the next loop iteration, as in:1206 For the labelled ©continue©, it is possible to specify which control structure is the target for the next loop iteration, as in: 1208 1207 \begin{quote2} 1209 1208 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} … … 1241 1240 \end{quote2} 1242 1241 The inner most loop has three restart points, which cause the next loop iteration to begin, respectively. 1243 For both \lstinline@break@ and \lstinline@continue@, the target label must be directly associated with a \lstinline@for@, \lstinline@while@ or \lstinline@do@statement;1244 for \lstinline@break@, the target label can also be associated with a \lstinline@switch@statement.1245 Both \lstinline@break@ and \lstinline@continue@ with target labels are simply a \lstinline@goto@restricted in the following ways:1242 For both ©break© and ©continue©, the target label must be directly associated with a ©for©, ©while© or ©do© statement; 1243 for ©break©, the target label can also be associated with a ©switch© statement. 1244 Both ©break© and ©continue© with target labels are simply a ©goto© restricted in the following ways: 1246 1245 \begin{itemize} 1247 1246 \item … … 1252 1251 Since they always transfers out of containing control structures, they cannot be used to branch into a control structure. 1253 1252 \end{itemize} 1254 The advantage of the labelled \lstinline@break@/\lstinline@continue@ is that it allows static multi-level exits without having to use the \lstinline@goto@statement and ties control flow to the target control structure rather than an arbitrary point in a program.1253 The advantage of the labelled ©break©/©continue© is that it allows static multi-level exits without having to use the ©goto© statement and ties control flow to the target control structure rather than an arbitrary point in a program. 1255 1254 Furthermore, the location of the label at the beginning of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure. 1256 With \lstinline@goto@, the label at the end of the control structure fails to convey this important clue early enough to the reader.1255 With ©goto©, the label at the end of the control structure fails to convey this important clue early enough to the reader. 1257 1256 Finally, using an explicit target for the transfer instead of an implicit target allows new nested loop or switch constructs to be added or removed without affecting other constructs. 1258 The implicit targets of the current \lstinline@break@ and \lstinline@continue@, i.e., the closest enclosing loop or \lstinline@switch@, change as certain constructs are added or removed.1257 The implicit targets of the current ©break© and ©continue©, i.e., the closest enclosing loop or ©switch©, change as certain constructs are added or removed. 1259 1258 1260 1259 1261 1260 \section{Switch Statement} 1262 1261 1263 C allows a number of questionable forms for the \lstinline@switch@statement:1262 C allows a number of questionable forms for the ©switch© statement: 1264 1263 \begin{enumerate} 1265 1264 \item 1266 By default, the end of a \lstinline@case@clause\footnote{1267 In this section, the term \emph{case clause} refers to either a \lstinline@case@ or \lstinline@default@clause.}1268 \emph{falls through} to the next \lstinline@case@ clause in the \lstinline@switch@statement;1269 to exit a \lstinline@switch@ statement from a \lstinline@case@ clause requires explicitly terminating the clause with a transfer statement, most commonly \lstinline@break@, as in:1265 By default, the end of a ©case© clause\footnote{ 1266 In this section, the term \emph{case clause} refers to either a ©case© or ©default© clause.} 1267 \emph{falls through} to the next ©case© clause in the ©switch© statement; 1268 to exit a ©switch© statement from a ©case© clause requires explicitly terminating the clause with a transfer statement, most commonly ©break©, as in: 1270 1269 \begin{lstlisting} 1271 1270 switch ( i ) { … … 1292 1291 \end{lstlisting} 1293 1292 In this example, case 2 is always done if case 3 is done. 1294 This control flow is difficult to simulate with if statements or a \lstinline@switch@statement without fall-through as code must be duplicated or placed in a separate routine.1293 This control flow is difficult to simulate with if statements or a ©switch© statement without fall-through as code must be duplicated or placed in a separate routine. 1295 1294 C also uses fall-through to handle multiple case-values resulting in the same action, as in: 1296 1295 \begin{lstlisting} … … 1305 1304 \end{lstlisting} 1306 1305 However, this situation is handled in other languages without fall-through by allowing a list of case values. 1307 While fall-through itself is not a problem, the problem occurs when fall-through is the \lstinline@default@, as this semantics is not intuitive to most programmers and is different from virtually all other programming languages with a \lstinline@switch@statement.1308 Hence, \lstinline@default@ fall-through semantics results in a large number of programming errors as programmers often forget the \lstinline@break@ statement at the end of a \lstinline@case@clause, resulting in inadvertent fall-through.1309 1310 \item 1311 It is possible to place \lstinline@case@ clauses on statements nested \emph{within} the body of the \lstinline@switch@statement, as in:1306 While fall-through itself is not a problem, the problem occurs when fall-through is the ©default©, as this semantics is not intuitive to most programmers and is different from virtually all other programming languages with a ©switch© statement. 1307 Hence, ©default© fall-through semantics results in a large number of programming errors as programmers often forget the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through. 1308 1309 \item 1310 It is possible to place ©case© clauses on statements nested \emph{within} the body of the ©switch© statement, as in: 1312 1311 \begin{lstlisting} 1313 1312 switch ( i ) { … … 1350 1349 } 1351 1350 \end{lstlisting} 1352 which unrolls a loop N times (N = 8 above) and uses the \lstinline@switch@statement to deal with any iterations not a multiple of N.1351 which unrolls a loop N times (N = 8 above) and uses the ©switch© statement to deal with any iterations not a multiple of N. 1353 1352 While efficient, this sort of special purpose usage is questionable: 1354 1353 \begin{quote} … … 1357 1356 \end{quote} 1358 1357 \item 1359 It is possible to place the \lstinline@default@ clause anywhere in the list of labelled clauses for a \lstinline@switch@statement, rather than only at the end.1360 Virtually all programming languages with a \lstinline@switch@ statement require the \lstinline@default@clause to appear last in the case-clause list.1361 The logic for this semantics is that after checking all the \lstinline@case@ clauses without success, the \lstinline@default@clause is selected;1362 hence, physically placing the \lstinline@default@ clause at the end of the \lstinline@case@clause list matches with this semantics.1363 This physical placement can be compared to the physical placement of an \lstinline@else@ clause at the end of a series of connected \lstinline@if@/\lstinline@else@statements.1364 1365 \item 1366 It is possible to place unreachable code at the start of a \lstinline@switch@statement, as in:1358 It is possible to place the ©default© clause anywhere in the list of labelled clauses for a ©switch© statement, rather than only at the end. 1359 Virtually all programming languages with a ©switch© statement require the ©default© clause to appear last in the case-clause list. 1360 The logic for this semantics is that after checking all the ©case© clauses without success, the ©default© clause is selected; 1361 hence, physically placing the ©default© clause at the end of the ©case© clause list matches with this semantics. 1362 This physical placement can be compared to the physical placement of an ©else© clause at the end of a series of connected ©if©/©else© statements. 1363 1364 \item 1365 It is possible to place unreachable code at the start of a ©switch© statement, as in: 1367 1366 \begin{lstlisting} 1368 1367 switch ( x ) { … … 1374 1373 } 1375 1374 \end{lstlisting} 1376 While the declaration of the local variable \lstinline@y@ is useful and its scope is across all \lstinline@case@clauses, the initialization for such a variable is defined to never be executed because control always transfers over it.1377 Furthermore, any statements before the first \lstinline@case@ clause can only be executed if labelled and transfered to using a \lstinline@goto@, either from outside or inside of the \lstinline@switch@.1375 While the declaration of the local variable ©y© is useful and its scope is across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it. 1376 Furthermore, any statements before the first ©case© clause can only be executed if labelled and transfered to using a ©goto©, either from outside or inside of the ©switch©. 1378 1377 As mentioned, transfer into control structures should be forbidden. 1379 Transfers from within the \lstinline@switch@ body using a \lstinline@goto@are equally unpalatable.1378 Transfers from within the ©switch© body using a ©goto© are equally unpalatable. 1380 1379 \end{enumerate} 1381 1380 Before discussing potential language changes to deal with these problems, it is worth observing that in a typical C program: 1382 1381 \begin{itemize} 1383 1382 \item 1384 the number of \lstinline@switch@statements is small,1385 \item 1386 most \lstinline@switch@statements are well formed (i.e., no Duff's device),1387 \item 1388 the \lstinline@default@clause is usually written as the last case-clause,1389 \item 1390 and there is only a medium amount of fall-through from one \lstinline@case@clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.1383 the number of ©switch© statements is small, 1384 \item 1385 most ©switch© statements are well formed (i.e., no Duff's device), 1386 \item 1387 the ©default© clause is usually written as the last case-clause, 1388 \item 1389 and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound. 1391 1390 \end{itemize} 1392 1391 These observations should help to put the effects of suggested changes into perspective. … … 1394 1393 \begin{enumerate} 1395 1394 \item 1396 Eliminating the \lstinline@default@fall-through problem has the greatest potential for affecting existing code.1397 However, even if fall-through is removed, most \lstinline@switch@ statements would continue to work because of the explicit transfers already present at the end of each \lstinline@case@ clause, and the common placement of the \lstinline@default@clause at the end of the case list.1398 In addition, the above grammar provides for the most common use of fall-through, i.e., a list of \lstinline@case@clauses executing common code, e.g.:1395 Eliminating the ©default© fall-through problem has the greatest potential for affecting existing code. 1396 However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, and the common placement of the ©default© clause at the end of the case list. 1397 In addition, the above grammar provides for the most common use of fall-through, i.e., a list of ©case© clauses executing common code, e.g.: 1399 1398 \begin{lstlisting} 1400 1399 case 1: case 2: case 3: ... 1401 1400 \end{lstlisting} 1402 1401 Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments. 1403 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of \lstinline@switch@ statement, called \lstinline@choose@, with no fall-through semantics.1404 The \lstinline@choose@ statement is identical to the new \lstinline@switch@ statement, except there is no implicit fall-through between case-clauses and the \lstinline@break@ statement applies to the enclosing loop construct (as for the continue statement in a \lstinline@switch@statement).1402 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no fall-through semantics. 1403 The ©choose© statement is identical to the new ©switch© statement, except there is no implicit fall-through between case-clauses and the ©break© statement applies to the enclosing loop construct (as for the continue statement in a ©switch© statement). 1405 1404 It is still possible to fall-through if a case-clause ends with the new keyword fallthru, e.g.: 1406 1405 \begin{lstlisting} … … 1418 1417 \item 1419 1418 Eliminating Duff's device is straightforward and only invalidates a small amount of very questionable code. 1420 The solution is to allow \lstinline@case@ clauses to only appear at the same nesting level as the \lstinline@switch@ body, as is done in most other programming languages with \lstinline@switch@statements.1421 \item 1422 The issue of \lstinline@default@ at locations other than at the end of the cause clause can be solved by using good programming style, and there are a few reasonable situations involving fall-through where the \lstinline@default@clause may appear is locations other than at the end.1419 The solution is to allow ©case© clauses to only appear at the same nesting level as the ©switch© body, as is done in most other programming languages with ©switch© statements. 1420 \item 1421 The issue of ©default© at locations other than at the end of the cause clause can be solved by using good programming style, and there are a few reasonable situations involving fall-through where the ©default© clause may appear is locations other than at the end. 1423 1422 Therefore, no language change is made for this issue. 1424 1423 \item 1425 Dealing with unreachable code at the start of a \lstinline@switch@ statement is solved by defining the declaration-list, including any associated initialization, at the start of a \lstinline@switch@ statement body to be executed before the transfer to the appropriate \lstinline@case@clause.1424 Dealing with unreachable code at the start of a ©switch© statement is solved by defining the declaration-list, including any associated initialization, at the start of a ©switch© statement body to be executed before the transfer to the appropriate ©case© clause. 1426 1425 This semantics is the same as for declarations at the start of a loop body, which are executed before each iteration of the loop body. 1427 As well, this grammar does not allow statements to appear before the first \lstinline@case@clause.1426 As well, this grammar does not allow statements to appear before the first ©case© clause. 1428 1427 The change is compatible for declarations with initialization in this context because existing code cannot assume the initialization has occurred. 1429 1428 The change is incompatible for statements, but any existing code using it is highly questionable, as in: … … 1435 1434 } 1436 1435 \end{lstlisting} 1437 The statement after the \lstinline@switch@can never be executed unless it is labelled.1438 If it is labelled, it must be transfered to from outside or inside the \lstinline@switch@statement, neither of which is acceptable control flow.1436 The statement after the ©switch© can never be executed unless it is labelled. 1437 If it is labelled, it must be transfered to from outside or inside the ©switch© statement, neither of which is acceptable control flow. 1439 1438 \end{enumerate} 1440 1439 … … 1442 1441 \section{Case Clause} 1443 1442 1444 C restricts the \lstinline@case@ clause of a \lstinline@switch@statement to a single value.1445 For multiple \lstinline@case@ clauses associated with the same statement, it is necessary to have multiple \lstinline@case@clauses rather than multiple values.1446 Requiring a \lstinline@case@clause for each value does not seem to be in the spirit of brevity normally associated with C.1447 Therefore, the \lstinline@case@clause is extended with a list of values, as in:1443 C restricts the ©case© clause of a ©switch© statement to a single value. 1444 For multiple ©case© clauses associated with the same statement, it is necessary to have multiple ©case© clauses rather than multiple values. 1445 Requiring a ©case© clause for each value does not seem to be in the spirit of brevity normally associated with C. 1446 Therefore, the ©case© clause is extended with a list of values, as in: 1448 1447 \begin{quote2} 1449 1448 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} … … 1740 1739 1741 1740 The syntax for using references in \CFA is the same as \CC with the exception of reference initialization. 1742 Use \lstinline@&@to specify a reference, and access references just like regular objects, not like pointers (use dot notation to access fields).1741 Use ©&© to specify a reference, and access references just like regular objects, not like pointers (use dot notation to access fields). 1743 1742 When initializing a reference, \CFA uses a different syntax which differentiates reference initialization from assignment to a reference. 1744 The \lstinline@&@is used on both sides of the expression to clarify that the address of the reference is being set to the address of the variable to which it refers.1743 The ©&© is used on both sides of the expression to clarify that the address of the reference is being set to the address of the variable to which it refers. 1745 1744 1746 1745 \begin{figure} … … 1815 1814 In \CFA, as in C, all scalar types can be incremented and 1816 1815 decremented, which is defined in terms of adding or subtracting 1. 1817 The operations \lstinline@&&@, \lstinline@||@, and \lstinline@!@ can be applied to any scalar arguments and are defined in terms of comparison against 0 (ex. \lstinline@(a && b)@ becomes \lstinline@(a != 0 && b != 0)@).1816 The operations ©&&©, ©||©, and ©!© can be applied to any scalar arguments and are defined in terms of comparison against 0 (ex. ©(a && b)© becomes ©(a != 0 && b != 0)©). 1818 1817 1819 1818 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any … … 1824 1823 polymorphic parameters, and user-defined pointer-like types may need a null value. 1825 1824 Defining special 1826 constants for a user-defined type is more efficient than defining a conversion to the type from \lstinline@_Bool@.1825 constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©. 1827 1826 1828 1827 Why just 0 and 1? Why not other integers? No other integers have special status in C. … … 1907 1906 \begin{tabular}[t]{ll} 1908 1907 %identifier & operation \\ \hline 1909 \lstinline@?[?]@& subscripting \impl{?[?]}\\1910 \lstinline@?()@& function call \impl{?()}\\1911 \lstinline@?++@& postfix increment \impl{?++}\\1912 \lstinline@?--@& postfix decrement \impl{?--}\\1913 \lstinline@++?@& prefix increment \impl{++?}\\1914 \lstinline@--?@& prefix decrement \impl{--?}\\1915 \lstinline@*?@& dereference \impl{*?}\\1916 \lstinline@+?@& unary plus \impl{+?}\\1917 \lstinline@-?@& arithmetic negation \impl{-?}\\1918 \lstinline@~?@& bitwise negation \impl{~?}\\1919 \lstinline@!?@& logical complement \impl{"!?}\\1920 \lstinline@?*?@& multiplication \impl{?*?}\\1921 \lstinline@?/?@& division \impl{?/?}\\1908 ©?[?]© & subscripting \impl{?[?]}\\ 1909 ©?()© & function call \impl{?()}\\ 1910 ©?++© & postfix increment \impl{?++}\\ 1911 ©?--© & postfix decrement \impl{?--}\\ 1912 ©++?© & prefix increment \impl{++?}\\ 1913 ©--?© & prefix decrement \impl{--?}\\ 1914 ©*?© & dereference \impl{*?}\\ 1915 ©+?© & unary plus \impl{+?}\\ 1916 ©-?© & arithmetic negation \impl{-?}\\ 1917 ©~?© & bitwise negation \impl{~?}\\ 1918 ©!?© & logical complement \impl{"!?}\\ 1919 ©?*?© & multiplication \impl{?*?}\\ 1920 ©?/?© & division \impl{?/?}\\ 1922 1921 \end{tabular}\hfil 1923 1922 \begin{tabular}[t]{ll} 1924 1923 %identifier & operation \\ \hline 1925 \lstinline@?%?@& remainder \impl{?%?}\\1926 \lstinline@?+?@& addition \impl{?+?}\\1927 \lstinline@?-?@& subtraction \impl{?-?}\\1928 \lstinline@?<<?@& left shift \impl{?<<?}\\1929 \lstinline@?>>?@& right shift \impl{?>>?}\\1930 \lstinline@?<?@& less than \impl{?<?}\\1931 \lstinline@?<=?@& less than or equal \impl{?<=?}\\1932 \lstinline@?>=?@& greater than or equal \impl{?>=?}\\1933 \lstinline@?>?@& greater than \impl{?>?}\\1934 \lstinline@?==?@& equality \impl{?==?}\\1935 \lstinline@?!=?@& inequality \impl{?"!=?}\\1936 \lstinline@?&?@& bitwise AND \impl{?&?}\\1924 ©?%?© & remainder \impl{?%?}\\ 1925 ©?+?© & addition \impl{?+?}\\ 1926 ©?-?© & subtraction \impl{?-?}\\ 1927 ©?<<?© & left shift \impl{?<<?}\\ 1928 ©?>>?© & right shift \impl{?>>?}\\ 1929 ©?<?© & less than \impl{?<?}\\ 1930 ©?<=?© & less than or equal \impl{?<=?}\\ 1931 ©?>=?© & greater than or equal \impl{?>=?}\\ 1932 ©?>?© & greater than \impl{?>?}\\ 1933 ©?==?© & equality \impl{?==?}\\ 1934 ©?!=?© & inequality \impl{?"!=?}\\ 1935 ©?&?© & bitwise AND \impl{?&?}\\ 1937 1936 \end{tabular}\hfil 1938 1937 \begin{tabular}[t]{ll} 1939 1938 %identifier & operation \\ \hline 1940 \lstinline@?^?@& exclusive OR \impl{?^?}\\1941 \lstinline@?|?@& inclusive OR \impl{?"|?}\\1942 \lstinline@?=?@& simple assignment \impl{?=?}\\1943 \lstinline@?*=?@& multiplication assignment \impl{?*=?}\\1944 \lstinline@?/=?@& division assignment \impl{?/=?}\\1945 \lstinline@?%=?@& remainder assignment \impl{?%=?}\\1946 \lstinline@?+=?@& addition assignment \impl{?+=?}\\1947 \lstinline@?-=?@& subtraction assignment \impl{?-=?}\\1948 \lstinline@?<<=?@& left-shift assignment \impl{?<<=?}\\1949 \lstinline@?>>=?@& right-shift assignment \impl{?>>=?}\\1950 \lstinline@?&=?@& bitwise AND assignment \impl{?&=?}\\1951 \lstinline@?^=?@& exclusive OR assignment \impl{?^=?}\\1952 \lstinline@?|=?@& inclusive OR assignment \impl{?"|=?}\\1939 ©?^?© & exclusive OR \impl{?^?}\\ 1940 ©?|?© & inclusive OR \impl{?"|?}\\ 1941 ©?=?© & simple assignment \impl{?=?}\\ 1942 ©?*=?© & multiplication assignment \impl{?*=?}\\ 1943 ©?/=?© & division assignment \impl{?/=?}\\ 1944 ©?%=?© & remainder assignment \impl{?%=?}\\ 1945 ©?+=?© & addition assignment \impl{?+=?}\\ 1946 ©?-=?© & subtraction assignment \impl{?-=?}\\ 1947 ©?<<=?© & left-shift assignment \impl{?<<=?}\\ 1948 ©?>>=?© & right-shift assignment \impl{?>>=?}\\ 1949 ©?&=?© & bitwise AND assignment \impl{?&=?}\\ 1950 ©?^=?© & exclusive OR assignment \impl{?^=?}\\ 1951 ©?|=?© & inclusive OR assignment \impl{?"|=?}\\ 1953 1952 \end{tabular} 1954 1953 \hfil … … 1959 1958 These identifiers are defined such that the question marks in the name identify the location of the operands. 1960 1959 These operands represent the parameters to the functions, and define how the operands are mapped to the function call. 1961 For example, \lstinline@a + b@ becomes \lstinline@?+?(a, b)@.1960 For example, ©a + b© becomes ©?+?(a, b)©. 1962 1961 1963 1962 In the example below, a new type, myComplex, is defined with an overloaded constructor, + operator, and string operator. … … 2002 2001 \begin{quote2} 2003 2002 \begin{tabular}{@{}l@{\hspace{30pt}}ll@{}} 2004 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CC}} & \multicolumn{1}{c}{ \lstinline@gcc@}\index{gcc} \\2003 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CC}} & \multicolumn{1}{c}{©gcc©}\index{gcc} \\ 2005 2004 \begin{lstlisting} 2006 2005 … … 2033 2032 \end{itemize} 2034 2033 2035 In \CFA, \lstinline@typedef@provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name.2036 \lstinline@gcc@ provides \lstinline@typeof@to declare a secondary variable from a primary variable.2034 In \CFA, ©typedef© provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name. 2035 ©gcc© provides ©typeof© to declare a secondary variable from a primary variable. 2037 2036 \CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression. 2038 2037 Only for overloaded routines with the same return type is variable type-inferencing possible. 2039 Finally, \lstinline@auto@presents the programming problem of tracking down a type when the type is actually needed.2038 Finally, ©auto© presents the programming problem of tracking down a type when the type is actually needed. 2040 2039 For example, given 2041 2040 \begin{lstlisting} 2042 2041 auto j = ®...® 2043 2042 \end{lstlisting} 2044 and the need to write a routine to compute using \lstinline@j@2043 and the need to write a routine to compute using ©j© 2045 2044 \begin{lstlisting} 2046 2045 void rtn( ®...® parm ); 2047 2046 rtn( j ); 2048 2047 \end{lstlisting} 2049 A programmer must work backwards to determine the type of \lstinline@j@'s initialization expression, reconstructing the possibly long generic type-name.2048 A programmer must work backwards to determine the type of ©j©'s initialization expression, reconstructing the possibly long generic type-name. 2050 2049 In this situation, having the type name or a short alias is very useful. 2051 2050 … … 2055 2054 At some point, a programmer wants the type of the variable to remain constant and the expression to be in error when it changes. 2056 2055 2057 Given \lstinline@typedef@ and \lstinline@typeof@in \CFA, and the strong need to use the type of left-hand side in inferencing, auto type-inferencing is not supported at this time.2056 Given ©typedef© and ©typeof© in \CFA, and the strong need to use the type of left-hand side in inferencing, auto type-inferencing is not supported at this time. 2058 2057 Should a significant need arise, this feature can be revisited. 2059 2058 … … 2357 2356 } s; 2358 2357 \end{lstlisting} 2359 The problem occurs in accesing these fields using the selection operation `` \lstinline@.@'':2358 The problem occurs in accesing these fields using the selection operation ``©.©'': 2360 2359 \begin{lstlisting} 2361 2360 s.0 = 0; // ambiguity with floating constant .0 … … 2368 2367 \end{lstlisting} 2369 2368 While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1. 2370 Like the \CC lexical problem with closing template-syntax, e.g, \lstinline@Foo<Bar<int®>>®@, this issue can be solved with a more powerful lexer/parser.2371 2372 There are several ambiguous cases with operator identifiers, e.g., \lstinline@int *?*?()@, where the string \lstinline@*?*?@ can be lexed as \lstinline@*@/\lstinline@?*?@ or \lstinline@*?@/\lstinline@*?@.2373 Since it is common practise to put a unary operator juxtaposed to an identifier, e.g., \lstinline@*i@, users will be annoyed if they cannot do this with respect to operator identifiers.2369 Like the \CC lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser. 2370 2371 There are several ambiguous cases with operator identifiers, e.g., ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©. 2372 Since it is common practise to put a unary operator juxtaposed to an identifier, e.g., ©*i©, users will be annoyed if they cannot do this with respect to operator identifiers. 2374 2373 Even with this special hack, there are 5 general cases that cannot be handled. 2375 The first case is for the function-call identifier \lstinline@?()@:2374 The first case is for the function-call identifier ©?()©: 2376 2375 \begin{lstlisting} 2377 2376 int *§\textvisiblespace§?()(); // declaration: space required after '*' 2378 2377 *§\textvisiblespace§?()(); // expression: space required after '*' 2379 2378 \end{lstlisting} 2380 Without the space, the string \lstinline@*?()@is ambiguous without N character look ahead;2381 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument/parameter list.2379 Without the space, the string ©*?()© is ambiguous without N character look ahead; 2380 it requires scanning ahead to determine if there is a ©'('©, which is the start of an argument/parameter list. 2382 2381 2383 2382 The 4 remaining cases occur in expressions: … … 2388 2387 i§\textvisiblespace§?--i:0; // space required after '?' 2389 2388 \end{lstlisting} 2390 In the first two cases, the string \lstinline@i++?@ is ambiguous, where this string can be lexed as \lstinline@i@ / \lstinline@++?@ or \lstinline@i++@ / \lstinline@?@;2391 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.2392 In the second two cases, the string \lstinline@?++x@ is ambiguous, where this string can be lexed as \lstinline@?++@ / \lstinline@x@ or \lstinline@?@ / y\lstinline@++x@;2393 it requires scanning ahead to determine if there is a \lstinline@'('@, which is the start of an argument list.2389 In the first two cases, the string ©i++?© is ambiguous, where this string can be lexed as ©i© / ©++?© or ©i++© / ©?©; 2390 it requires scanning ahead to determine if there is a ©'('©, which is the start of an argument list. 2391 In the second two cases, the string ©?++x© is ambiguous, where this string can be lexed as ©?++© / ©x© or ©?© / y©++x©; 2392 it requires scanning ahead to determine if there is a ©'('©, which is the start of an argument list. 2394 2393 2395 2394 … … 4007 4006 \begin{enumerate} 4008 4007 \item 4009 Change type of character literal \lstinline@int@ to \lstinline@char@.4008 Change type of character literal ©int© to ©char©. 4010 4009 This change allows overloading differentiation argument type matching, e.g.: 4011 4010 \begin{lstlisting} … … 4024 4023 4025 4024 \item 4026 Change: String literals made \lstinline@const@\\4027 The type of a string literal is changed from \lstinline@array of char@ to \lstinline@array of const char@.4028 The type of a wide string literal is changed from \lstinline@array of wchar_t@ to \lstinline@array of const wchar_t@. \\4025 Change: String literals made ©const© \\ 4026 The type of a string literal is changed from ©array of char© to ©array of const char©. 4027 The type of a wide string literal is changed from ©array of wchar_t© to ©array of const wchar_t©. \\ 4029 4028 Rationale: This avoids calling an inappropriate overloaded function, which might expect to be able to modify its argument. 4030 4029 Effect on original feature: Change to semantics of well-defined feature. \\ 4031 Difficulty of converting: Simple syntactic transformation, because string literals can be converted to \lstinline@char*;@(4.2).4030 Difficulty of converting: Simple syntactic transformation, because string literals can be converted to ©char*;© (4.2). 4032 4031 The most common cases are handled by a new but deprecated standard conversion: 4033 4032 \begin{lstlisting} … … 4068 4067 4069 4068 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC. 4070 Nested types are not hoisted and can be referenced using the field selection operator `` \lstinline@.@'', unlike the \CC scope-resolution operator ``\lstinline@::@''.4069 Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''. 4071 4070 Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility. 4072 4071 … … 4174 4173 %$ 4175 4174 \item 4176 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline@,.:;!?)]}%¢»@4175 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: ©,.:;!?)]}%¢»© 4177 4176 \begin{lstlisting}[belowskip=0pt] 4178 4177 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x" -
src/examples/abstype.c
r1048b31 r1b7ea43 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 27 18:10:01 201513 // Update Count : 412 // Last Modified On : Wed Apr 6 22:16:08 2016 13 // Update Count : 8 14 14 // 15 15 16 type T | { T x( T ); };16 otype T | { T x( T ); }; 17 17 18 18 T y( T t ) { … … 21 21 } 22 22 23 forall( type T) lvalue T*?( T* );24 int ?++( int * );25 int ?=?( int *, int );26 forall( dtype DT) DT* ?=?( DT **, DT* );23 forall( otype T ) lvalue T *?( T* ); 24 int ?++( int * ); 25 int ?=?( int *, int ); 26 forall( dtype DT ) DT * ?=?( DT **, DT* ); 27 27 28 type U = int*;28 otype U = int *; 29 29 30 30 U x( U u ) { -
src/examples/alloc.c
r1048b31 r1b7ea43 11 11 // Created On : Wed Feb 3 07:56:22 2016 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Wed Feb 17 11:43:23201614 // Update Count : 4013 // Last Modified On : Fri Mar 11 17:42:08 2016 14 // Update Count : 59 15 15 // 16 16 17 forall( otype T ) T * malloc( char fill ); 18 forall( dtype T ) T *?=?( T **, void * ); 19 void *malloc( unsigned long int ); 20 #if 0 17 21 #include <fstream> 18 22 #include <stdlib> … … 25 29 int * bar( int * p, int c ) { return p; } 26 30 int * baz( int * p, int c ) { return p; } 31 #endif 27 32 28 33 int main( void ) { 34 #if 0 29 35 size_t size = 10; 30 36 int * p; 31 37 struct S { int x; double y; } * s; 38 #endif 32 39 40 #if 0 33 41 p = malloc( sizeof(*p) ); // C malloc, type unsafe 34 42 printf( "here1\n" ); … … 37 45 printf( "here2\n" ); 38 46 free( p ); 39 p = malloc( (char)'\0' ); // CFA malloc, type safe 47 #endif 48 // int * p; 49 // p = malloc( (char)'\0' ); // CFA malloc, type safe 50 (int *)malloc( (char)'\0' ); // CFA malloc, type safe 51 (void *)malloc( (char)'\0' ); // CFA malloc, type safe 52 #if 0 40 53 printf( "here3\n" ); 41 54 p = malloc( p, 1000 ); // CFA remalloc, type safe … … 60 73 printf( "here9\n" ); 61 74 free( p ); 62 #if 0 75 63 76 float * fp = malloc() + 1; 64 77 fprintf( stderr, "%p %p\n", fp, fp - 1 ); -
src/examples/fstream_test.c
r1048b31 r1b7ea43 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 6 20:58:29201613 // Update Count : 5412 // Last Modified On : Mon May 2 15:25:54 2016 13 // Update Count : 61 14 14 // 15 15 -
src/examples/includes.c
r1048b31 r1b7ea43 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 23:28:02 201613 // Update Count : 3 2812 // Last Modified On : Wed Apr 13 22:30:02 2016 13 // Update Count : 370 14 14 // 15 15 … … 24 24 #if 1 25 25 #define _GNU_SOURCE 26 #include <aio.h>27 #include <a.out.h>28 #include <aliases.h>29 #include <alloca.h>30 #include <ansidecl.h>31 #include <ar.h>32 #include <argp.h>26 //#include <aio.h> 27 //#include <a.out.h> 28 //#include <aliases.h> 29 //#include <alloca.h> 30 //#include <ansidecl.h> 31 //#include <ar.h> 32 //#include <argp.h> 33 33 #include <argz.h> 34 #include <assert.h>34 //#include <assert.h> 35 35 #include <bfd.h> 36 #if 0 36 37 #include <bfdlink.h> 37 38 #include <byteswap.h> … … 56 57 #include <err.h> 57 58 #include <errno.h> 58 #if 059 59 #include <error.h> 60 #endif61 60 #include <eti.h> 62 61 #include <evdns.h> 63 62 #include <event.h> 64 63 #include <evhttp.h> 64 #endif 65 65 #if 0 66 66 #include <evrpc.h> … … 129 129 130 130 //#define _GNU_SOURCE 131 #include <error.h> 131 #include <bfd.h> 132 //#include <error.h> 132 133 133 134 #endif // 0 -
src/examples/sum.c
r1048b31 r1b7ea43 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 4 15:06:47 201613 // Update Count : 19 612 // Last Modified On : Mon May 2 15:07:57 2016 13 // Update Count : 198 14 14 // 15 15 … … 48 48 } // for 49 49 sout | "sum from" | low | "to" | High | "is" 50 | (int)sum( size, a ) | " " | ", check" | (int)s | endl;50 | (int)sum( size, a ) | ", check" | (int)s | endl; 51 51 52 52 int s = 0, a[size], v = low; … … 56 56 } // for 57 57 sout | "sum from" | low | "to" | High | "is" 58 | sum( size, (int *)a ) | " " | ", check" | (int)s | endl;58 | sum( size, (int *)a ) | ", check" | (int)s | endl; 59 59 60 60 float s = 0.0, a[size], v = low / 10.0; … … 64 64 } // for 65 65 sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is" 66 | sum( size, (float *)a ) | " " | ", check" | (float)s | endl;66 | sum( size, (float *)a ) | ", check" | (float)s | endl; 67 67 68 68 double s = 0, a[size], v = low / 10.0; … … 72 72 } // for 73 73 sout | "sum from" | low / 10.0 | "to" | High / 10.0 | "is" 74 | sum( size, (double *)a ) | " " | ", check" | (double)s | endl;74 | sum( size, (double *)a ) | ", check" | (double)s | endl; 75 75 76 76 struct S { int i, j; } 0 = { 0, 0 }, 1 = { 1, 1 }; … … 87 87 } // for 88 88 sout | "sum from" | low | "to" | High | "is" 89 | sum( size, (S *)a ) | " " | ", check" | (S)s | endl;89 | sum( size, (S *)a ) | ", check" | (S)s | endl; 90 90 } // main 91 91
Note: See TracChangeset
for help on using the changeset viewer.