1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
|
Section 4: Names and Expressions
1 The rules applicable to the different forms of name and expression, and
to their evaluation, are given in this section.
4.1 Names
1 Names can denote declared entities, whether declared explicitly or
implicitly (see 3.1). Names can also denote objects or subprograms designated
by access values; the results of type_conversions or function_calls;
subcomponents and slices of objects and values; protected subprograms, single
entries, entry families, and entries in families of entries. Finally, names
can denote attributes of any of the foregoing.
Syntax
2 name ::=
direct_name | explicit_dereference
| indexed_component | slice
| selected_component | attribute_reference
| type_conversion | function_call
| character_literal
3 direct_name ::= identifier | operator_symbol
4 prefix ::= name | implicit_dereference
5 explicit_dereference ::= name.all
6 implicit_dereference ::= name
7 Certain forms of name (indexed_components, selected_components, slices,
and attributes) include a prefix that is either itself a name that denotes
some related entity, or an implicit_dereference of an access value that
designates some related entity.
Name Resolution Rules
8 The name in a dereference (either an implicit_dereference or an
explicit_dereference) is expected to be of any access type.
Static Semantics
9 If the type of the name in a dereference is some access-to-object type
T, then the dereference denotes a view of an object, the nominal subtype of
the view being the designated subtype of T.
10 If the type of the name in a dereference is some access-to-subprogram
type S, then the dereference denotes a view of a subprogram, the profile of
the view being the designated profile of S.
Dynamic Semantics
11 The evaluation of a name determines the entity denoted by the name. This
evaluation has no other effect for a name that is a direct_name or a
character_literal.
12 The evaluation of a name that has a prefix includes the evaluation of
the prefix. The evaluation of a prefix consists of the evaluation of the name
or the implicit_dereference. The prefix denotes the entity denoted by the name
or the implicit_dereference.
13 The evaluation of a dereference consists of the evaluation of the name
and the determination of the object or subprogram that is designated by the
value of the name. A check is made that the value of the name is not the null
access value. Constraint_Error is raised if this check fails. The dereference
denotes the object or subprogram designated by the value of the name.
Examples
14 Examples of direct names:
15 Pi -- the direct name of a number (see 3.3.2)
Limit -- the direct name of a constant (see 3.3.1)
Count -- the direct name of a scalar variable (see 3.3.1)
Board -- the direct name of an array variable (see 3.6.1)
Matrix -- the direct name of a type (see 3.6)
Random -- the direct name of a function (see 6.1)
Error -- the direct name of an exception (see 11.1)
16 Examples of dereferences:
17 Next_Car.all
-- explicit dereference denoting the object designated by
-- the access variable Next_Car (see 3.10.1)
Next_Car.Owner -- selected component with implicit dereference;
-- same as Next_Car.all.Owner
4.1.1 Indexed Components
1 An indexed_component denotes either a component of an array or an entry
in a family of entries.
Syntax
2 indexed_component ::= prefix(expression {, expression})
Name Resolution Rules
3 The prefix of an indexed_component with a given number of expressions
shall resolve to denote an array (after any implicit dereference) with the
corresponding number of index positions, or shall resolve to denote an entry
family of a task or protected object (in which case there shall be only one
expression).
4 The expected type for each expression is the corresponding index type.
Static Semantics
5 When the prefix denotes an array, the indexed_component denotes the
component of the array with the specified index value(s). The nominal subtype
of the indexed_component is the component subtype of the array type.
6 When the prefix denotes an entry family, the indexed_component denotes
the individual entry of the entry family with the specified index value.
Dynamic Semantics
7 For the evaluation of an indexed_component, the prefix and the
expressions are evaluated in an arbitrary order. The value of each expression
is converted to the corresponding index type. A check is made that each index
value belongs to the corresponding index range of the array or entry family
denoted by the prefix. Constraint_Error is raised if this check fails.
Examples
8 Examples of indexed components:
9 My_Schedule(Sat) -- a component of a one-dimensional array
(see 3.6.1)
Page(10) -- a component of a one-dimensional array
(see 3.6)
Board(M, J + 1) -- a component of a two-dimensional array
(see 3.6.1)
Page(10)(20) -- a component of a component
(see 3.6)
Request(Medium) -- an entry in a family of entries
(see 9.1)
Next_Frame(L)(M, N) -- a component of a function call
(see 6.1)
NOTES
10 1 Notes on the examples: Distinct notations are used for components of
multidimensional arrays (such as Board) and arrays of arrays (such as
Page). The components of an array of arrays are arrays and can therefore
be indexed. Thus Page(10)(20) denotes the 20th component of Page(10). In
the last example Next_Frame(L) is a function call returning an access
value that designates a two-dimensional array.
4.1.2 Slices
1 A slice denotes a one-dimensional array formed by a sequence of
consecutive components of a one-dimensional array. A slice of a variable is a
variable; a slice of a constant is a constant; a slice of a value is a value.
Syntax
2 slice ::= prefix(discrete_range)
Name Resolution Rules
3 The prefix of a slice shall resolve to denote a one-dimensional array
(after any implicit dereference).
4 The expected type for the discrete_range of a slice is the index type of
the array type.
Static Semantics
5 A slice denotes a one-dimensional array formed by the sequence of
consecutive components of the array denoted by the prefix, corresponding to
the range of values of the index given by the discrete_range.
6 The type of the slice is that of the prefix. Its bounds are those
defined by the discrete_range.
Dynamic Semantics
7 For the evaluation of a slice, the prefix and the discrete_range are
evaluated in an arbitrary order. If the slice is not a null slice (a slice
where the discrete_range is a null range), then a check is made that the
bounds of the discrete_range belong to the index range of the array denoted by
the prefix. Constraint_Error is raised if this check fails.
NOTES
8 2 A slice is not permitted as the prefix of an Access
attribute_reference, even if the components or the array as a whole are
aliased. See 3.10.2.
9 3 For a one-dimensional array A, the slice A(N .. N) denotes an array
that has only one component; its type is the type of A. On the other
hand, A(N) denotes a component of the array A and has the corresponding
component type.
Examples
10 Examples of slices:
11 Stars(1 .. 15) -- a slice of 15 characters
(see 3.6.3)
Page(10 .. 10 + Size) -- a slice of 1 + Size components
(see 3.6)
Page(L)(A .. B) -- a slice of the array Page(L)
(see 3.6)
Stars(1 .. 0) -- a null slice
(see 3.6.3)
My_Schedule(Weekday) -- bounds given by subtype
(see 3.6.1 and 3.5.1)
Stars(5 .. 15)(K) -- same as Stars(K)
(see 3.6.3)
-- provided that K is in 5 .. 15
4.1.3 Selected Components
1 Selected_components are used to denote components (including
discriminants), entries, entry families, and protected subprograms; they are
also used as expanded names as described below.
Syntax
2 selected_component ::= prefix . selector_name
3 selector_name ::= identifier | character_literal | operator_symbol
Name Resolution Rules
4 A selected_component is called an expanded name if, according to the
visibility rules, at least one possible interpretation of its prefix denotes a
package or an enclosing named construct (directly, not through a
subprogram_renaming_declaration or generic_renaming_declaration).
5 A selected_component that is not an expanded name shall resolve to
denote one of the following:
6 A component (including a discriminant):
7 The prefix shall resolve to denote an object or value of some non-array
composite type (after any implicit dereference). The selector_name shall
resolve to denote a discriminant_specification of the type, or, unless
the type is a protected type, a component_declaration of the type. The
selected_component denotes the corresponding component of the object or
value.
8 A single entry, an entry family, or a protected subprogram:
9 The prefix shall resolve to denote an object or value of some task or
protected type (after any implicit dereference). The selector_name shall
resolve to denote an entry_declaration or subprogram_declaration
occurring (implicitly or explicitly) within the visible part of that
type. The selected_component denotes the corresponding entry, entry
family, or protected subprogram.
10 An expanded name shall resolve to denote a declaration that occurs
immediately within a named declarative region, as follows:
11 The prefix shall resolve to denote either a package (including the
current instance of a generic package, or a rename of a package), or an
enclosing named construct.
12 The selector_name shall resolve to denote a declaration that occurs
immediately within the declarative region of the package or enclosing
construct (the declaration shall be visible at the place of the expanded
name - see 8.3). The expanded name denotes that declaration.
13 If the prefix does not denote a package, then it shall be a direct_name
or an expanded name, and it shall resolve to denote a program unit
(other than a package), the current instance of a type, a
block_statement, a loop_statement, or an accept_statement (in the case
of an accept_statement or entry_body, no family index is allowed); the
expanded name shall occur within the declarative region of this
construct. Further, if this construct is a callable construct and the
prefix denotes more than one such enclosing callable construct, then the
expanded name is ambiguous, independently of the selector_name.
Dynamic Semantics
14 The evaluation of a selected_component includes the evaluation of the
prefix.
15 For a selected_component that denotes a component of a variant, a check
is made that the values of the discriminants are such that the value or object
denoted by the prefix has this component. The exception Constraint_Error is
raised if this check fails.
Examples
16 Examples of selected components:
17 Tomorrow.Month -- a record component
(see 3.8)
Next_Car.Owner -- a record component
(see 3.10.1)
Next_Car.Owner.Age -- a record component
(see 3.10.1)
-- the previous two lines involve implicit dereferences
Writer.Unit -- a record component (a discriminant)
(see 3.8.1)
Min_Cell(H).Value -- a record component of the result
(see 6.1)
-- of the function call Min_Cell(H)
Control.Seize -- an entry of a protected object
(see 9.4)
Pool(K).Write -- an entry of the task Pool(K)
(see 9.4)
18 Examples of expanded names:
19 Key_Manager."<" -- an operator of the visible part of a package
(see 7.3.1)
Dot_Product.Sum -- a variable declared in a function body
(see 6.1)
Buffer.Pool -- a variable declared in a protected unit
(see 9.11)
Buffer.Read -- an entry of a protected unit
(see 9.11)
Swap.Temp -- a variable declared in a block statement
(see 5.6)
Standard.Boolean -- the name of a predefined type
(see A.1)
4.1.4 Attributes
1 An attribute is a characteristic of an entity that can be queried via an
attribute_reference or a range_attribute_reference.
Syntax
2 attribute_reference ::= prefix'attribute_designator
3 attribute_designator ::=
identifier[(static_expression)]
| Access | Delta | Digits
4 range_attribute_reference ::= prefix'range_attribute_designator
5 range_attribute_designator ::= Range[(static_expression)]
Name Resolution Rules
6 In an attribute_reference, if the attribute_designator is for an
attribute defined for (at least some) objects of an access type, then the
prefix is never interpreted as an implicit_dereference; otherwise (and for all
range_attribute_references), if the type of the name within the prefix is of
an access type, the prefix is interpreted as an implicit_dereference.
Similarly, if the attribute_designator is for an attribute defined for (at
least some) functions, then the prefix is never interpreted as a parameterless
function_call; otherwise (and for all range_attribute_references), if the
prefix consists of a name that denotes a function, it is interpreted as a
parameterless function_call.
7 The expression, if any, in an attribute_designator or
range_attribute_designator is expected to be of any integer type.
Legality Rules
8 The expression, if any, in an attribute_designator or
range_attribute_designator shall be static.
Static Semantics
9 An attribute_reference denotes a value, an object, a subprogram, or some
other kind of program entity.
10 A range_attribute_reference X'Range(N) is equivalent to the range
X'First(N) .. X'Last(N), except that the prefix is only evaluated once.
Similarly, X'Range is equivalent to X'First .. X'Last, except that the prefix
is only evaluated once.
Dynamic Semantics
11 The evaluation of an attribute_reference (or range_attribute_reference)
consists of the evaluation of the prefix.
Implementation Permissions
12/1 An implementation may provide implementation-defined attributes; the
identifier for an implementation-defined attribute shall differ from those of
the language-defined attributes unless supplied for compatibility with a
previous edition of this International Standard.
NOTES
13 4 Attributes are defined throughout this International Standard, and
are summarized in Annex K.
14/1 5 In general, the name in a prefix of an attribute_reference (or a
range_attribute_reference) has to be resolved without using any context.
However, in the case of the Access attribute, the expected type for the
prefix has to be a single access type, and if it is an
access-to-subprogram type (see 3.10.2) then the resolution of the name
can use the fact that the profile of the callable entity denoted by the
prefix has to be type conformant with the designated profile of the
access type.
Examples
15 Examples of attributes:
16 Color'First -- minimum value of the enumeration type Color
(see 3.5.1)
Rainbow'Base'First -- same as Color'First
(see 3.5.1)
Real'Digits -- precision of the type Real
(see 3.5.7)
Board'Last(2) -- upper bound of the second dimension of Board
(see 3.6.1)
Board'Range(1) -- index range of the first dimension of Board
(see 3.6.1)
Pool(K)'Terminated -- True if task Pool(K) is terminated
(see 9.1)
Date'Size -- number of bits for records of type Date
(see 3.8)
Message'Address -- address of the record variable Message
(see 3.7.1)
4.2 Literals
1 A literal represents a value literally, that is, by means of notation
suited to its kind. A literal is either a numeric_literal, a
character_literal, the literal null, or a string_literal.
Name Resolution Rules
2 The expected type for a literal null shall be a single access type.
3 For a name that consists of a character_literal, either its expected
type shall be a single character type, in which case it is interpreted as a
parameterless function_call that yields the corresponding value of the
character type, or its expected profile shall correspond to a parameterless
function with a character result type, in which case it is interpreted as the
name of the corresponding parameterless function declared as part of the
character type's definition (see 3.5.1). In either case, the character_literal
denotes the enumeration_literal_specification.
4 The expected type for a primary that is a string_literal shall be a
single string type.
Legality Rules
5 A character_literal that is a name shall correspond to a
defining_character_literal of the expected type, or of the result type of the
expected profile.
6 For each character of a string_literal with a given expected string
type, there shall be a corresponding defining_character_literal of the
component type of the expected string type.
7 A literal null shall not be of an anonymous access type, since such
types do not have a null value (see 3.10).
Static Semantics
8 An integer literal is of type universal_integer. A real literal is of
type universal_real.
Dynamic Semantics
9 The evaluation of a numeric literal, or the literal null, yields the
represented value.
10 The evaluation of a string_literal that is a primary yields an array
value containing the value of each character of the sequence of characters of
the string_literal, as defined in 2.6. The bounds of this array value are
determined according to the rules for positional_array_aggregates (see 4.3.3
), except that for a null string literal, the upper bound is the predecessor
of the lower bound.
11 For the evaluation of a string_literal of type T, a check is made that
the value of each character of the string_literal belongs to the component
subtype of T. For the evaluation of a null string literal, a check is made
that its lower bound is greater than the lower bound of the base range of the
index type. The exception Constraint_Error is raised if either of these checks
fails.
NOTES
12 6 Enumeration literals that are identifiers rather than
character_literals follow the normal rules for identifiers when used in
a name (see 4.1 and 4.1.3). Character_literals used as selector_names
follow the normal rules for expanded names (see 4.1.3).
Examples
13 Examples of literals:
14 3.14159_26536 -- a real literal
1_345 -- an integer literal
'A' -- a character literal
"Some Text" -- a string literal
4.3 Aggregates
1 An aggregate combines component values into a composite value of an
array type, record type, or record extension.
Syntax
2 aggregate ::= record_aggregate | extension_aggregate
| array_aggregate
Name Resolution Rules
3 The expected type for an aggregate shall be a single nonlimited array
type, record type, or record extension.
Legality Rules
4 An aggregate shall not be of a class-wide type.
Dynamic Semantics
5 For the evaluation of an aggregate, an anonymous object is created and
values for the components or ancestor part are obtained (as described in the
subsequent subclause for each kind of the aggregate) and assigned into the
corresponding components or ancestor part of the anonymous object. Obtaining
the values and the assignments occur in an arbitrary order. The value of the
aggregate is the value of this object.
6 If an aggregate is of a tagged type, a check is made that its value
belongs to the first subtype of the type. Constraint_Error is raised if this
check fails.
4.3.1 Record Aggregates
1 In a record_aggregate, a value is specified for each component of the
record or record extension value, using either a named or a positional
association.
Syntax
2 record_aggregate ::= (record_component_association_list)
3 record_component_association_list ::=
record_component_association {, record_component_association}
| null record
4 record_component_association ::=
[ component_choice_list => ] expression
5 component_choice_list ::=
component_selector_name {| component_selector_name}
| others
6 A record_component_association is a named component association if it
has a component_choice_list; otherwise, it is a positional component
association. Any positional component associations shall precede any
named component associations. If there is a named association with a
component_choice_list of others, it shall come last.
7 In the record_component_association_list for a record_aggregate, if
there is only one association, it shall be a named association.
Name Resolution Rules
8 The expected type for a record_aggregate shall be a single nonlimited
record type or record extension.
9 For the record_component_association_list of a record_aggregate, all
components of the composite value defined by the aggregate are needed; for the
association list of an extension_aggregate, only those components not
determined by the ancestor expression or subtype are needed (see 4.3.2). Each
selector_name in a record_component_association shall denote a needed
component (including possibly a discriminant).
10 The expected type for the expression of a record_component_association
is the type of the associated component(s); the associated component(s) are as
follows:
11 For a positional association, the component (including possibly a
discriminant) in the corresponding relative position (in the declarative
region of the type), counting only the needed components;
12 For a named association with one or more component_selector_names, the
named component(s);
13 For a named association with the reserved word others, all needed
components that are not associated with some previous association.
Legality Rules
14 If the type of a record_aggregate is a record extension, then it shall
be a descendant of a record type, through one or more record extensions (and
no private extensions).
15 If there are no components needed in a given
record_component_association_list, then the reserved words null record shall
appear rather than a list of record_component_associations.
16 Each record_component_association shall have at least one associated
component, and each needed component shall be associated with exactly one
record_component_association. If a record_component_association has two or
more associated components, all of them shall be of the same type.
17 If the components of a variant_part are needed, then the value of a
discriminant that governs the variant_part shall be given by a static
expression.
Dynamic Semantics
18 The evaluation of a record_aggregate consists of the evaluation of the
record_component_association_list.
19 For the evaluation of a record_component_association_list, any
per-object constraints (see 3.8) for components specified in the association
list are elaborated and any expressions are evaluated and converted to the
subtype of the associated component. Any constraint elaborations and
expression evaluations (and conversions) occur in an arbitrary order, except
that the expression for a discriminant is evaluated (and converted) prior to
the elaboration of any per-object constraint that depends on it, which in turn
occurs prior to the evaluation and conversion of the expression for the
component with the per-object constraint.
20 The expression of a record_component_association is evaluated (and
converted) once for each associated component.
NOTES
21 7 For a record_aggregate with positional associations, expressions
specifying discriminant values appear first since the
known_discriminant_part is given first in the declaration of the type;
they have to be in the same order as in the known_discriminant_part.
Examples
22 Example of a record aggregate with positional associations:
23 (4, July, 1776) -- see 3.8
24 Examples of record aggregates with named associations:
25 (Day => 4, Month => July, Year => 1776)
(Month => July, Day => 4, Year => 1776)
26 (Disk, Closed, Track => 5, Cylinder => 12) -- see 3.8.1
(Unit => Disk, Status => Closed, Cylinder => 9, Track => 1)
27 Example of component association with several choices:
28 (Value => 0, Succ|Pred => new Cell'(0, null, null)) -- see 3.10.1
29 -- The allocator is evaluated twice: Succ and Pred designate different cells
30 Examples of record aggregates for tagged types (see 3.9 and 3.9.1):
31 Expression'(null record)
Literal'(Value => 0.0)
Painted_Point'(0.0, Pi/2.0, Paint => Red)
4.3.2 Extension Aggregates
1 An extension_aggregate specifies a value for a type that is a record
extension by specifying a value or subtype for an ancestor of the type,
followed by associations for any components not determined by the
ancestor_part.
Syntax
2 extension_aggregate ::=
(ancestor_part with record_component_association_list)
3 ancestor_part ::= expression | subtype_mark
Name Resolution Rules
4 The expected type for an extension_aggregate shall be a single
nonlimited type that is a record extension. If the ancestor_part is an
expression, it is expected to be of any nonlimited tagged type.
Legality Rules
5 If the ancestor_part is a subtype_mark, it shall denote a specific
tagged subtype. The type of the extension_aggregate shall be derived from the
type of the ancestor_part, through one or more record extensions (and no
private extensions).
Static Semantics
6 For the record_component_association_list of an extension_aggregate, the
only components needed are those of the composite value defined by the
aggregate that are not inherited from the type of the ancestor_part, plus any
inherited discriminants if the ancestor_part is a subtype_mark that denotes an
unconstrained subtype.
Dynamic Semantics
7 For the evaluation of an extension_aggregate, the record_component_-
association_list is evaluated. If the ancestor_part is an expression, it is
also evaluated; if the ancestor_part is a subtype_mark, the components of the
value of the aggregate not given by the record_component_association_list are
initialized by default as for an object of the ancestor type. Any implicit
initializations or evaluations are performed in an arbitrary order, except
that the expression for a discriminant is evaluated prior to any other
evaluation or initialization that depends on it.
8 If the type of the ancestor_part has discriminants that are not
inherited by the type of the extension_aggregate, then, unless the
ancestor_part is a subtype_mark that denotes an unconstrained subtype, a check
is made that each discriminant of the ancestor has the value specified for a
corresponding discriminant, either in the record_component_association_-
list, or in the derived_type_definition for some ancestor of the type of the
extension_aggregate. Constraint_Error is raised if this check fails.
NOTES
9 8 If all components of the value of the extension_aggregate are
determined by the ancestor_part, then the record_component_association_-
list is required to be simply null record.
10 9 If the ancestor_part is a subtype_mark, then its type can be
abstract. If its type is controlled, then as the last step of evaluating
the aggregate, the Initialize procedure of the ancestor type is called,
unless the Initialize procedure is abstract (see 7.6).
Examples
11 Examples of extension aggregates (for types defined in 3.9.1):
12 Painted_Point'(Point with Red)
(Point'(P) with Paint => Black)
13 (Expression with Left => 1.2, Right => 3.4)
Addition'(Binop with null record)
-- presuming Binop is of type Binary_Operation
4.3.3 Array Aggregates
1 In an array_aggregate, a value is specified for each component of an
array, either positionally or by its index. For a positional_array_aggregate,
the components are given in increasing-index order, with a final others, if
any, representing any remaining components. For a named_array_aggregate, the
components are identified by the values covered by the discrete_choices.
Syntax
2 array_aggregate ::=
positional_array_aggregate | named_array_aggregate
3 positional_array_aggregate ::=
(expression, expression {, expression})
| (expression {, expression}, others => expression)
4 named_array_aggregate ::=
(array_component_association {, array_component_association})
5 array_component_association ::=
discrete_choice_list => expression
6 An n-dimensional array_aggregate is one that is written as n levels of
nested array_aggregates (or at the bottom level, equivalent string_literals).
For the multidimensional case (n >= 2) the array_aggregates (or equivalent
string_literals) at the n-1 lower levels are called subaggregates of the
enclosing n-dimensional array_aggregate. The expressions of the bottom level
subaggregates (or of the array_aggregate itself if one-dimensional) are called
the array component expressions of the enclosing n-dimensional
array_aggregate.
Name Resolution Rules
7 The expected type for an array_aggregate (that is not a subaggregate)
shall be a single nonlimited array type. The component type of this array type
is the expected type for each array component expression of the
array_aggregate.
8 The expected type for each discrete_choice in any discrete_choice_list
of a named_array_aggregate is the type of the corresponding index; the
corresponding index for an array_aggregate that is not a subaggregate is the
first index of its type; for an (n-m)-dimensional subaggregate within an
array_aggregate of an n-dimensional type, the corresponding index is the index
in position m+1.
Legality Rules
9 An array_aggregate of an n-dimensional array type shall be written as an
n-dimensional array_aggregate.
10 An others choice is allowed for an array_aggregate only if an applicable
index constraint applies to the array_aggregate. An applicable index
constraint is a constraint provided by certain contexts where an
array_aggregate is permitted that can be used to determine the bounds of the
array value specified by the aggregate. Each of the following contexts (and
none other) defines an applicable index constraint:
11 For an explicit_actual_parameter, an explicit_generic_actual_parameter,
the expression of a return_statement, the initialization expression in
an object_declaration, or a default_expression (for a parameter or a
component), when the nominal subtype of the corresponding formal
parameter, generic formal parameter, function result, object, or
component is a constrained array subtype, the applicable index
constraint is the constraint of the subtype;
12 For the expression of an assignment_statement where the name denotes an
array variable, the applicable index constraint is the constraint of the
array variable;
13 For the operand of a qualified_expression whose subtype_mark denotes a
constrained array subtype, the applicable index constraint is the
constraint of the subtype;
14 For a component expression in an aggregate, if the component's nominal
subtype is a constrained array subtype, the applicable index constraint
is the constraint of the subtype;
15 For a parenthesized expression, the applicable index constraint is that,
if any, defined for the expression.
16 The applicable index constraint applies to an array_aggregate that
appears in such a context, as well as to any subaggregates thereof. In the
case of an explicit_actual_parameter (or default_expression) for a call on a
generic formal subprogram, no applicable index constraint is defined.
17 The discrete_choice_list of an array_component_association is allowed to
have a discrete_choice that is a nonstatic expression or that is a
discrete_range that defines a nonstatic or null range, only if it is the
single discrete_choice of its discrete_choice_list, and there is only one
array_component_association in the array_aggregate.
18 In a named_array_aggregate with more than one discrete_choice, no two
discrete_choices are allowed to cover the same value (see 3.8.1); if there is
no others choice, the discrete_choices taken together shall exactly cover a
contiguous sequence of values of the corresponding index type.
19 A bottom level subaggregate of a multidimensional array_aggregate of a
given array type is allowed to be a string_literal only if the component type
of the array type is a character type; each character of such a string_literal
shall correspond to a defining_character_literal of the component type.
Static Semantics
20 A subaggregate that is a string_literal is equivalent to one that is a
positional_array_aggregate of the same length, with each expression being the
character_literal for the corresponding character of the string_literal.
Dynamic Semantics
21 The evaluation of an array_aggregate of a given array type proceeds in
two steps:
22 1. Any discrete_choices of this aggregate and of its subaggregates are
evaluated in an arbitrary order, and converted to the corresponding
index type;
23 2. The array component expressions of the aggregate are evaluated in an
arbitrary order and their values are converted to the component
subtype of the array type; an array component expression is
evaluated once for each associated component.
24 The bounds of the index range of an array_aggregate (including a
subaggregate) are determined as follows:
25 For an array_aggregate with an others choice, the bounds are those of
the corresponding index range from the applicable index constraint;
26 For a positional_array_aggregate (or equivalent string_literal) without
an others choice, the lower bound is that of the corresponding index
range in the applicable index constraint, if defined, or that of the
corresponding index subtype, if not; in either case, the upper bound is
determined from the lower bound and the number of expressions (or the
length of the string_literal);
27 For a named_array_aggregate without an others choice, the bounds are
determined by the smallest and largest index values covered by any
discrete_choice_list.
28 For an array_aggregate, a check is made that the index range defined by
its bounds is compatible with the corresponding index subtype.
29 For an array_aggregate with an others choice, a check is made that no
expression is specified for an index value outside the bounds determined by
the applicable index constraint.
30 For a multidimensional array_aggregate, a check is made that all
subaggregates that correspond to the same index have the same bounds.
31 The exception Constraint_Error is raised if any of the above checks
fail.
NOTES
32 10 In an array_aggregate, positional notation may only be used with two
or more expressions; a single expression in parentheses is interpreted
as a parenthesized_expression. A named_array_aggregate, such as (1 =>
X), may be used to specify an array with a single component.
Examples
33 Examples of array aggregates with positional associations:
34 (7, 9, 5, 1, 3, 2, 4, 8, 6, 0)
Table'(5, 8, 4, 1, others => 0) -- see 3.6
35 Examples of array aggregates with named associations:
36 (1 .. 5 => (1 .. 8 => 0.0)) -- two-dimensional
(1 .. N => new Cell) -- N new cells, in particular for N = 0
37 Table'(2 | 4 | 10 => 1, others => 0)
Schedule'(Mon .. Fri => True, others => False) -- see 3.6
Schedule'(Wed | Sun => False, others => True)
Vector'(1 => 2.5) -- single-component vector
38 Examples of two-dimensional array aggregates:
39 -- Three aggregates for the same value of subtype Matrix(1..2,1..3) (see 3.6
):
40 ((1.1, 1.2, 1.3), (2.1, 2.2, 2.3))
(1 => (1.1, 1.2, 1.3), 2 => (2.1, 2.2, 2.3))
(1 => (1 => 1.1, 2 => 1.2, 3 => 1.3), 2 => (1 => 2.1, 2 => 2.2, 3 => 2.3))
41 Examples of aggregates as initial values:
42 A : Table := (7, 9, 5, 1, 3, 2, 4, 8, 6, 0); -- A(1)=7, A(10)=0
B : Table := (2 | 4 | 10 => 1, others => 0); -- B(1)=0, B(10)=1
C : constant Matrix := (1 .. 5 => (1 .. 8 => 0.0)); -- C'Last(1)=5, C'Last(2)=8
43 D : Bit_Vector(M .. N) := (M .. N => True); -- see 3.6
E : Bit_Vector(M .. N) := (others => True);
F : String(1 .. 1) := (1 => 'F'); -- a one component aggregate: same as "F"
4.4 Expressions
1 An expression is a formula that defines the computation or retrieval of
a value. In this International Standard, the term ``expression'' refers to a
construct of the syntactic category expression or of any of the other five
syntactic categories defined below.
Syntax
2 expression ::=
relation {and relation} | relation {and then relation}
| relation {or relation} | relation {or else relation}
| relation {xor relation}
3 relation ::=
simple_expression [relational_operator simple_expression]
| simple_expression [not] in range
| simple_expression [not] in subtype_mark
4 simple_expression ::= [unary_adding_operator] term
{binary_adding_operator term}
5 term ::= factor {multiplying_operator factor}
6 factor ::= primary [** primary] | abs primary | not primary
7 primary ::=
numeric_literal | null | string_literal | aggregate
| name | qualified_expression | allocator | (expression)
Name Resolution Rules
8 A name used as a primary shall resolve to denote an object or a value.
Static Semantics
9 Each expression has a type; it specifies the computation or retrieval of
a value of that type.
Dynamic Semantics
10 The value of a primary that is a name denoting an object is the value of
the object.
Implementation Permissions
11 For the evaluation of a primary that is a name denoting an object of an
unconstrained numeric subtype, if the value of the object is outside the base
range of its type, the implementation may either raise Constraint_Error or
return the value of the object.
Examples
12 Examples of primaries:
13 4.0 -- real literal
Pi -- named number
(1 .. 10 => 0) -- array aggregate
Sum -- variable
Integer'Last -- attribute
Sine(X) -- function call
Color'(Blue) -- qualified expression
Real(M*N) -- conversion
(Line_Count + 10) -- parenthesized expression
14 Examples of expressions:
15 Volume -- primary
not Destroyed -- factor
2*Line_Count -- term
-4.0 -- simple expression
-4.0 + A -- simple expression
B**2 - 4.0*A*C -- simple expression
Password(1 .. 3) = "Bwv" -- relation
Count in Small_Int -- relation
Count not in Small_Int -- relation
Index = 0 or Item_Hit -- expression
(Cold and Sunny) or Warm -- expression (parentheses are required)
A**(B**C) -- expression (parentheses are required)
4.5 Operators and Expression Evaluation
1 The language defines the following six categories of operators (given in
order of increasing precedence). The corresponding operator_symbols, and only
those, can be used as designators in declarations of functions for
user-defined operators. See 6.6, ``Overloading of Operators''.
Syntax
2 logical_operator ::= and | or | xor
3 relational_operator ::=
= | /= | < | <= | > | >=
4 binary_adding_operator ::= + | - | &
5 unary_adding_operator ::= + | -
6 multiplying_operator ::= * | / | mod | rem
7 highest_precedence_operator ::= ** | abs | not
Static Semantics
8 For a sequence of operators of the same precedence level, the operators
are associated with their operands in textual order from left to right.
Parentheses can be used to impose specific associations.
9 For each form of type definition, certain of the above operators are
predefined; that is, they are implicitly declared immediately after the type
definition. For each such implicit operator declaration, the parameters are
called Left and Right for binary operators; the single parameter is called
Right for unary operators. An expression of the form X op Y, where op is a
binary operator, is equivalent to a function_call of the form "op"(X, Y). An
expression of the form op Y, where op is a unary operator, is equivalent to a
function_call of the form "op"(Y). The predefined operators and their effects
are described in subclauses 4.5.1 through 4.5.6.
Dynamic Semantics
10 The predefined operations on integer types either yield the
mathematically correct result or raise the exception Constraint_Error. For
implementations that support the Numerics Annex, the predefined operations on
real types yield results whose accuracy is defined in Annex G, or raise the
exception Constraint_Error.
Implementation Requirements
11 The implementation of a predefined operator that delivers a result of an
integer or fixed point type may raise Constraint_Error only if the result is
outside the base range of the result type.
12 The implementation of a predefined operator that delivers a result of a
floating point type may raise Constraint_Error only if the result is outside
the safe range of the result type.
Implementation Permissions
13 For a sequence of predefined operators of the same precedence level (and
in the absence of parentheses imposing a specific association), an
implementation may impose any association of the operators with operands so
long as the result produced is an allowed result for the left-to-right
association, but ignoring the potential for failure of language-defined checks
in either the left-to-right or chosen order of association.
NOTES
14 11 The two operands of an expression of the form X op Y, where op is a
binary operator, are evaluated in an arbitrary order, as for any
function_call (see 6.4).
Examples
15 Examples of precedence:
16 not Sunny or Warm -- same as (not Sunny) or Warm
X > 4.0 and Y > 0.0 -- same as (X > 4.0) and (Y > 0.0)
17 -4.0*A**2 -- same as -(4.0 * (A**2))
abs(1 + A) + B -- same as (abs (1 + A)) + B
Y**(-3) -- parentheses are necessary
A / B * C -- same as (A/B)*C
A + (B + C) -- evaluate B + C before adding it to A
4.5.1 Logical Operators and Short-circuit Control Forms
Name Resolution Rules
1 An expression consisting of two relations connected by and then or or
else (a short-circuit control form) shall resolve to be of some boolean type;
the expected type for both relations is that same boolean type.
Static Semantics
2 The following logical operators are predefined for every boolean type T,
for every modular type T, and for every one-dimensional array type T whose
component type is a boolean type:
3 function "and"(Left, Right : T) return T
function "or" (Left, Right : T) return T
function "xor"(Left, Right : T) return T
4 For boolean types, the predefined logical operators and, or, and xor
perform the conventional operations of conjunction, inclusive disjunction, and
exclusive disjunction, respectively.
5 For modular types, the predefined logical operators are defined on a
bit-by-bit basis, using the binary representation of the value of the operands
to yield a binary representation for the result, where zero represents False
and one represents True. If this result is outside the base range of the type,
a final subtraction by the modulus is performed to bring the result into the
base range of the type.
6 The logical operators on arrays are performed on a
component-by-component basis on matching components (as for equality - see
4.5.2), using the predefined logical operator for the component type. The
bounds of the resulting array are those of the left operand.
Dynamic Semantics
7 The short-circuit control forms and then and or else deliver the same
result as the corresponding predefined and and or operators for boolean types,
except that the left operand is always evaluated first, and the right operand
is not evaluated if the value of the left operand determines the result.
8 For the logical operators on arrays, a check is made that for each
component of the left operand there is a matching component of the right
operand, and vice versa. Also, a check is made that each component of the
result belongs to the component subtype. The exception Constraint_Error is
raised if either of the above checks fails.
NOTES
9 12 The conventional meaning of the logical operators is given by the
following truth table:
10 A B (A and B)
(A or B) (A xor B)
True True True True
False
True False False True
True
False True False True
True
False False False
False False
Examples
11 Examples of logical operators:
12 Sunny or Warm
Filter(1 .. 10) and Filter(15 .. 24) -- see 3.6.1
13 Examples of short-circuit control forms:
14 Next_Car.Owner /= null and then Next_Car.Owner.Age > 25 -- see 3.10.1
N = 0 or else A(N) = Hit_Value
4.5.2 Relational Operators and Membership Tests
1 The equality operators = (equals) and /= (not equals) are predefined for
nonlimited types. The other relational_operators are the ordering operators <
(less than), <= (less than or equal), > (greater than), and >= (greater than
or equal). The ordering operators are predefined for scalar types, and for
discrete array types, that is, one-dimensional array types whose components
are of a discrete type.
2 A membership test, using in or not in, determines whether or not a value
belongs to a given subtype or range, or has a tag that identifies a type that
is covered by a given type. Membership tests are allowed for all types.
Name Resolution Rules
3 The tested type of a membership test is the type of the range or the
type determined by the subtype_mark. If the tested type is tagged, then the
simple_expression shall resolve to be of a type that covers or is covered by
the tested type; if untagged, the expected type for the simple_expression is
the tested type.
Legality Rules
4 For a membership test, if the simple_expression is of a tagged
class-wide type, then the tested type shall be (visibly) tagged.
Static Semantics
5 The result type of a membership test is the predefined type Boolean.
6 The equality operators are predefined for every specific type T that is
not limited, and not an anonymous access type, with the following
specifications:
7 function "=" (Left, Right : T) return Boolean
function "/="(Left, Right : T) return Boolean
8 The ordering operators are predefined for every specific scalar type T,
and for every discrete array type T, with the following specifications:
9 function "<" (Left, Right : T) return Boolean
function "<="(Left, Right : T) return Boolean
function ">" (Left, Right : T) return Boolean
function ">="(Left, Right : T) return Boolean
Dynamic Semantics
10 For discrete types, the predefined relational operators are defined in
terms of corresponding mathematical operations on the position numbers of the
values of the operands.
11 For real types, the predefined relational operators are defined in terms
of the corresponding mathematical operations on the values of the operands,
subject to the accuracy of the type.
12 Two access-to-object values are equal if they designate the same object,
or if both are equal to the null value of the access type.
13 Two access-to-subprogram values are equal if they are the result of the
same evaluation of an Access attribute_reference, or if both are equal to the
null value of the access type. Two access-to-subprogram values are unequal if
they designate different subprograms. It is unspecified whether two access
values that designate the same subprogram but are the result of distinct
evaluations of Access attribute_references are equal or unequal.
14 For a type extension, predefined equality is defined in terms of the
primitive (possibly user-defined) equals operator of the parent type and of
any tagged components of the extension part, and predefined equality for any
other components not inherited from the parent type.
15 For a private type, if its full type is tagged, predefined equality is
defined in terms of the primitive equals operator of the full type; if the
full type is untagged, predefined equality for the private type is that of its
full type.
16 For other composite types, the predefined equality operators (and
certain other predefined operations on composite types - see 4.5.1 and 4.6)
are defined in terms of the corresponding operation on matching components,
defined as follows:
17 For two composite objects or values of the same non-array type, matching
components are those that correspond to the same component_declaration
or discriminant_specification;
18 For two one-dimensional arrays of the same type, matching components are
those (if any) whose index values match in the following sense: the
lower bounds of the index ranges are defined to match, and the
successors of matching indices are defined to match;
19 For two multidimensional arrays of the same type, matching components
are those whose index values match in successive index positions.
20 The analogous definitions apply if the types of the two objects or
values are convertible, rather than being the same.
21 Given the above definition of matching components, the result of the
predefined equals operator for composite types (other than for those composite
types covered earlier) is defined as follows:
22 If there are no components, the result is defined to be True;
23 If there are unmatched components, the result is defined to be False;
24 Otherwise, the result is defined in terms of the primitive equals
operator for any matching tagged components, and the predefined equals
for any matching untagged components.
24.1/1 For any composite type, the order in which "=" is called for components
is unspecified. Furthermore, if the result can be determined before calling
"=" on some components, it is unspecified whether "=" is called on those
components.
25 The predefined "/=" operator gives the complementary result to the
predefined "=" operator.
26 For a discrete array type, the predefined ordering operators correspond
to lexicographic order using the predefined order relation of the component
type: A null array is lexicographically less than any array having at least
one component. In the case of nonnull arrays, the left operand is
lexicographically less than the right operand if the first component of the
left operand is less than that of the right; otherwise the left operand is
lexicographically less than the right operand only if their first components
are equal and the tail of the left operand is lexicographically less than that
of the right (the tail consists of the remaining components beyond the first
and can be null).
27 For the evaluation of a membership test, the simple_expression and the
range (if any) are evaluated in an arbitrary order.
28 A membership test using in yields the result True if:
29 The tested type is scalar, and the value of the simple_expression
belongs to the given range, or the range of the named subtype; or
30 The tested type is not scalar, and the value of the simple_expression
satisfies any constraints of the named subtype, and, if the type of the
simple_expression is class-wide, the value has a tag that identifies a
type covered by the tested type.
31 Otherwise the test yields the result False.
32 A membership test using not in gives the complementary result to the
corresponding membership test using in.
Implementation Requirements
32.1/1 For all nonlimited types declared in language-defined packages, the "="
and "/=" operators of the type shall behave as if they were the predefined
equality operators for the purposes of the equality of composite types and
generic formal types.
NOTES
33 13 No exception is ever raised by a membership test, by a predefined
ordering operator, or by a predefined equality operator for an
elementary type, but an exception can be raised by the evaluation of the
operands. A predefined equality operator for a composite type can only
raise an exception if the type has a tagged part whose primitive equals
operator propagates an exception.
34 14 If a composite type has components that depend on discriminants, two
values of this type have matching components if and only if their
discriminants are equal. Two nonnull arrays have matching components if
and only if the length of each dimension is the same for both.
Examples
35 Examples of expressions involving relational operators and membership
tests:
36 X /= Y
37 "" < "A" and "A" < "Aa" -- True
"Aa" < "B" and "A" < "A " -- True
38 My_Car = null -- true if My_Car has been set to null (see 3.10.1
)
My_Car = Your_Car -- true if we both share the same car
My_Car.all = Your_Car.all -- true if the two cars are identical
39 N not in 1 .. 10 -- range membership test
Today in Mon .. Fri -- range membership test
Today in Weekday -- subtype membership test (see 3.5.1)
Archive in Disk_Unit -- subtype membership test (see 3.8.1)
Tree.all in Addition'Class -- class membership test (see 3.9.1)
4.5.3 Binary Adding Operators
Static Semantics
1 The binary adding operators + (addition) and - (subtraction) are
predefined for every specific numeric type T with their conventional meaning.
They have the following specifications:
2 function "+"(Left, Right : T) return T
function "-"(Left, Right : T) return T
3 The concatenation operators & are predefined for every nonlimited,
one-dimensional array type T with component type C. They have the following
specifications:
4 function "&"(Left : T; Right : T) return T
function "&"(Left : T; Right : C) return T
function "&"(Left : C; Right : T) return T
function "&"(Left : C; Right : C) return T
Dynamic Semantics
5 For the evaluation of a concatenation with result type T, if both
operands are of type T, the result of the concatenation is a one-dimensional
array whose length is the sum of the lengths of its operands, and whose
components comprise the components of the left operand followed by the
components of the right operand. If the left operand is a null array, the
result of the concatenation is the right operand. Otherwise, the lower bound
of the result is determined as follows:
6 If the ultimate ancestor of the array type was defined by a
constrained_array_definition, then the lower bound of the result is that
of the index subtype;
7 If the ultimate ancestor of the array type was defined by an
unconstrained_array_definition, then the lower bound of the result is
that of the left operand.
8 The upper bound is determined by the lower bound and the length. A check
is made that the upper bound of the result of the concatenation belongs to the
range of the index subtype, unless the result is a null array.
Constraint_Error is raised if this check fails.
9 If either operand is of the component type C, the result of the
concatenation is given by the above rules, using in place of such an operand
an array having this operand as its only component (converted to the component
subtype) and having the lower bound of the index subtype of the array type as
its lower bound.
10 The result of a concatenation is defined in terms of an assignment to an
anonymous object, as for any function call (see 6.5).
NOTES
11 15 As for all predefined operators on modular types, the binary adding
operators + and - on modular types include a final reduction modulo the
modulus if the result is outside the base range of the type.
Examples
12 Examples of expressions involving binary adding operators:
13 Z + 0.1 -- Z has to be of a real type
14 "A" & "BCD" -- concatenation of two string literals
'A' & "BCD" -- concatenation of a character literal and a string literal
'A' & 'A' -- concatenation of two character literals
4.5.4 Unary Adding Operators
Static Semantics
1 The unary adding operators + (identity) and - (negation) are predefined
for every specific numeric type T with their conventional meaning. They have
the following specifications:
2 function "+"(Right : T) return T
function "-"(Right : T) return T
NOTES
3 16 For modular integer types, the unary adding operator -, when given a
nonzero operand, returns the result of subtracting the value of the
operand from the modulus; for a zero operand, the result is zero.
4.5.5 Multiplying Operators
Static Semantics
1 The multiplying operators * (multiplication), / (division), mod
(modulus), and rem (remainder) are predefined for every specific integer type
T:
2 function "*" (Left, Right : T) return T
function "/" (Left, Right : T) return T
function "mod"(Left, Right : T) return T
function "rem"(Left, Right : T) return T
3 Signed integer multiplication has its conventional meaning.
4 Signed integer division and remainder are defined by the relation:
5 A = (A/B)*B + (A rem B)
6 where (A rem B) has the sign of A and an absolute value less than the
absolute value of B. Signed integer division satisfies the identity:
7 (-A)/B = -(A/B) = A/(-B)
8 The signed integer modulus operator is defined such that the result of A
mod B has the sign of B and an absolute value less than the absolute value of
B; in addition, for some signed integer value N, this result satisfies the
relation:
9 A = B*N + (A mod B)
10 The multiplying operators on modular types are defined in terms of the
corresponding signed integer operators, followed by a reduction modulo the
modulus if the result is outside the base range of the type (which is only
possible for the "*" operator).
11 Multiplication and division operators are predefined for every specific
floating point type T:
12 function "*"(Left, Right : T) return T
function "/"(Left, Right : T) return T
13 The following multiplication and division operators, with an operand of
the predefined type Integer, are predefined for every specific fixed point
type T:
14 function "*"(Left : T; Right : Integer) return T
function "*"(Left : Integer; Right : T) return T
function "/"(Left : T; Right : Integer) return T
15 All of the above multiplying operators are usable with an operand of an
appropriate universal numeric type. The following additional multiplying
operators for root_real are predefined, and are usable when both operands are
of an appropriate universal or root numeric type, and the result is allowed to
be of type root_real, as in a number_declaration:
16 function "*"(Left, Right : root_real) return root_real
function "/"(Left, Right : root_real) return root_real
17 function "*"(Left : root_real; Right : root_integer) return root_real
function "*"(Left : root_integer; Right : root_real) return root_real
function "/"(Left : root_real; Right : root_integer) return root_real
18 Multiplication and division between any two fixed point types are
provided by the following two predefined operators:
19 function "*"(Left, Right : universal_fixed) return universal_fixed
function "/"(Left, Right : universal_fixed) return universal_fixed
Legality Rules
20 The above two fixed-fixed multiplying operators shall not be used in a
context where the expected type for the result is itself universal_fixed - the
context has to identify some other numeric type to which the result is to be
converted, either explicitly or implicitly.
Dynamic Semantics
21 The multiplication and division operators for real types have their
conventional meaning. For floating point types, the accuracy of the result is
determined by the precision of the result type. For decimal fixed point types,
the result is truncated toward zero if the mathematical result is between two
multiples of the small of the specific result type (possibly determined by
context); for ordinary fixed point types, if the mathematical result is
between two multiples of the small, it is unspecified which of the two is the
result.
22 The exception Constraint_Error is raised by integer division, rem, and
mod if the right operand is zero. Similarly, for a real type T with
T'Machine_Overflows True, division by zero raises Constraint_Error.
NOTES
23 17 For positive A and B, A/B is the quotient and A rem B is the
remainder when A is divided by B. The following relations are satisfied
by the rem operator:
24 A rem (-B) = A rem B
(-A) rem B = -(A rem B)
25 18 For any signed integer K, the following identity holds:
26 A mod B = (A + K*B) mod B
27 The relations between signed integer division, remainder, and modulus
are illustrated by the following table:
28 A B A/B A rem B A mod B A B A/B A rem B A mod B
29 10 5 2 0 0 -10 5 -2 0 0
11 5 2 1 1 -11 5 -2 -1 4
12 5 2 2 2 -12 5 -2 -2 3
13 5 2 3 3 -13 5 -2 -3 2
14 5 2 4 4 -14 5 -2 -4 1
30 A B A/B A rem B A mod B A B A/B A rem B A mod B
10 -5 -2 0 0 -10 -5 2 0 0
11 -5 -2 1 -4 -11 -5 2 -1 -1
12 -5 -2 2 -3 -12 -5 2 -2 -2
13 -5 -2 3 -2 -13 -5 2 -3 -3
14 -5 -2 4 -1 -14 -5 2 -4 -4
Examples
31 Examples of expressions involving multiplying operators:
32 I : Integer := 1;
J : Integer := 2;
K : Integer := 3;
33 X : Real := 1.0; -- see 3.5.7
Y : Real := 2.0;
34 F : Fraction := 0.25; -- see 3.5.9
G : Fraction := 0.5;
35 Expression Value Result Type
I*J 2 same as I and J, that is, Integer
K/J 1 same as K and J, that is, Integer
K mod J 1 same as K and J, that is, Integer
X/Y 0.5 same as X and Y, that is, Real
F/2 0.125 same as F, that is, Fraction
3*F 0.75 same as F, that is, Fraction
0.75*G 0.375
universal_fixed, implicitly convertible
to any fixed point type
Fraction(F*G) 0.125
Fraction, as stated by the conversion
Real(J)*Y 4.0
Real, the type of both operands after
conversion of J
4.5.6 Highest Precedence Operators
Static Semantics
1 The highest precedence unary operator abs (absolute value) is predefined
for every specific numeric type T, with the following specification:
2 function "abs"(Right : T) return T
3 The highest precedence unary operator not (logical negation) is
predefined for every boolean type T, every modular type T, and for every
one-dimensional array type T whose components are of a boolean type, with the
following specification:
4 function "not"(Right : T) return T
5 The result of the operator not for a modular type is defined as the
difference between the high bound of the base range of the type and the value
of the operand. For a binary modulus, this corresponds to a bit-wise
complement of the binary representation of the value of the operand.
6 The operator not that applies to a one-dimensional array of boolean
components yields a one-dimensional boolean array with the same bounds; each
component of the result is obtained by logical negation of the corresponding
component of the operand (that is, the component that has the same index
value). A check is made that each component of the result belongs to the
component subtype; the exception Constraint_Error is raised if this check
fails.
7 The highest precedence exponentiation operator ** is predefined for
every specific integer type T with the following specification:
8 function "**"(Left : T; Right : Natural) return T
9 Exponentiation is also predefined for every specific floating point type
as well as root_real, with the following specification (where T is root_real
or the floating point type):
10 function "**"(Left : T; Right : Integer'Base) return T
11 The right operand of an exponentiation is the exponent. The expression
X**N with the value of the exponent N positive is equivalent to the expression
X*X*...X (with N-1 multiplications) except that the multiplications are
associated in an arbitrary order. With N equal to zero, the result is one.
With the value of N negative (only defined for a floating point operand), the
result is the reciprocal of the result using the absolute value of N as the
exponent.
Implementation Permissions
12 The implementation of exponentiation for the case of a negative exponent
is allowed to raise Constraint_Error if the intermediate result of the
repeated multiplications is outside the safe range of the type, even though
the final result (after taking the reciprocal) would not be. (The best machine
approximation to the final result in this case would generally be 0.0.)
NOTES
13 19 As implied by the specification given above for exponentiation of an
integer type, a check is made that the exponent is not negative.
Constraint_Error is raised if this check fails.
4.6 Type Conversions
1 Explicit type conversions, both value conversions and view conversions,
are allowed between closely related types as defined below. This clause also
defines rules for value and view conversions to a particular subtype of a
type, both explicit ones and those implicit in other constructs.
Syntax
2 type_conversion ::=
subtype_mark(expression)
| subtype_mark(name)
3 The target subtype of a type_conversion is the subtype denoted by the
subtype_mark. The operand of a type_conversion is the expression or name
within the parentheses; its type is the operand type.
4 One type is convertible to a second type if a type_conversion with the
first type as operand type and the second type as target type is legal
according to the rules of this clause. Two types are convertible if each is
convertible to the other.
5/1 A type_conversion whose operand is the name of an object is called a
view conversion if both its target type and operand type are tagged, or if it
appears as an actual parameter of mode out or in out; other type_conversions
are called value conversions.
Name Resolution Rules
6 The operand of a type_conversion is expected to be of any type.
7 The operand of a view conversion is interpreted only as a name; the
operand of a value conversion is interpreted as an expression.
Legality Rules
8 If the target type is a numeric type, then the operand type shall be a
numeric type.
9 If the target type is an array type, then the operand type shall be an
array type. Further:
10 The types shall have the same dimensionality;
11/1 Corresponding index types shall be convertible;
12/1 The component subtypes shall statically match; and
12.1/1 In a view conversion, the target type and the operand type shall both
or neither have aliased components.
13 If the target type is a general access type, then the operand type shall
be an access-to-object type. Further:
14 If the target type is an access-to-variable type, then the operand type
shall be an access-to-variable type;
15 If the target designated type is tagged, then the operand designated
type shall be convertible to the target designated type;
16 If the target designated type is not tagged, then the designated types
shall be the same, and either the designated subtypes shall statically
match or the target designated subtype shall be discriminated and
unconstrained; and
17 The accessibility level of the operand type shall not be statically
deeper than that of the target type. In addition to the places where
Legality Rules normally apply (see 12.3), this rule applies also in the
private part of an instance of a generic unit.
18 If the target type is an access-to-subprogram type, then the operand
type shall be an access-to-subprogram type. Further:
19 The designated profiles shall be subtype-conformant.
20 The accessibility level of the operand type shall not be statically
deeper than that of the target type. In addition to the places where
Legality Rules normally apply (see 12.3), this rule applies also in the
private part of an instance of a generic unit. If the operand type is
declared within a generic body, the target type shall be declared within
the generic body.
21 If the target type is not included in any of the above four cases, there
shall be a type that is an ancestor of both the target type and the operand
type. Further, if the target type is tagged, then either:
22 The operand type shall be covered by or descended from the target type;
or
23 The operand type shall be a class-wide type that covers the target type.
24 In a view conversion for an untagged type, the target type shall be
convertible (back) to the operand type.
Static Semantics
25 A type_conversion that is a value conversion denotes the value that is
the result of converting the value of the operand to the target subtype.
26 A type_conversion that is a view conversion denotes a view of the object
denoted by the operand. This view is a variable of the target type if the
operand denotes a variable; otherwise it is a constant of the target type.
27 The nominal subtype of a type_conversion is its target subtype.
Dynamic Semantics
28 For the evaluation of a type_conversion that is a value conversion, the
operand is evaluated, and then the value of the operand is converted to a
corresponding value of the target type, if any. If there is no value of the
target type that corresponds to the operand value, Constraint_Error is raised;
this can only happen on conversion to a modular type, and only when the
operand value is outside the base range of the modular type. Additional rules
follow:
29 Numeric Type Conversion
30 If the target and the operand types are both integer types, then the
result is the value of the target type that corresponds to the same
mathematical integer as the operand.
31 If the target type is a decimal fixed point type, then the result is
truncated (toward 0) if the value of the operand is not a multiple
of the small of the target type.
32 If the target type is some other real type, then the result is
within the accuracy of the target type (see G.2, ``
Numeric Performance Requirements'', for implementations that support
the Numerics Annex).
33 If the target type is an integer type and the operand type is real,
the result is rounded to the nearest integer (away from zero if
exactly halfway between two integers).
34 Enumeration Type Conversion
35 The result is the value of the target type with the same position
number as that of the operand value.
36 Array Type Conversion
37 If the target subtype is a constrained array subtype, then a check
is made that the length of each dimension of the value of the
operand equals the length of the corresponding dimension of the
target subtype. The bounds of the result are those of the target
subtype.
38 If the target subtype is an unconstrained array subtype, then the
bounds of the result are obtained by converting each bound of the
value of the operand to the corresponding index type of the target
type. For each nonnull index range, a check is made that the bounds
of the range belong to the corresponding index subtype.
39 In either array case, the value of each component of the result is
that of the matching component of the operand value (see 4.5.2).
40 Composite (Non-Array) Type Conversion
41 The value of each nondiscriminant component of the result is that of
the matching component of the operand value.
42 The tag of the result is that of the operand. If the operand type is
class-wide, a check is made that the tag of the operand identifies a
(specific) type that is covered by or descended from the target
type.
43 For each discriminant of the target type that corresponds to a
discriminant of the operand type, its value is that of the
corresponding discriminant of the operand value; if it corresponds
to more than one discriminant of the operand type, a check is made
that all these discriminants are equal in the operand value.
44 For each discriminant of the target type that corresponds to a
discriminant that is specified by the derived_type_definition for
some ancestor of the operand type (or if class-wide, some ancestor
of the specific type identified by the tag of the operand), its
value in the result is that specified by the
derived_type_definition.
45 For each discriminant of the operand type that corresponds to a
discriminant that is specified by the derived_type_definition for
some ancestor of the target type, a check is made that in the
operand value it equals the value specified for it.
46 For each discriminant of the result, a check is made that its value
belongs to its subtype.
47 Access Type Conversion
48 For an access-to-object type, a check is made that the accessibility
level of the operand type is not deeper than that of the target
type.
49 If the target type is an anonymous access type, a check is made that
the value of the operand is not null; if the target is not an
anonymous access type, then the result is null if the operand value
is null.
50 If the operand value is not null, then the result designates the
same object (or subprogram) as is designated by the operand value,
but viewed as being of the target designated subtype (or profile);
any checks associated with evaluating a conversion to the target
designated subtype are performed.
51 After conversion of the value to the target type, if the target subtype
is constrained, a check is performed that the value satisfies this constraint.
52 For the evaluation of a view conversion, the operand name is evaluated,
and a new view of the object denoted by the operand is created, whose type is
the target type; if the target type is composite, checks are performed as
above for a value conversion.
53 The properties of this new view are as follows:
54/1 If the target type is composite, the bounds or discriminants (if any) of
the view are as defined above for a value conversion; each
nondiscriminant component of the view denotes the matching component of
the operand object; the subtype of the view is constrained if either the
target subtype or the operand object is constrained, or if the target
subtype is indefinite, or if the operand type is a descendant of the
target type, and has discriminants that were not inherited from the
target type;
55 If the target type is tagged, then an assignment to the view assigns to
the corresponding part of the object denoted by the operand; otherwise,
an assignment to the view assigns to the object, after converting the
assigned value to the subtype of the object (which might raise
Constraint_Error);
56 Reading the value of the view yields the result of converting the value
of the operand object to the target subtype (which might raise
Constraint_Error), except if the object is of an access type and the
view conversion is passed as an out parameter; in this latter case, the
value of the operand object is used to initialize the formal parameter
without checking against any constraint of the target subtype (see
6.4.1).
57 If an Accessibility_Check fails, Program_Error is raised. Any other
check associated with a conversion raises Constraint_Error if it fails.
58 Conversion to a type is the same as conversion to an unconstrained
subtype of the type.
NOTES
59 20 In addition to explicit type_conversions, type conversions are
performed implicitly in situations where the expected type and the
actual type of a construct differ, as is permitted by the type
resolution rules (see 8.6). For example, an integer literal is of the
type universal_integer, and is implicitly converted when assigned to a
target of some specific integer type. Similarly, an actual parameter of
a specific tagged type is implicitly converted when the corresponding
formal parameter is of a class-wide type.
60 21 Even when the expected and actual types are the same, implicit
subtype conversions are performed to adjust the array bounds (if any) of
an operand to match the desired target subtype, or to raise
Constraint_Error if the (possibly adjusted) value does not satisfy the
constraints of the target subtype.
61 A ramification of the overload resolution rules is that the operand of
an (explicit) type_conversion cannot be the literal null, an allocator,
an aggregate, a string_literal, a character_literal, or an
attribute_reference for an Access or Unchecked_Access attribute.
Similarly, such an expression enclosed by parentheses is not allowed. A
qualified_expression (see 4.7) can be used instead of such a
type_conversion.
62 22 The constraint of the target subtype has no effect for a
type_conversion of an elementary type passed as an out parameter. Hence,
it is recommended that the first subtype be specified as the target to
minimize confusion (a similar recommendation applies to renaming and
generic formal in out objects).
Examples
63 Examples of numeric type conversion:
64 Real(2*J) -- value is converted to floating point
Integer(1.6) -- value is 2
Integer(-0.4) -- value is 0
65 Example of conversion between derived types:
66 type A_Form is new B_Form;
67 X : A_Form;
Y : B_Form;
68 X := A_Form(Y);
Y := B_Form(X); -- the reverse conversion
69 Examples of conversions between array types:
70 type Sequence is array (Integer range <>) of Integer;
subtype Dozen is Sequence(1 .. 12);
Ledger : array(1 .. 100) of Integer;
71 Sequence(Ledger) -- bounds are those of Ledger
Sequence(Ledger(31 .. 42)) -- bounds are 31 and 42
Dozen(Ledger(31 .. 42)) -- bounds are those of Dozen
4.7 Qualified Expressions
1 A qualified_expression is used to state explicitly the type, and to
verify the subtype, of an operand that is either an expression or an
aggregate.
Syntax
2 qualified_expression ::=
subtype_mark'(expression) | subtype_mark'aggregate
Name Resolution Rules
3 The operand (the expression or aggregate) shall resolve to be of the
type determined by the subtype_mark, or a universal type that covers it.
Dynamic Semantics
4 The evaluation of a qualified_expression evaluates the operand (and if
of a universal type, converts it to the type determined by the subtype_mark)
and checks that its value belongs to the subtype denoted by the subtype_mark.
The exception Constraint_Error is raised if this check fails.
NOTES
5 23 When a given context does not uniquely identify an expected type, a
qualified_expression can be used to do so. In particular, if an
overloaded name or aggregate is passed to an overloaded subprogram, it
might be necessary to qualify the operand to resolve its type.
Examples
6 Examples of disambiguating expressions using qualification:
7 type Mask is (Fix, Dec, Exp, Signif);
type Code is (Fix, Cla, Dec, Tnz, Sub);
8 Print (Mask'(Dec)); -- Dec is of type Mask
Print (Code'(Dec)); -- Dec is of type Code
9 for J in Code'(Fix) .. Code'(Dec) loop ... -- qualification needed for either Fix or Dec
for J in Code range Fix .. Dec loop ... -- qualification unnecessary
for J in Code'(Fix) .. Dec loop ... -- qualification unnecessary for Dec
10 Dozen'(1 | 3 | 5 | 7 => 2, others => 0) -- see 4.6
4.8 Allocators
1 The evaluation of an allocator creates an object and yields an access
value that designates the object.
Syntax
2 allocator ::=
new subtype_indication | new qualified_expression
Name Resolution Rules
3/1 The expected type for an allocator shall be a single access-to-object
type with designated type D such that either D covers the type determined by
the subtype_mark of the subtype_indication or qualified_expression, or the
expected type is anonymous and the determined type is D'Class.
Legality Rules
4 An initialized allocator is an allocator with a qualified_expression. An
uninitialized allocator is one with a subtype_indication. In the
subtype_indication of an uninitialized allocator, a constraint is permitted
only if the subtype_mark denotes an unconstrained composite subtype; if there
is no constraint, then the subtype_mark shall denote a definite subtype.
5 If the type of the allocator is an access-to-constant type, the
allocator shall be an initialized allocator. If the designated type is
limited, the allocator shall be an uninitialized allocator.
Static Semantics
6 If the designated type of the type of the allocator is elementary, then
the subtype of the created object is the designated subtype. If the designated
type is composite, then the created object is always constrained; if the
designated subtype is constrained, then it provides the constraint of the
created object; otherwise, the object is constrained by its initial value
(even if the designated subtype is unconstrained with defaults).
Dynamic Semantics
7 For the evaluation of an allocator, the elaboration of the
subtype_indication or the evaluation of the qualified_expression is performed
first. For the evaluation of an initialized allocator, an object of the
designated type is created and the value of the qualified_expression is
converted to the designated subtype and assigned to the object.
8 For the evaluation of an uninitialized allocator:
9 If the designated type is elementary, an object of the designated
subtype is created and any implicit initial value is assigned;
10/1 If the designated type is composite, an object of the designated type is
created with tag, if any, determined by the subtype_mark of the
subtype_indication; any per-object constraints on subcomponents are
elaborated (see 3.8) and any implicit initial values for the
subcomponents of the object are obtained as determined by the
subtype_indication and assigned to the corresponding subcomponents. A
check is made that the value of the object belongs to the designated
subtype. Constraint_Error is raised if this check fails. This check and
the initialization of the object are performed in an arbitrary order.
11 If the created object contains any tasks, they are activated (see 9.2).
Finally, an access value that designates the created object is returned.
NOTES
12 24 Allocators cannot create objects of an abstract type. See 3.9.3.
13 25 If any part of the created object is controlled, the initialization
includes calls on corresponding Initialize or Adjust procedures. See
7.6.
14 26 As explained in 13.11, ``Storage Management'', the storage for an
object allocated by an allocator comes from a storage pool (possibly
user defined). The exception Storage_Error is raised by an allocator if
there is not enough storage. Instances of Unchecked_Deallocation may be
used to explicitly reclaim storage.
15 27 Implementations are permitted, but not required, to provide garbage
collection (see 13.11.3).
Examples
16 Examples of allocators:
17 new Cell'(0, null, null) -- initialized explicitly, see 3.10.1
new Cell'(Value => 0, Succ => null, Pred => null) -- initialized explicitly
new Cell -- not initialized
18 new Matrix(1 .. 10, 1 .. 20) -- the bounds only are given
new Matrix'(1 .. 10 => (1 .. 20 => 0.0)) -- initialized explicitly
19 new Buffer(100) -- the discriminant only is given
new Buffer'(Size => 80, Pos => 0, Value => (1 .. 80 => 'A')) -- initialized explicitly
20 Expr_Ptr'(new Literal) -- allocator for access-to-class-wide type, see 3.9.1
Expr_Ptr'(new Literal'(Expression with 3.5)) -- initialized explicitly
4.9 Static Expressions and Static Subtypes
1 Certain expressions of a scalar or string type are defined to be static.
Similarly, certain discrete ranges are defined to be static, and certain
scalar and string subtypes are defined to be static subtypes. Static means
determinable at compile time, using the declared properties or values of the
program entities.
2 A static expression is a scalar or string expression that is one of the
following:
3 a numeric_literal;
4 a string_literal of a static string subtype;
5 a name that denotes the declaration of a named number or a static
constant;
6 a function_call whose function_name or function_prefix statically
denotes a static function, and whose actual parameters, if any (whether
given explicitly or by default), are all static expressions;
7 an attribute_reference that denotes a scalar value, and whose prefix
denotes a static scalar subtype;
8 an attribute_reference whose prefix statically denotes a statically
constrained array object or array subtype, and whose
attribute_designator is First, Last, or Length, with an optional
dimension;
9 a type_conversion whose subtype_mark denotes a static scalar subtype,
and whose operand is a static expression;
10 a qualified_expression whose subtype_mark denotes a static (scalar or
string) subtype, and whose operand is a static expression;
11 a membership test whose simple_expression is a static expression, and
whose range is a static range or whose subtype_mark denotes a static
(scalar or string) subtype;
12 a short-circuit control form both of whose relations are static
expressions;
13 a static expression enclosed in parentheses.
14 A name statically denotes an entity if it denotes the entity and:
15 It is a direct_name, expanded name, or character_literal, and it denotes
a declaration other than a renaming_declaration; or
16 It is an attribute_reference whose prefix statically denotes some
entity; or
17 It denotes a renaming_declaration with a name that statically denotes
the renamed entity.
18 A static function is one of the following:
19 a predefined operator whose parameter and result types are all scalar
types none of which are descendants of formal scalar types;
20 a predefined concatenation operator whose result type is a string type;
21 an enumeration literal;
22 a language-defined attribute that is a function, if the prefix denotes a
static scalar subtype, and if the parameter and result types are scalar.
23 In any case, a generic formal subprogram is not a static function.
24 A static constant is a constant view declared by a full constant
declaration or an object_renaming_declaration with a static nominal subtype,
having a value defined by a static scalar expression or by a static string
expression whose value has a length not exceeding the maximum length of a
string_literal in the implementation.
25 A static range is a range whose bounds are static expressions, or a
range_attribute_reference that is equivalent to such a range. A static
discrete_range is one that is a static range or is a subtype_indication that
defines a static scalar subtype. The base range of a scalar type is a static
range, unless the type is a descendant of a formal scalar type.
26 A static subtype is either a static scalar subtype or a static string
subtype. A static scalar subtype is an unconstrained scalar subtype whose type
is not a descendant of a formal scalar type, or a constrained scalar subtype
formed by imposing a compatible static constraint on a static scalar subtype.
A static string subtype is an unconstrained string subtype whose index subtype
and component subtype are static (and whose type is not a descendant of a
formal array type), or a constrained string subtype formed by imposing a
compatible static constraint on a static string subtype. In any case, the
subtype of a generic formal object of mode in out, and the result subtype of a
generic formal function, are not static.
27 The different kinds of static constraint are defined as follows:
28 A null constraint is always static;
29 A scalar constraint is static if it has no range_constraint, or one with
a static range;
30 An index constraint is static if each discrete_range is static, and each
index subtype of the corresponding array type is static;
31 A discriminant constraint is static if each expression of the constraint
is static, and the subtype of each discriminant is static.
32 A subtype is statically constrained if it is constrained, and its
constraint is static. An object is statically constrained if its nominal
subtype is statically constrained, or if it is a static string constant.
Legality Rules
33 A static expression is evaluated at compile time except when it is part
of the right operand of a static short-circuit control form whose value is
determined by its left operand. This evaluation is performed exactly, without
performing Overflow_Checks. For a static expression that is evaluated:
34 The expression is illegal if its evaluation fails a language-defined
check other than Overflow_Check.
35 If the expression is not part of a larger static expression, then its
value shall be within the base range of its expected type. Otherwise,
the value may be arbitrarily large or small.
36 If the expression is of type universal_real and its expected type is a
decimal fixed point type, then its value shall be a multiple of the
small of the decimal type.
37 The last two restrictions above do not apply if the expected type is a
descendant of a formal scalar type (or a corresponding actual type in an
instance).
Implementation Requirements
38 For a real static expression that is not part of a larger static
expression, and whose expected type is not a descendant of a formal scalar
type, the implementation shall round or truncate the value (according to the
Machine_Rounds attribute of the expected type) to the nearest machine number
of the expected type; if the value is exactly half-way between two machine
numbers, any rounding shall be performed away from zero. If the expected type
is a descendant of a formal scalar type, no special rounding or truncating is
required - normal accuracy rules apply (see Annex G).
NOTES
39 28 An expression can be static even if it occurs in a context where
staticness is not required.
40 29 A static (or run-time) type_conversion from a real type to an
integer type performs rounding. If the operand value is exactly half-way
between two integers, the rounding is performed away from zero.
Examples
41 Examples of static expressions:
42 1 + 1 -- 2
abs(-10)*3 -- 30
43 Kilo : constant := 1000;
Mega : constant := Kilo*Kilo; -- 1_000_000
Long : constant := Float'Digits*2;
44 Half_Pi : constant := Pi/2; -- see 3.3.2
Deg_To_Rad : constant := Half_Pi/90;
Rad_To_Deg : constant := 1.0/Deg_To_Rad; -- equivalent to 1.0/((3.14159_26536/2)/90)
4.9.1 Statically Matching Constraints and Subtypes
Static Semantics
1 A constraint statically matches another constraint if both are null
constraints, both are static and have equal corresponding bounds or
discriminant values, or both are nonstatic and result from the same
elaboration of a constraint of a subtype_indication or the same evaluation of
a range of a discrete_subtype_definition.
2 A subtype statically matches another subtype of the same type if they
have statically matching constraints. Two anonymous access subtypes statically
match if their designated subtypes statically match.
3 Two ranges of the same type statically match if both result from the
same evaluation of a range, or if both are static and have equal corresponding
bounds.
4 A constraint is statically compatible with a scalar subtype if it
statically matches the constraint of the subtype, or if both are static and
the constraint is compatible with the subtype. A constraint is statically
compatible with an access or composite subtype if it statically matches the
constraint of the subtype, or if the subtype is unconstrained. One subtype is
statically compatible with a second subtype if the constraint of the first is
statically compatible with the second subtype.
|