This file is indexed.

/usr/share/gps/predefined_ada.xml is in gnat-gps-common 6.1.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

    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
 2443
 2444
 2445
 2446
 2447
 2448
 2449
 2450
 2451
 2452
 2453
 2454
 2455
 2456
 2457
 2458
 2459
 2460
 2461
 2462
 2463
 2464
 2465
 2466
 2467
 2468
 2469
 2470
 2471
 2472
 2473
 2474
 2475
 2476
 2477
 2478
 2479
 2480
 2481
 2482
 2483
 2484
 2485
 2486
 2487
 2488
 2489
 2490
 2491
 2492
 2493
 2494
 2495
 2496
 2497
 2498
 2499
 2500
 2501
 2502
 2503
 2504
 2505
 2506
 2507
 2508
 2509
 2510
 2511
 2512
 2513
 2514
 2515
 2516
 2517
 2518
 2519
 2520
 2521
 2522
 2523
 2524
 2525
 2526
 2527
 2528
 2529
 2530
 2531
 2532
 2533
 2534
 2535
 2536
 2537
 2538
 2539
 2540
 2541
 2542
 2543
 2544
 2545
 2546
 2547
 2548
 2549
 2550
 2551
 2552
 2553
 2554
 2555
 2556
 2557
 2558
 2559
 2560
 2561
 2562
 2563
 2564
 2565
 2566
 2567
 2568
 2569
 2570
 2571
 2572
 2573
 2574
 2575
 2576
 2577
 2578
 2579
 2580
 2581
 2582
 2583
 2584
 2585
 2586
 2587
 2588
 2589
 2590
 2591
 2592
 2593
 2594
 2595
 2596
 2597
 2598
 2599
 2600
 2601
 2602
 2603
 2604
 2605
 2606
 2607
 2608
 2609
 2610
 2611
 2612
 2613
 2614
 2615
 2616
 2617
 2618
 2619
 2620
 2621
 2622
 2623
 2624
 2625
 2626
 2627
 2628
 2629
 2630
 2631
 2632
 2633
 2634
 2635
 2636
 2637
 2638
 2639
 2640
 2641
 2642
 2643
 2644
 2645
 2646
 2647
 2648
 2649
 2650
 2651
 2652
 2653
 2654
 2655
 2656
 2657
 2658
 2659
 2660
 2661
 2662
 2663
 2664
 2665
 2666
 2667
 2668
 2669
 2670
 2671
 2672
 2673
 2674
 2675
 2676
 2677
 2678
 2679
 2680
 2681
 2682
 2683
 2684
 2685
 2686
 2687
 2688
 2689
 2690
 2691
 2692
 2693
 2694
 2695
 2696
 2697
 2698
 2699
 2700
 2701
 2702
 2703
 2704
 2705
 2706
 2707
 2708
 2709
 2710
 2711
 2712
 2713
 2714
 2715
 2716
 2717
 2718
 2719
 2720
 2721
 2722
 2723
 2724
 2725
 2726
 2727
 2728
 2729
 2730
 2731
 2732
 2733
 2734
 2735
 2736
 2737
 2738
 2739
 2740
 2741
 2742
 2743
 2744
 2745
 2746
 2747
 2748
 2749
 2750
 2751
 2752
 2753
 2754
 2755
 2756
 2757
 2758
 2759
 2760
 2761
 2762
 2763
 2764
 2765
 2766
 2767
 2768
 2769
 2770
 2771
 2772
 2773
 2774
 2775
 2776
 2777
 2778
 2779
 2780
 2781
 2782
 2783
 2784
 2785
 2786
 2787
 2788
 2789
 2790
 2791
 2792
 2793
 2794
 2795
 2796
 2797
 2798
 2799
 2800
 2801
 2802
 2803
 2804
 2805
 2806
 2807
 2808
 2809
 2810
 2811
 2812
 2813
 2814
 2815
 2816
 2817
 2818
 2819
 2820
 2821
 2822
 2823
 2824
 2825
 2826
 2827
 2828
 2829
 2830
 2831
 2832
 2833
 2834
 2835
 2836
 2837
 2838
 2839
 2840
 2841
 2842
 2843
 2844
 2845
 2846
 2847
 2848
 2849
 2850
 2851
 2852
 2853
 2854
 2855
 2856
 2857
 2858
 2859
 2860
 2861
 2862
 2863
 2864
 2865
 2866
 2867
 2868
 2869
 2870
 2871
 2872
 2873
 2874
 2875
 2876
 2877
 2878
 2879
 2880
 2881
 2882
 2883
 2884
 2885
 2886
 2887
 2888
 2889
 2890
 2891
 2892
 2893
 2894
 2895
 2896
 2897
 2898
 2899
 2900
 2901
 2902
 2903
 2904
 2905
 2906
 2907
 2908
 2909
 2910
 2911
 2912
 2913
 2914
 2915
 2916
 2917
 2918
 2919
 2920
 2921
 2922
 2923
 2924
 2925
 2926
 2927
 2928
 2929
 2930
 2931
 2932
 2933
 2934
 2935
 2936
 2937
 2938
 2939
 2940
 2941
 2942
 2943
 2944
 2945
 2946
 2947
 2948
 2949
 2950
 2951
 2952
 2953
 2954
 2955
 2956
 2957
 2958
 2959
 2960
 2961
 2962
 2963
 2964
 2965
 2966
 2967
 2968
 2969
 2970
 2971
 2972
 2973
 2974
 2975
 2976
 2977
 2978
 2979
 2980
 2981
 2982
 2983
 2984
 2985
 2986
 2987
 2988
 2989
 2990
 2991
 2992
 2993
 2994
 2995
 2996
 2997
 2998
 2999
 3000
 3001
 3002
 3003
 3004
 3005
 3006
 3007
 3008
 3009
 3010
 3011
 3012
 3013
 3014
 3015
 3016
 3017
 3018
 3019
 3020
 3021
 3022
 3023
 3024
 3025
 3026
 3027
 3028
 3029
 3030
 3031
 3032
 3033
 3034
 3035
 3036
 3037
 3038
 3039
 3040
 3041
 3042
 3043
 3044
 3045
 3046
 3047
 3048
 3049
 3050
 3051
 3052
 3053
 3054
 3055
 3056
 3057
 3058
 3059
 3060
 3061
 3062
 3063
 3064
 3065
 3066
 3067
 3068
 3069
 3070
 3071
 3072
 3073
 3074
 3075
 3076
 3077
 3078
 3079
 3080
 3081
 3082
 3083
 3084
 3085
 3086
 3087
 3088
 3089
 3090
 3091
 3092
 3093
 3094
 3095
 3096
 3097
 3098
 3099
 3100
 3101
 3102
 3103
 3104
 3105
 3106
 3107
 3108
 3109
 3110
 3111
 3112
 3113
 3114
 3115
 3116
 3117
 3118
 3119
 3120
 3121
 3122
 3123
 3124
 3125
 3126
 3127
 3128
 3129
 3130
 3131
 3132
 3133
 3134
 3135
 3136
 3137
 3138
 3139
 3140
 3141
 3142
 3143
 3144
 3145
 3146
 3147
 3148
 3149
 3150
 3151
 3152
 3153
 3154
 3155
 3156
 3157
 3158
 3159
 3160
 3161
 3162
 3163
 3164
 3165
 3166
 3167
 3168
 3169
 3170
 3171
 3172
 3173
 3174
 3175
 3176
 3177
 3178
 3179
 3180
 3181
 3182
 3183
 3184
 3185
 3186
 3187
 3188
 3189
 3190
 3191
 3192
 3193
 3194
 3195
 3196
 3197
 3198
 3199
 3200
 3201
 3202
 3203
 3204
 3205
 3206
 3207
 3208
 3209
 3210
 3211
 3212
 3213
 3214
 3215
 3216
 3217
 3218
 3219
 3220
 3221
 3222
 3223
 3224
 3225
 3226
 3227
 3228
 3229
 3230
 3231
 3232
 3233
 3234
 3235
 3236
 3237
 3238
 3239
 3240
 3241
 3242
 3243
 3244
 3245
 3246
 3247
 3248
 3249
 3250
 3251
 3252
 3253
 3254
 3255
 3256
 3257
 3258
 3259
 3260
 3261
 3262
 3263
 3264
 3265
 3266
 3267
 3268
 3269
 3270
 3271
 3272
 3273
 3274
 3275
 3276
 3277
 3278
 3279
 3280
 3281
 3282
 3283
 3284
 3285
 3286
 3287
 3288
 3289
 3290
 3291
 3292
 3293
 3294
 3295
 3296
 3297
 3298
 3299
 3300
 3301
 3302
 3303
 3304
 3305
 3306
 3307
 3308
 3309
 3310
 3311
 3312
 3313
 3314
 3315
 3316
 3317
 3318
 3319
 3320
 3321
 3322
 3323
 3324
 3325
 3326
 3327
 3328
 3329
 3330
 3331
 3332
 3333
 3334
 3335
 3336
 3337
 3338
 3339
 3340
 3341
 3342
 3343
 3344
 3345
 3346
 3347
 3348
 3349
 3350
 3351
 3352
 3353
 3354
 3355
 3356
 3357
 3358
 3359
 3360
 3361
 3362
 3363
 3364
 3365
 3366
 3367
 3368
 3369
 3370
 3371
 3372
 3373
 3374
 3375
 3376
 3377
 3378
 3379
 3380
 3381
 3382
 3383
 3384
 3385
 3386
 3387
 3388
 3389
 3390
 3391
 3392
 3393
 3394
 3395
 3396
 3397
 3398
 3399
 3400
 3401
 3402
 3403
 3404
 3405
 3406
 3407
 3408
 3409
 3410
 3411
 3412
 3413
 3414
 3415
 3416
 3417
 3418
 3419
 3420
 3421
 3422
 3423
 3424
 3425
 3426
 3427
 3428
 3429
 3430
 3431
 3432
 3433
 3434
 3435
 3436
 3437
 3438
 3439
 3440
 3441
 3442
 3443
 3444
 3445
 3446
 3447
 3448
 3449
 3450
 3451
 3452
 3453
 3454
 3455
 3456
 3457
 3458
 3459
 3460
 3461
 3462
 3463
 3464
 3465
 3466
 3467
 3468
 3469
 3470
 3471
 3472
 3473
 3474
 3475
 3476
 3477
 3478
 3479
 3480
 3481
 3482
 3483
 3484
 3485
 3486
 3487
 3488
 3489
 3490
 3491
 3492
 3493
 3494
 3495
 3496
 3497
 3498
 3499
 3500
 3501
 3502
 3503
 3504
 3505
 3506
 3507
 3508
 3509
 3510
 3511
 3512
 3513
 3514
 3515
 3516
 3517
 3518
 3519
 3520
 3521
 3522
 3523
 3524
 3525
 3526
 3527
 3528
 3529
 3530
 3531
 3532
 3533
 3534
 3535
 3536
 3537
 3538
 3539
 3540
 3541
 3542
 3543
 3544
 3545
 3546
 3547
 3548
 3549
 3550
 3551
 3552
 3553
 3554
 3555
 3556
 3557
 3558
 3559
 3560
 3561
 3562
 3563
 3564
 3565
 3566
 3567
 3568
 3569
 3570
 3571
 3572
 3573
 3574
 3575
 3576
 3577
 3578
 3579
 3580
 3581
 3582
 3583
 3584
 3585
 3586
 3587
 3588
 3589
 3590
 3591
 3592
 3593
 3594
 3595
 3596
 3597
 3598
 3599
 3600
 3601
 3602
 3603
 3604
 3605
 3606
 3607
 3608
 3609
 3610
 3611
 3612
 3613
 3614
 3615
 3616
 3617
 3618
 3619
 3620
 3621
 3622
 3623
 3624
 3625
 3626
 3627
 3628
 3629
 3630
 3631
 3632
 3633
 3634
 3635
 3636
 3637
 3638
 3639
 3640
 3641
 3642
 3643
 3644
 3645
 3646
 3647
 3648
 3649
 3650
 3651
 3652
 3653
 3654
 3655
 3656
 3657
 3658
 3659
 3660
 3661
 3662
 3663
 3664
 3665
 3666
 3667
 3668
 3669
 3670
 3671
 3672
 3673
 3674
 3675
 3676
 3677
 3678
 3679
 3680
 3681
 3682
 3683
 3684
 3685
 3686
 3687
 3688
 3689
 3690
 3691
 3692
 3693
 3694
 3695
 3696
 3697
 3698
 3699
 3700
 3701
 3702
 3703
 3704
 3705
 3706
 3707
 3708
 3709
 3710
 3711
 3712
 3713
 3714
 3715
 3716
 3717
 3718
 3719
 3720
 3721
 3722
 3723
 3724
 3725
 3726
 3727
 3728
 3729
 3730
 3731
 3732
 3733
 3734
 3735
 3736
 3737
 3738
 3739
 3740
 3741
 3742
 3743
 3744
 3745
 3746
 3747
 3748
 3749
 3750
 3751
 3752
 3753
 3754
 3755
 3756
 3757
 3758
 3759
 3760
 3761
 3762
 3763
 3764
 3765
 3766
 3767
 3768
 3769
 3770
 3771
 3772
 3773
 3774
 3775
 3776
 3777
 3778
 3779
 3780
 3781
 3782
 3783
 3784
 3785
 3786
 3787
 3788
 3789
 3790
 3791
 3792
 3793
 3794
 3795
 3796
 3797
 3798
 3799
 3800
 3801
 3802
 3803
 3804
 3805
 3806
 3807
 3808
 3809
 3810
 3811
 3812
 3813
 3814
 3815
 3816
 3817
 3818
 3819
 3820
 3821
 3822
 3823
 3824
 3825
 3826
 3827
 3828
 3829
 3830
 3831
 3832
 3833
 3834
 3835
 3836
 3837
 3838
 3839
 3840
 3841
 3842
 3843
 3844
 3845
 3846
 3847
 3848
 3849
 3850
 3851
 3852
 3853
 3854
 3855
 3856
 3857
 3858
 3859
 3860
 3861
 3862
 3863
 3864
 3865
 3866
 3867
 3868
 3869
 3870
 3871
 3872
 3873
 3874
 3875
 3876
 3877
 3878
 3879
 3880
 3881
 3882
 3883
 3884
 3885
 3886
 3887
 3888
 3889
 3890
 3891
 3892
 3893
 3894
 3895
 3896
 3897
 3898
 3899
 3900
 3901
 3902
 3903
 3904
 3905
 3906
 3907
 3908
 3909
 3910
 3911
 3912
 3913
 3914
 3915
 3916
 3917
 3918
 3919
 3920
 3921
 3922
 3923
 3924
 3925
 3926
 3927
 3928
 3929
 3930
 3931
 3932
 3933
 3934
 3935
 3936
 3937
 3938
 3939
 3940
 3941
 3942
 3943
 3944
 3945
 3946
 3947
 3948
 3949
 3950
 3951
 3952
 3953
 3954
 3955
 3956
 3957
 3958
 3959
 3960
 3961
 3962
 3963
 3964
 3965
 3966
 3967
 3968
 3969
 3970
 3971
 3972
 3973
 3974
 3975
 3976
 3977
 3978
 3979
 3980
 3981
 3982
 3983
 3984
 3985
 3986
 3987
 3988
 3989
 3990
 3991
 3992
 3993
 3994
 3995
 3996
 3997
 3998
 3999
 4000
 4001
 4002
 4003
 4004
 4005
 4006
 4007
 4008
 4009
 4010
 4011
 4012
 4013
 4014
 4015
 4016
 4017
 4018
 4019
 4020
 4021
 4022
 4023
 4024
 4025
 4026
 4027
 4028
 4029
 4030
 4031
 4032
 4033
 4034
 4035
 4036
 4037
 4038
 4039
 4040
 4041
 4042
 4043
 4044
 4045
 4046
 4047
 4048
 4049
 4050
 4051
 4052
 4053
 4054
 4055
 4056
 4057
 4058
 4059
 4060
 4061
 4062
 4063
 4064
 4065
 4066
 4067
 4068
 4069
 4070
 4071
 4072
 4073
 4074
 4075
 4076
 4077
 4078
 4079
 4080
 4081
 4082
 4083
 4084
 4085
 4086
 4087
 4088
 4089
 4090
 4091
 4092
 4093
 4094
 4095
 4096
 4097
 4098
 4099
 4100
 4101
 4102
 4103
 4104
 4105
 4106
 4107
 4108
 4109
 4110
 4111
 4112
 4113
 4114
 4115
 4116
 4117
 4118
 4119
 4120
 4121
 4122
 4123
 4124
 4125
 4126
 4127
 4128
 4129
 4130
 4131
 4132
 4133
 4134
 4135
 4136
 4137
 4138
 4139
 4140
 4141
 4142
 4143
 4144
 4145
 4146
 4147
 4148
 4149
 4150
 4151
 4152
 4153
 4154
 4155
 4156
 4157
 4158
 4159
 4160
 4161
 4162
 4163
 4164
 4165
 4166
 4167
 4168
 4169
 4170
 4171
 4172
 4173
 4174
 4175
 4176
 4177
 4178
 4179
 4180
 4181
 4182
 4183
 4184
 4185
 4186
 4187
 4188
 4189
 4190
 4191
 4192
 4193
 4194
 4195
 4196
 4197
 4198
 4199
 4200
 4201
 4202
 4203
 4204
 4205
 4206
 4207
 4208
 4209
 4210
 4211
 4212
 4213
 4214
 4215
 4216
 4217
 4218
 4219
 4220
 4221
 4222
 4223
 4224
 4225
 4226
 4227
 4228
 4229
 4230
 4231
 4232
 4233
 4234
 4235
 4236
 4237
 4238
 4239
 4240
 4241
 4242
 4243
 4244
 4245
 4246
 4247
 4248
 4249
 4250
 4251
 4252
 4253
 4254
 4255
 4256
 4257
 4258
 4259
 4260
 4261
 4262
 4263
 4264
 4265
 4266
 4267
 4268
 4269
 4270
 4271
 4272
 4273
 4274
 4275
 4276
 4277
 4278
 4279
 4280
 4281
 4282
 4283
 4284
 4285
 4286
 4287
 4288
 4289
 4290
 4291
 4292
 4293
 4294
 4295
 4296
 4297
 4298
 4299
 4300
 4301
 4302
 4303
 4304
 4305
 4306
 4307
 4308
 4309
 4310
 4311
 4312
 4313
 4314
 4315
 4316
 4317
 4318
 4319
 4320
 4321
 4322
 4323
 4324
 4325
 4326
 4327
 4328
 4329
 4330
 4331
 4332
 4333
 4334
 4335
 4336
 4337
 4338
 4339
 4340
 4341
 4342
 4343
 4344
 4345
 4346
 4347
 4348
 4349
 4350
 4351
 4352
 4353
 4354
 4355
 4356
 4357
 4358
 4359
 4360
 4361
 4362
 4363
 4364
 4365
 4366
 4367
 4368
 4369
 4370
 4371
 4372
 4373
 4374
 4375
 4376
 4377
 4378
 4379
 4380
 4381
 4382
 4383
 4384
 4385
 4386
 4387
 4388
 4389
 4390
 4391
 4392
 4393
 4394
 4395
 4396
 4397
 4398
 4399
 4400
 4401
 4402
 4403
 4404
 4405
 4406
 4407
 4408
 4409
 4410
 4411
 4412
 4413
 4414
 4415
 4416
 4417
 4418
 4419
 4420
 4421
 4422
 4423
 4424
 4425
 4426
 4427
 4428
 4429
 4430
 4431
 4432
 4433
 4434
 4435
 4436
 4437
 4438
 4439
 4440
 4441
 4442
 4443
 4444
 4445
 4446
 4447
 4448
 4449
 4450
 4451
 4452
 4453
 4454
 4455
 4456
 4457
 4458
 4459
 4460
 4461
 4462
 4463
 4464
 4465
 4466
 4467
 4468
 4469
 4470
 4471
 4472
 4473
 4474
 4475
 4476
 4477
 4478
 4479
 4480
 4481
 4482
 4483
 4484
 4485
 4486
 4487
 4488
 4489
 4490
 4491
 4492
 4493
 4494
 4495
 4496
 4497
 4498
 4499
 4500
 4501
 4502
 4503
 4504
 4505
 4506
 4507
 4508
 4509
 4510
 4511
 4512
 4513
 4514
 4515
 4516
 4517
 4518
 4519
 4520
 4521
 4522
 4523
 4524
 4525
 4526
 4527
 4528
 4529
 4530
 4531
 4532
 4533
 4534
 4535
 4536
 4537
 4538
 4539
 4540
 4541
 4542
 4543
 4544
 4545
 4546
 4547
 4548
 4549
 4550
 4551
 4552
 4553
 4554
 4555
 4556
 4557
 4558
 4559
 4560
 4561
 4562
 4563
 4564
 4565
 4566
 4567
 4568
 4569
 4570
 4571
 4572
 4573
 4574
 4575
 4576
 4577
 4578
 4579
 4580
 4581
 4582
 4583
 4584
 4585
 4586
 4587
 4588
 4589
 4590
 4591
 4592
 4593
 4594
 4595
 4596
 4597
 4598
 4599
 4600
 4601
 4602
 4603
 4604
 4605
 4606
 4607
 4608
 4609
 4610
 4611
 4612
 4613
 4614
 4615
 4616
 4617
 4618
 4619
 4620
 4621
 4622
 4623
 4624
 4625
 4626
 4627
 4628
 4629
 4630
 4631
 4632
 4633
 4634
 4635
 4636
 4637
 4638
 4639
 4640
 4641
 4642
 4643
 4644
 4645
 4646
 4647
 4648
 4649
 4650
 4651
 4652
 4653
 4654
 4655
 4656
 4657
 4658
 4659
 4660
 4661
 4662
 4663
 4664
 4665
 4666
 4667
 4668
 4669
 4670
 4671
 4672
 4673
 4674
 4675
 4676
 4677
 4678
 4679
 4680
 4681
 4682
 4683
 4684
 4685
 4686
 4687
 4688
 4689
 4690
 4691
 4692
 4693
 4694
 4695
 4696
 4697
 4698
 4699
 4700
 4701
 4702
 4703
 4704
 4705
 4706
 4707
 4708
 4709
 4710
 4711
 4712
 4713
 4714
 4715
 4716
 4717
 4718
 4719
 4720
 4721
 4722
 4723
 4724
 4725
 4726
 4727
 4728
 4729
 4730
 4731
 4732
 4733
 4734
 4735
 4736
 4737
 4738
 4739
 4740
 4741
 4742
 4743
 4744
 4745
 4746
 4747
 4748
 4749
 4750
 4751
 4752
 4753
 4754
 4755
 4756
 4757
 4758
 4759
 4760
 4761
 4762
 4763
 4764
 4765
 4766
 4767
 4768
 4769
 4770
 4771
 4772
 4773
 4774
 4775
 4776
 4777
 4778
 4779
 4780
 4781
 4782
 4783
 4784
 4785
 4786
 4787
 4788
 4789
 4790
 4791
 4792
 4793
 4794
 4795
 4796
 4797
 4798
 4799
 4800
 4801
 4802
 4803
 4804
 4805
 4806
 4807
 4808
 4809
 4810
 4811
 4812
 4813
 4814
 4815
 4816
 4817
 4818
 4819
 4820
 4821
 4822
 4823
 4824
 4825
 4826
 4827
 4828
 4829
 4830
 4831
 4832
 4833
 4834
 4835
 4836
 4837
 4838
 4839
 4840
 4841
 4842
 4843
 4844
 4845
 4846
 4847
 4848
 4849
 4850
 4851
 4852
 4853
 4854
 4855
 4856
 4857
 4858
 4859
 4860
 4861
 4862
 4863
 4864
 4865
 4866
 4867
 4868
 4869
 4870
 4871
 4872
 4873
 4874
 4875
 4876
 4877
 4878
 4879
 4880
 4881
 4882
 4883
 4884
 4885
 4886
 4887
 4888
 4889
 4890
 4891
 4892
 4893
 4894
 4895
 4896
 4897
 4898
 4899
 4900
 4901
 4902
 4903
 4904
 4905
 4906
 4907
 4908
 4909
 4910
 4911
 4912
 4913
 4914
 4915
 4916
 4917
 4918
 4919
 4920
 4921
 4922
 4923
 4924
 4925
 4926
 4927
 4928
 4929
 4930
 4931
 4932
 4933
 4934
 4935
 4936
 4937
 4938
 4939
 4940
 4941
 4942
 4943
 4944
 4945
 4946
 4947
 4948
 4949
 4950
 4951
 4952
 4953
 4954
 4955
 4956
 4957
 4958
 4959
 4960
 4961
 4962
 4963
 4964
 4965
 4966
 4967
 4968
 4969
 4970
 4971
 4972
 4973
 4974
 4975
 4976
 4977
 4978
 4979
 4980
 4981
 4982
 4983
 4984
 4985
 4986
 4987
 4988
 4989
 4990
 4991
 4992
 4993
 4994
 4995
 4996
 4997
 4998
 4999
 5000
 5001
 5002
 5003
 5004
 5005
 5006
 5007
 5008
 5009
 5010
 5011
 5012
 5013
 5014
 5015
 5016
 5017
 5018
 5019
 5020
 5021
 5022
 5023
 5024
 5025
 5026
 5027
 5028
 5029
 5030
 5031
 5032
 5033
 5034
 5035
 5036
 5037
 5038
 5039
 5040
 5041
 5042
 5043
 5044
 5045
 5046
 5047
 5048
 5049
 5050
 5051
 5052
 5053
 5054
 5055
 5056
 5057
 5058
 5059
 5060
 5061
 5062
 5063
 5064
 5065
 5066
 5067
 5068
 5069
 5070
 5071
 5072
 5073
 5074
 5075
 5076
 5077
 5078
 5079
 5080
 5081
 5082
 5083
 5084
 5085
 5086
 5087
 5088
 5089
 5090
 5091
 5092
 5093
 5094
 5095
 5096
 5097
 5098
 5099
 5100
 5101
 5102
 5103
 5104
 5105
 5106
 5107
 5108
 5109
 5110
 5111
 5112
 5113
 5114
 5115
 5116
 5117
 5118
 5119
 5120
 5121
 5122
 5123
 5124
 5125
 5126
 5127
 5128
 5129
 5130
 5131
 5132
 5133
 5134
 5135
 5136
 5137
 5138
 5139
 5140
 5141
 5142
 5143
 5144
 5145
 5146
 5147
 5148
 5149
 5150
 5151
 5152
 5153
 5154
 5155
 5156
 5157
 5158
 5159
 5160
 5161
 5162
 5163
 5164
 5165
 5166
 5167
 5168
 5169
 5170
 5171
 5172
 5173
 5174
 5175
 5176
 5177
 5178
 5179
 5180
 5181
 5182
 5183
 5184
 5185
 5186
 5187
 5188
 5189
 5190
 5191
 5192
 5193
 5194
 5195
 5196
 5197
 5198
 5199
 5200
 5201
 5202
 5203
 5204
 5205
 5206
 5207
 5208
 5209
 5210
 5211
 5212
 5213
 5214
 5215
 5216
 5217
 5218
 5219
 5220
 5221
 5222
 5223
 5224
 5225
 5226
 5227
 5228
 5229
 5230
 5231
 5232
 5233
 5234
 5235
 5236
 5237
 5238
 5239
 5240
 5241
 5242
 5243
 5244
 5245
 5246
 5247
 5248
 5249
 5250
 5251
 5252
 5253
 5254
 5255
 5256
 5257
 5258
 5259
 5260
 5261
 5262
 5263
 5264
 5265
 5266
 5267
 5268
 5269
 5270
 5271
 5272
 5273
 5274
 5275
 5276
 5277
 5278
 5279
 5280
 5281
 5282
 5283
 5284
 5285
 5286
 5287
 5288
 5289
 5290
 5291
 5292
 5293
 5294
 5295
 5296
 5297
 5298
 5299
 5300
 5301
 5302
 5303
 5304
 5305
 5306
 5307
 5308
 5309
 5310
 5311
 5312
 5313
 5314
 5315
 5316
 5317
 5318
 5319
 5320
 5321
 5322
 5323
 5324
 5325
 5326
 5327
 5328
 5329
 5330
 5331
 5332
 5333
 5334
 5335
 5336
 5337
 5338
 5339
 5340
 5341
 5342
 5343
 5344
 5345
 5346
 5347
 5348
 5349
 5350
 5351
 5352
 5353
 5354
 5355
 5356
 5357
 5358
 5359
 5360
 5361
 5362
 5363
 5364
 5365
 5366
 5367
 5368
 5369
 5370
 5371
 5372
 5373
 5374
 5375
 5376
 5377
 5378
 5379
 5380
 5381
 5382
 5383
 5384
 5385
 5386
 5387
 5388
 5389
 5390
 5391
 5392
 5393
 5394
 5395
 5396
 5397
 5398
 5399
 5400
 5401
 5402
 5403
 5404
 5405
 5406
 5407
 5408
 5409
 5410
 5411
 5412
 5413
 5414
 5415
 5416
 5417
 5418
 5419
 5420
 5421
 5422
 5423
 5424
 5425
 5426
 5427
 5428
 5429
 5430
 5431
 5432
 5433
 5434
 5435
 5436
 5437
 5438
 5439
 5440
 5441
 5442
 5443
 5444
 5445
 5446
 5447
 5448
 5449
 5450
 5451
 5452
 5453
 5454
 5455
 5456
 5457
 5458
 5459
 5460
 5461
 5462
 5463
 5464
 5465
 5466
 5467
 5468
 5469
 5470
 5471
 5472
 5473
 5474
 5475
 5476
 5477
 5478
 5479
 5480
 5481
 5482
 5483
 5484
 5485
 5486
 5487
 5488
 5489
 5490
 5491
 5492
 5493
 5494
 5495
 5496
 5497
 5498
 5499
 5500
 5501
 5502
 5503
 5504
 5505
 5506
 5507
 5508
 5509
 5510
 5511
 5512
 5513
 5514
 5515
 5516
 5517
 5518
 5519
 5520
 5521
 5522
 5523
 5524
 5525
 5526
 5527
 5528
 5529
 5530
 5531
 5532
 5533
 5534
 5535
 5536
 5537
 5538
 5539
 5540
 5541
 5542
 5543
 5544
 5545
 5546
 5547
 5548
 5549
 5550
 5551
 5552
 5553
 5554
 5555
 5556
 5557
 5558
 5559
 5560
 5561
 5562
 5563
 5564
 5565
 5566
 5567
 5568
 5569
 5570
 5571
 5572
 5573
 5574
 5575
 5576
 5577
 5578
 5579
 5580
 5581
 5582
 5583
 5584
 5585
 5586
 5587
 5588
 5589
 5590
 5591
 5592
 5593
 5594
 5595
 5596
 5597
 5598
 5599
 5600
 5601
 5602
 5603
 5604
 5605
 5606
 5607
 5608
 5609
 5610
 5611
 5612
 5613
 5614
 5615
 5616
 5617
 5618
 5619
 5620
 5621
 5622
 5623
 5624
 5625
 5626
 5627
 5628
 5629
 5630
 5631
 5632
 5633
 5634
 5635
 5636
 5637
 5638
 5639
 5640
 5641
 5642
 5643
 5644
 5645
 5646
 5647
 5648
 5649
 5650
 5651
 5652
 5653
 5654
 5655
 5656
 5657
 5658
 5659
 5660
 5661
 5662
 5663
 5664
 5665
 5666
 5667
 5668
 5669
 5670
 5671
 5672
 5673
 5674
 5675
 5676
 5677
 5678
 5679
 5680
 5681
 5682
 5683
 5684
 5685
 5686
 5687
 5688
 5689
 5690
 5691
 5692
 5693
 5694
 5695
 5696
 5697
 5698
 5699
 5700
 5701
 5702
 5703
 5704
 5705
 5706
 5707
 5708
 5709
 5710
 5711
 5712
 5713
 5714
 5715
 5716
 5717
 5718
 5719
 5720
 5721
 5722
 5723
 5724
 5725
 5726
 5727
 5728
 5729
 5730
 5731
 5732
 5733
 5734
 5735
 5736
 5737
 5738
 5739
 5740
 5741
 5742
 5743
 5744
 5745
 5746
 5747
 5748
 5749
 5750
 5751
 5752
 5753
 5754
 5755
 5756
 5757
 5758
 5759
 5760
 5761
 5762
 5763
 5764
 5765
 5766
 5767
 5768
 5769
 5770
 5771
 5772
 5773
 5774
 5775
 5776
 5777
 5778
 5779
 5780
 5781
 5782
 5783
 5784
 5785
 5786
 5787
 5788
 5789
 5790
 5791
 5792
 5793
 5794
 5795
 5796
 5797
 5798
 5799
 5800
 5801
 5802
 5803
 5804
 5805
 5806
 5807
 5808
 5809
 5810
 5811
 5812
 5813
 5814
 5815
 5816
 5817
 5818
 5819
 5820
 5821
 5822
 5823
 5824
 5825
 5826
 5827
 5828
 5829
 5830
 5831
 5832
 5833
 5834
 5835
 5836
 5837
 5838
 5839
 5840
 5841
 5842
 5843
 5844
 5845
 5846
 5847
 5848
 5849
 5850
 5851
 5852
 5853
 5854
 5855
 5856
 5857
 5858
 5859
 5860
 5861
 5862
 5863
 5864
 5865
 5866
 5867
 5868
 5869
 5870
 5871
 5872
 5873
 5874
 5875
 5876
 5877
 5878
 5879
 5880
 5881
 5882
 5883
 5884
 5885
 5886
 5887
 5888
 5889
 5890
 5891
 5892
 5893
 5894
 5895
 5896
 5897
 5898
 5899
 5900
 5901
 5902
 5903
 5904
 5905
 5906
 5907
 5908
 5909
 5910
 5911
 5912
 5913
 5914
 5915
 5916
 5917
 5918
 5919
 5920
 5921
 5922
 5923
 5924
 5925
 5926
 5927
 5928
 5929
 5930
 5931
 5932
 5933
 5934
 5935
 5936
 5937
 5938
 5939
 5940
 5941
 5942
 5943
 5944
 5945
 5946
 5947
 5948
 5949
 5950
 5951
 5952
 5953
 5954
 5955
 5956
 5957
 5958
 5959
 5960
 5961
 5962
 5963
 5964
 5965
 5966
 5967
 5968
 5969
 5970
 5971
 5972
 5973
 5974
 5975
 5976
 5977
 5978
 5979
 5980
 5981
 5982
 5983
 5984
 5985
 5986
 5987
 5988
 5989
 5990
 5991
 5992
 5993
 5994
 5995
 5996
 5997
 5998
 5999
 6000
 6001
 6002
 6003
 6004
 6005
 6006
 6007
 6008
 6009
 6010
 6011
 6012
 6013
 6014
 6015
 6016
 6017
 6018
 6019
 6020
 6021
 6022
 6023
 6024
 6025
 6026
 6027
 6028
 6029
 6030
 6031
 6032
 6033
 6034
 6035
 6036
 6037
 6038
 6039
 6040
 6041
 6042
 6043
 6044
 6045
 6046
 6047
 6048
 6049
 6050
 6051
 6052
 6053
 6054
 6055
 6056
 6057
 6058
 6059
 6060
 6061
 6062
 6063
 6064
 6065
 6066
 6067
 6068
 6069
 6070
 6071
 6072
 6073
 6074
 6075
 6076
 6077
 6078
 6079
 6080
 6081
 6082
 6083
 6084
 6085
 6086
 6087
 6088
 6089
 6090
 6091
 6092
 6093
 6094
 6095
 6096
 6097
 6098
 6099
 6100
 6101
 6102
 6103
 6104
 6105
 6106
 6107
 6108
 6109
 6110
 6111
 6112
 6113
 6114
 6115
 6116
 6117
 6118
 6119
 6120
 6121
 6122
 6123
 6124
 6125
 6126
 6127
 6128
 6129
 6130
 6131
 6132
 6133
 6134
 6135
 6136
 6137
 6138
 6139
 6140
 6141
 6142
 6143
 6144
 6145
 6146
 6147
 6148
 6149
 6150
 6151
 6152
 6153
 6154
 6155
 6156
 6157
 6158
 6159
 6160
 6161
 6162
 6163
 6164
 6165
 6166
 6167
 6168
 6169
 6170
 6171
 6172
 6173
 6174
 6175
 6176
 6177
 6178
 6179
 6180
 6181
 6182
 6183
 6184
 6185
 6186
 6187
 6188
 6189
 6190
 6191
 6192
 6193
 6194
 6195
 6196
 6197
 6198
 6199
 6200
 6201
 6202
 6203
 6204
 6205
 6206
 6207
 6208
 6209
 6210
 6211
 6212
 6213
 6214
 6215
 6216
 6217
 6218
 6219
 6220
 6221
 6222
 6223
 6224
 6225
 6226
 6227
 6228
 6229
 6230
 6231
 6232
 6233
 6234
 6235
 6236
 6237
 6238
 6239
 6240
 6241
 6242
 6243
 6244
 6245
 6246
 6247
 6248
 6249
 6250
 6251
 6252
 6253
 6254
 6255
 6256
 6257
 6258
 6259
 6260
 6261
 6262
 6263
 6264
 6265
 6266
 6267
 6268
 6269
 6270
 6271
 6272
 6273
 6274
 6275
 6276
 6277
 6278
 6279
 6280
 6281
 6282
 6283
 6284
 6285
 6286
 6287
 6288
 6289
 6290
 6291
 6292
 6293
 6294
 6295
 6296
 6297
 6298
 6299
 6300
 6301
 6302
 6303
 6304
 6305
 6306
 6307
 6308
 6309
 6310
 6311
 6312
 6313
 6314
 6315
 6316
 6317
 6318
 6319
 6320
 6321
 6322
 6323
 6324
 6325
 6326
 6327
 6328
 6329
 6330
 6331
 6332
 6333
 6334
 6335
 6336
 6337
 6338
 6339
 6340
 6341
 6342
 6343
 6344
 6345
 6346
 6347
 6348
 6349
 6350
 6351
 6352
 6353
 6354
 6355
 6356
 6357
 6358
 6359
 6360
 6361
 6362
 6363
 6364
 6365
 6366
 6367
 6368
 6369
 6370
 6371
 6372
 6373
 6374
 6375
 6376
 6377
 6378
 6379
 6380
 6381
 6382
 6383
 6384
 6385
 6386
 6387
 6388
 6389
 6390
 6391
 6392
 6393
 6394
 6395
 6396
 6397
 6398
 6399
 6400
 6401
 6402
 6403
 6404
 6405
 6406
 6407
 6408
 6409
 6410
 6411
 6412
 6413
 6414
 6415
 6416
 6417
 6418
 6419
 6420
 6421
 6422
 6423
 6424
 6425
 6426
 6427
 6428
 6429
 6430
 6431
 6432
 6433
 6434
 6435
 6436
 6437
 6438
 6439
 6440
 6441
 6442
 6443
 6444
 6445
 6446
 6447
 6448
 6449
 6450
 6451
 6452
 6453
 6454
 6455
 6456
 6457
 6458
 6459
 6460
 6461
 6462
 6463
 6464
 6465
 6466
 6467
 6468
 6469
 6470
 6471
 6472
 6473
 6474
 6475
 6476
 6477
 6478
 6479
 6480
 6481
 6482
 6483
 6484
 6485
 6486
 6487
 6488
 6489
 6490
 6491
 6492
 6493
 6494
 6495
 6496
 6497
 6498
 6499
 6500
 6501
 6502
 6503
 6504
 6505
 6506
 6507
 6508
 6509
 6510
 6511
 6512
 6513
 6514
 6515
 6516
 6517
 6518
 6519
 6520
 6521
 6522
 6523
 6524
 6525
 6526
 6527
 6528
 6529
 6530
 6531
 6532
 6533
 6534
 6535
 6536
 6537
 6538
 6539
 6540
 6541
 6542
 6543
 6544
 6545
 6546
 6547
 6548
 6549
 6550
 6551
 6552
 6553
 6554
 6555
 6556
 6557
 6558
 6559
 6560
 6561
 6562
 6563
 6564
 6565
 6566
 6567
 6568
 6569
 6570
 6571
 6572
 6573
 6574
 6575
 6576
 6577
 6578
 6579
 6580
 6581
 6582
 6583
 6584
 6585
 6586
 6587
 6588
 6589
 6590
 6591
 6592
 6593
 6594
 6595
 6596
 6597
 6598
 6599
 6600
 6601
 6602
 6603
 6604
 6605
 6606
 6607
 6608
 6609
 6610
 6611
 6612
 6613
 6614
 6615
 6616
 6617
 6618
 6619
 6620
 6621
 6622
 6623
 6624
 6625
 6626
 6627
 6628
 6629
 6630
 6631
 6632
 6633
 6634
 6635
 6636
 6637
 6638
 6639
 6640
 6641
 6642
 6643
 6644
 6645
 6646
 6647
 6648
 6649
 6650
 6651
 6652
 6653
 6654
 6655
 6656
 6657
 6658
 6659
 6660
 6661
 6662
 6663
 6664
 6665
 6666
 6667
 6668
 6669
 6670
 6671
 6672
 6673
 6674
 6675
 6676
 6677
 6678
 6679
 6680
 6681
 6682
 6683
 6684
 6685
 6686
 6687
 6688
 6689
 6690
 6691
 6692
 6693
 6694
 6695
 6696
 6697
 6698
 6699
 6700
 6701
 6702
 6703
 6704
 6705
 6706
 6707
 6708
 6709
 6710
 6711
 6712
 6713
 6714
 6715
 6716
 6717
 6718
 6719
 6720
 6721
 6722
 6723
 6724
 6725
 6726
 6727
 6728
 6729
 6730
 6731
 6732
 6733
 6734
 6735
 6736
 6737
 6738
 6739
 6740
 6741
 6742
 6743
 6744
 6745
 6746
 6747
 6748
 6749
 6750
 6751
 6752
 6753
 6754
 6755
 6756
 6757
 6758
 6759
 6760
 6761
 6762
 6763
 6764
 6765
 6766
 6767
 6768
 6769
 6770
 6771
 6772
 6773
 6774
 6775
 6776
 6777
 6778
 6779
 6780
 6781
 6782
 6783
 6784
 6785
 6786
 6787
 6788
 6789
 6790
 6791
 6792
 6793
 6794
 6795
 6796
 6797
 6798
 6799
 6800
 6801
 6802
 6803
 6804
 6805
 6806
 6807
 6808
 6809
 6810
 6811
 6812
 6813
 6814
 6815
 6816
 6817
 6818
 6819
 6820
 6821
 6822
 6823
 6824
 6825
 6826
 6827
 6828
 6829
 6830
 6831
 6832
 6833
 6834
 6835
 6836
 6837
 6838
 6839
 6840
 6841
 6842
 6843
 6844
 6845
 6846
 6847
 6848
 6849
 6850
 6851
 6852
 6853
 6854
 6855
 6856
 6857
 6858
 6859
 6860
 6861
 6862
 6863
 6864
 6865
 6866
 6867
 6868
 6869
 6870
 6871
 6872
 6873
 6874
 6875
 6876
 6877
 6878
 6879
 6880
 6881
 6882
 6883
 6884
 6885
 6886
 6887
 6888
 6889
 6890
 6891
 6892
 6893
 6894
 6895
 6896
 6897
 6898
 6899
 6900
 6901
 6902
 6903
 6904
 6905
 6906
 6907
 6908
 6909
 6910
 6911
 6912
 6913
 6914
 6915
 6916
 6917
 6918
 6919
 6920
 6921
 6922
 6923
 6924
 6925
 6926
 6927
 6928
 6929
 6930
 6931
 6932
 6933
 6934
 6935
 6936
 6937
 6938
 6939
 6940
 6941
 6942
 6943
 6944
 6945
 6946
 6947
 6948
 6949
 6950
 6951
 6952
 6953
 6954
 6955
 6956
 6957
 6958
 6959
 6960
 6961
 6962
 6963
 6964
 6965
 6966
 6967
 6968
 6969
 6970
 6971
 6972
 6973
 6974
 6975
 6976
 6977
 6978
 6979
 6980
 6981
 6982
 6983
 6984
 6985
 6986
 6987
 6988
 6989
 6990
 6991
 6992
 6993
 6994
 6995
 6996
 6997
 6998
 6999
 7000
 7001
 7002
 7003
 7004
 7005
 7006
 7007
 7008
 7009
 7010
 7011
 7012
 7013
 7014
 7015
 7016
 7017
 7018
 7019
 7020
 7021
 7022
 7023
 7024
 7025
 7026
 7027
 7028
 7029
 7030
 7031
 7032
 7033
 7034
 7035
 7036
 7037
 7038
 7039
 7040
 7041
 7042
 7043
 7044
 7045
 7046
 7047
 7048
 7049
 7050
 7051
 7052
 7053
 7054
 7055
 7056
 7057
 7058
 7059
 7060
 7061
 7062
 7063
 7064
 7065
 7066
 7067
 7068
 7069
 7070
 7071
 7072
 7073
 7074
 7075
 7076
 7077
 7078
 7079
 7080
 7081
 7082
 7083
 7084
 7085
 7086
 7087
 7088
 7089
 7090
 7091
 7092
 7093
 7094
 7095
 7096
 7097
 7098
 7099
 7100
 7101
 7102
 7103
 7104
 7105
 7106
 7107
 7108
 7109
 7110
 7111
 7112
 7113
 7114
 7115
 7116
 7117
 7118
 7119
 7120
 7121
 7122
 7123
 7124
 7125
 7126
 7127
 7128
 7129
 7130
 7131
 7132
 7133
 7134
 7135
 7136
 7137
 7138
 7139
 7140
 7141
 7142
 7143
 7144
 7145
 7146
 7147
 7148
 7149
 7150
 7151
 7152
 7153
 7154
 7155
 7156
 7157
 7158
 7159
 7160
 7161
 7162
 7163
 7164
 7165
 7166
 7167
 7168
 7169
 7170
 7171
 7172
 7173
 7174
 7175
 7176
 7177
 7178
 7179
 7180
 7181
 7182
 7183
 7184
 7185
 7186
 7187
 7188
 7189
 7190
 7191
 7192
 7193
 7194
 7195
 7196
 7197
 7198
 7199
 7200
 7201
 7202
 7203
 7204
 7205
 7206
 7207
 7208
 7209
 7210
 7211
 7212
 7213
 7214
 7215
 7216
 7217
 7218
 7219
 7220
 7221
 7222
 7223
 7224
 7225
 7226
 7227
 7228
 7229
 7230
 7231
 7232
 7233
 7234
 7235
 7236
 7237
 7238
 7239
 7240
 7241
 7242
 7243
 7244
 7245
 7246
 7247
 7248
 7249
 7250
 7251
 7252
 7253
 7254
 7255
 7256
 7257
 7258
 7259
 7260
 7261
 7262
 7263
 7264
 7265
 7266
 7267
 7268
 7269
 7270
 7271
 7272
 7273
 7274
 7275
 7276
 7277
 7278
 7279
 7280
 7281
 7282
 7283
 7284
 7285
 7286
 7287
 7288
 7289
 7290
 7291
 7292
 7293
 7294
 7295
 7296
 7297
 7298
 7299
 7300
 7301
 7302
 7303
 7304
 7305
 7306
 7307
 7308
 7309
 7310
 7311
 7312
 7313
 7314
 7315
 7316
 7317
 7318
 7319
 7320
 7321
 7322
 7323
 7324
 7325
 7326
 7327
 7328
 7329
 7330
 7331
 7332
 7333
 7334
 7335
 7336
 7337
 7338
 7339
 7340
 7341
 7342
 7343
 7344
 7345
 7346
 7347
 7348
 7349
 7350
 7351
 7352
 7353
 7354
 7355
 7356
 7357
 7358
 7359
 7360
 7361
 7362
 7363
 7364
 7365
 7366
 7367
 7368
 7369
 7370
 7371
 7372
 7373
 7374
 7375
 7376
 7377
 7378
 7379
 7380
 7381
 7382
 7383
 7384
 7385
 7386
 7387
 7388
 7389
 7390
 7391
 7392
 7393
 7394
 7395
 7396
 7397
 7398
 7399
 7400
 7401
 7402
 7403
 7404
 7405
 7406
 7407
 7408
 7409
 7410
 7411
 7412
 7413
 7414
 7415
 7416
 7417
 7418
 7419
 7420
 7421
 7422
 7423
 7424
 7425
 7426
 7427
 7428
 7429
 7430
 7431
 7432
 7433
 7434
 7435
 7436
 7437
 7438
 7439
 7440
 7441
 7442
 7443
 7444
 7445
 7446
 7447
 7448
 7449
 7450
 7451
 7452
 7453
 7454
 7455
 7456
 7457
 7458
 7459
 7460
 7461
 7462
 7463
 7464
 7465
 7466
 7467
 7468
 7469
 7470
 7471
 7472
 7473
 7474
 7475
 7476
 7477
 7478
 7479
 7480
 7481
 7482
 7483
 7484
 7485
 7486
 7487
 7488
 7489
 7490
 7491
 7492
 7493
 7494
 7495
 7496
 7497
 7498
 7499
 7500
 7501
 7502
 7503
 7504
 7505
 7506
 7507
 7508
 7509
 7510
 7511
 7512
 7513
 7514
 7515
 7516
 7517
 7518
 7519
 7520
 7521
 7522
 7523
 7524
 7525
 7526
 7527
 7528
 7529
 7530
 7531
 7532
 7533
 7534
 7535
 7536
 7537
 7538
 7539
 7540
 7541
 7542
 7543
 7544
 7545
 7546
 7547
 7548
 7549
 7550
 7551
 7552
 7553
 7554
 7555
 7556
 7557
 7558
 7559
 7560
 7561
 7562
 7563
 7564
 7565
 7566
 7567
 7568
 7569
 7570
 7571
 7572
 7573
 7574
 7575
 7576
 7577
 7578
 7579
 7580
 7581
 7582
 7583
 7584
 7585
 7586
 7587
 7588
 7589
 7590
 7591
 7592
 7593
 7594
 7595
 7596
 7597
 7598
 7599
 7600
 7601
 7602
 7603
 7604
 7605
 7606
 7607
 7608
 7609
 7610
 7611
 7612
 7613
 7614
 7615
 7616
 7617
 7618
 7619
 7620
 7621
 7622
 7623
 7624
 7625
 7626
 7627
 7628
 7629
 7630
 7631
 7632
 7633
 7634
 7635
 7636
 7637
 7638
 7639
 7640
 7641
 7642
 7643
 7644
 7645
 7646
 7647
 7648
 7649
 7650
 7651
 7652
 7653
 7654
 7655
 7656
 7657
 7658
 7659
 7660
 7661
 7662
 7663
 7664
 7665
 7666
 7667
 7668
 7669
 7670
 7671
 7672
 7673
 7674
 7675
 7676
 7677
 7678
 7679
 7680
 7681
 7682
 7683
 7684
 7685
 7686
 7687
 7688
 7689
 7690
 7691
 7692
 7693
 7694
 7695
 7696
 7697
 7698
 7699
 7700
 7701
 7702
 7703
 7704
 7705
 7706
 7707
 7708
 7709
 7710
 7711
 7712
 7713
 7714
 7715
 7716
 7717
 7718
 7719
 7720
 7721
 7722
 7723
 7724
 7725
 7726
 7727
 7728
 7729
 7730
 7731
 7732
 7733
 7734
 7735
 7736
 7737
 7738
 7739
 7740
 7741
 7742
 7743
 7744
 7745
 7746
 7747
 7748
 7749
 7750
 7751
 7752
 7753
 7754
 7755
 7756
 7757
 7758
 7759
 7760
 7761
 7762
 7763
 7764
 7765
 7766
 7767
 7768
 7769
 7770
 7771
 7772
 7773
 7774
 7775
 7776
 7777
 7778
 7779
 7780
 7781
 7782
 7783
 7784
 7785
 7786
 7787
 7788
 7789
 7790
 7791
 7792
 7793
 7794
 7795
 7796
 7797
 7798
 7799
 7800
 7801
 7802
 7803
 7804
 7805
 7806
 7807
 7808
 7809
 7810
 7811
 7812
 7813
 7814
 7815
 7816
 7817
 7818
 7819
 7820
 7821
 7822
 7823
 7824
 7825
 7826
 7827
 7828
 7829
 7830
 7831
 7832
 7833
 7834
 7835
 7836
 7837
 7838
 7839
 7840
 7841
 7842
 7843
 7844
 7845
 7846
 7847
 7848
 7849
 7850
 7851
 7852
 7853
 7854
 7855
 7856
 7857
 7858
 7859
 7860
 7861
 7862
 7863
 7864
 7865
 7866
 7867
 7868
 7869
 7870
 7871
 7872
 7873
 7874
 7875
 7876
 7877
 7878
 7879
 7880
 7881
 7882
 7883
 7884
 7885
 7886
 7887
 7888
 7889
 7890
 7891
 7892
 7893
 7894
 7895
 7896
 7897
 7898
 7899
 7900
 7901
 7902
 7903
 7904
 7905
 7906
 7907
 7908
 7909
 7910
 7911
 7912
 7913
 7914
 7915
 7916
 7917
 7918
 7919
 7920
 7921
 7922
 7923
 7924
 7925
 7926
 7927
 7928
 7929
 7930
 7931
 7932
 7933
 7934
 7935
 7936
 7937
 7938
 7939
 7940
 7941
 7942
 7943
 7944
 7945
 7946
 7947
 7948
 7949
 7950
 7951
 7952
 7953
 7954
 7955
 7956
 7957
 7958
 7959
 7960
 7961
 7962
 7963
 7964
 7965
 7966
 7967
 7968
 7969
 7970
 7971
 7972
 7973
 7974
 7975
 7976
 7977
 7978
 7979
 7980
 7981
 7982
 7983
 7984
 7985
 7986
 7987
 7988
 7989
 7990
 7991
 7992
 7993
 7994
 7995
 7996
 7997
 7998
 7999
 8000
 8001
 8002
 8003
 8004
 8005
 8006
 8007
 8008
 8009
 8010
 8011
 8012
 8013
 8014
 8015
 8016
 8017
 8018
 8019
 8020
 8021
 8022
 8023
 8024
 8025
 8026
 8027
 8028
 8029
 8030
 8031
 8032
 8033
 8034
 8035
 8036
 8037
 8038
 8039
 8040
 8041
 8042
 8043
 8044
 8045
 8046
 8047
 8048
 8049
 8050
 8051
 8052
 8053
 8054
 8055
 8056
 8057
 8058
 8059
 8060
 8061
 8062
 8063
 8064
 8065
 8066
 8067
 8068
 8069
 8070
 8071
 8072
 8073
 8074
 8075
 8076
 8077
 8078
 8079
 8080
 8081
 8082
 8083
 8084
 8085
 8086
 8087
 8088
 8089
 8090
 8091
 8092
 8093
 8094
 8095
 8096
 8097
 8098
 8099
 8100
 8101
 8102
 8103
 8104
 8105
 8106
 8107
 8108
 8109
 8110
 8111
 8112
 8113
 8114
 8115
 8116
 8117
 8118
 8119
 8120
 8121
 8122
 8123
 8124
 8125
 8126
 8127
 8128
 8129
 8130
 8131
 8132
 8133
 8134
 8135
 8136
 8137
 8138
 8139
 8140
 8141
 8142
 8143
 8144
 8145
 8146
 8147
 8148
 8149
 8150
 8151
 8152
 8153
 8154
 8155
 8156
 8157
 8158
 8159
 8160
 8161
 8162
 8163
 8164
 8165
 8166
 8167
 8168
 8169
 8170
 8171
 8172
 8173
 8174
 8175
 8176
 8177
 8178
 8179
 8180
 8181
 8182
 8183
 8184
 8185
 8186
 8187
 8188
 8189
 8190
 8191
 8192
 8193
 8194
 8195
 8196
 8197
 8198
 8199
 8200
 8201
 8202
 8203
 8204
 8205
 8206
 8207
 8208
 8209
 8210
 8211
 8212
 8213
 8214
 8215
 8216
 8217
 8218
 8219
 8220
 8221
 8222
 8223
 8224
 8225
 8226
 8227
 8228
 8229
 8230
 8231
 8232
 8233
 8234
 8235
 8236
 8237
 8238
 8239
 8240
 8241
 8242
 8243
 8244
 8245
 8246
 8247
 8248
 8249
 8250
 8251
 8252
 8253
 8254
 8255
 8256
 8257
 8258
 8259
 8260
 8261
 8262
 8263
 8264
 8265
 8266
 8267
 8268
 8269
 8270
 8271
 8272
 8273
 8274
 8275
 8276
 8277
 8278
 8279
 8280
 8281
 8282
 8283
 8284
 8285
 8286
 8287
 8288
 8289
 8290
 8291
 8292
 8293
 8294
 8295
 8296
 8297
 8298
 8299
 8300
 8301
 8302
 8303
 8304
 8305
 8306
 8307
 8308
 8309
 8310
 8311
 8312
 8313
 8314
 8315
 8316
 8317
 8318
 8319
 8320
 8321
 8322
 8323
 8324
 8325
 8326
 8327
 8328
 8329
 8330
 8331
 8332
 8333
 8334
 8335
 8336
 8337
 8338
 8339
 8340
 8341
 8342
 8343
 8344
 8345
 8346
 8347
 8348
 8349
 8350
 8351
 8352
 8353
 8354
 8355
 8356
 8357
 8358
 8359
 8360
 8361
 8362
 8363
 8364
 8365
 8366
 8367
 8368
 8369
 8370
 8371
 8372
 8373
 8374
 8375
 8376
 8377
 8378
 8379
 8380
 8381
 8382
 8383
 8384
 8385
 8386
 8387
 8388
 8389
 8390
 8391
 8392
 8393
 8394
 8395
 8396
 8397
 8398
 8399
 8400
 8401
 8402
 8403
 8404
 8405
 8406
 8407
 8408
 8409
 8410
 8411
 8412
 8413
 8414
 8415
 8416
 8417
 8418
 8419
 8420
 8421
 8422
 8423
 8424
 8425
 8426
 8427
 8428
 8429
 8430
 8431
 8432
 8433
 8434
 8435
 8436
 8437
 8438
 8439
 8440
 8441
 8442
 8443
 8444
 8445
 8446
 8447
 8448
 8449
 8450
 8451
 8452
 8453
 8454
 8455
 8456
 8457
 8458
 8459
 8460
 8461
 8462
 8463
 8464
 8465
 8466
 8467
 8468
 8469
 8470
 8471
 8472
 8473
 8474
 8475
 8476
 8477
 8478
 8479
 8480
 8481
 8482
 8483
 8484
 8485
 8486
 8487
 8488
 8489
 8490
 8491
 8492
 8493
 8494
 8495
 8496
 8497
 8498
 8499
 8500
 8501
 8502
 8503
 8504
 8505
 8506
 8507
 8508
 8509
 8510
 8511
 8512
 8513
 8514
 8515
 8516
 8517
 8518
 8519
 8520
 8521
 8522
 8523
 8524
 8525
 8526
 8527
 8528
 8529
 8530
 8531
 8532
 8533
 8534
 8535
 8536
 8537
 8538
 8539
 8540
 8541
 8542
 8543
 8544
 8545
 8546
 8547
 8548
 8549
 8550
 8551
 8552
 8553
 8554
 8555
 8556
 8557
 8558
 8559
 8560
 8561
 8562
 8563
 8564
 8565
 8566
 8567
 8568
 8569
 8570
 8571
 8572
 8573
 8574
 8575
 8576
 8577
 8578
 8579
 8580
 8581
 8582
 8583
 8584
 8585
 8586
 8587
 8588
 8589
 8590
 8591
 8592
 8593
 8594
 8595
 8596
 8597
 8598
 8599
 8600
 8601
 8602
 8603
 8604
 8605
 8606
 8607
 8608
 8609
 8610
 8611
 8612
 8613
 8614
 8615
 8616
 8617
 8618
 8619
 8620
 8621
 8622
 8623
 8624
 8625
 8626
 8627
 8628
 8629
 8630
 8631
 8632
 8633
 8634
 8635
 8636
 8637
 8638
 8639
 8640
 8641
 8642
 8643
 8644
 8645
 8646
 8647
 8648
 8649
 8650
 8651
 8652
 8653
 8654
 8655
 8656
 8657
 8658
 8659
 8660
 8661
 8662
 8663
 8664
 8665
 8666
 8667
 8668
 8669
 8670
 8671
 8672
 8673
 8674
 8675
 8676
 8677
 8678
 8679
 8680
 8681
 8682
 8683
 8684
 8685
 8686
 8687
 8688
 8689
 8690
 8691
 8692
 8693
 8694
 8695
 8696
 8697
 8698
 8699
 8700
 8701
 8702
 8703
 8704
 8705
 8706
 8707
 8708
 8709
 8710
 8711
 8712
 8713
 8714
 8715
 8716
 8717
 8718
 8719
 8720
 8721
 8722
 8723
 8724
 8725
 8726
 8727
 8728
 8729
 8730
 8731
 8732
 8733
 8734
 8735
 8736
 8737
 8738
 8739
 8740
 8741
 8742
 8743
 8744
 8745
 8746
 8747
 8748
 8749
 8750
 8751
 8752
 8753
 8754
 8755
 8756
 8757
 8758
 8759
 8760
 8761
 8762
 8763
 8764
 8765
 8766
 8767
 8768
 8769
 8770
 8771
 8772
 8773
 8774
 8775
 8776
 8777
 8778
 8779
 8780
 8781
 8782
 8783
 8784
 8785
 8786
 8787
 8788
 8789
 8790
 8791
 8792
 8793
 8794
 8795
 8796
 8797
 8798
 8799
 8800
 8801
 8802
 8803
 8804
 8805
 8806
 8807
 8808
 8809
 8810
 8811
 8812
 8813
 8814
 8815
 8816
 8817
 8818
 8819
 8820
 8821
 8822
 8823
 8824
 8825
 8826
 8827
 8828
 8829
 8830
 8831
 8832
 8833
 8834
 8835
 8836
 8837
 8838
 8839
 8840
 8841
 8842
 8843
 8844
 8845
 8846
 8847
 8848
 8849
 8850
 8851
 8852
 8853
 8854
 8855
 8856
 8857
 8858
 8859
 8860
 8861
 8862
 8863
 8864
 8865
 8866
 8867
 8868
 8869
 8870
 8871
 8872
 8873
 8874
 8875
 8876
 8877
 8878
 8879
 8880
 8881
 8882
 8883
 8884
 8885
 8886
 8887
 8888
 8889
 8890
 8891
 8892
 8893
 8894
 8895
 8896
 8897
 8898
 8899
 8900
 8901
 8902
 8903
 8904
 8905
 8906
 8907
 8908
 8909
 8910
 8911
 8912
 8913
 8914
 8915
 8916
 8917
 8918
 8919
 8920
 8921
 8922
 8923
 8924
 8925
 8926
 8927
 8928
 8929
 8930
 8931
 8932
 8933
 8934
 8935
 8936
 8937
 8938
 8939
 8940
 8941
 8942
 8943
 8944
 8945
 8946
 8947
 8948
 8949
 8950
 8951
 8952
 8953
 8954
 8955
 8956
 8957
 8958
 8959
 8960
 8961
 8962
 8963
 8964
 8965
 8966
 8967
 8968
 8969
 8970
 8971
 8972
 8973
 8974
 8975
 8976
 8977
 8978
 8979
 8980
 8981
 8982
 8983
 8984
 8985
 8986
 8987
 8988
 8989
 8990
 8991
 8992
 8993
 8994
 8995
 8996
 8997
 8998
 8999
 9000
 9001
 9002
 9003
 9004
 9005
 9006
 9007
 9008
 9009
 9010
 9011
 9012
 9013
 9014
 9015
 9016
 9017
 9018
 9019
 9020
 9021
 9022
 9023
 9024
 9025
 9026
 9027
 9028
 9029
 9030
 9031
 9032
 9033
 9034
 9035
 9036
 9037
 9038
 9039
 9040
 9041
 9042
 9043
 9044
 9045
 9046
 9047
 9048
 9049
 9050
 9051
 9052
 9053
 9054
 9055
 9056
 9057
 9058
 9059
 9060
 9061
 9062
 9063
 9064
 9065
 9066
 9067
 9068
 9069
 9070
 9071
 9072
 9073
 9074
 9075
 9076
 9077
 9078
 9079
 9080
 9081
 9082
 9083
 9084
 9085
 9086
 9087
 9088
 9089
 9090
 9091
 9092
 9093
 9094
 9095
 9096
 9097
 9098
 9099
 9100
 9101
 9102
 9103
 9104
 9105
 9106
 9107
 9108
 9109
 9110
 9111
 9112
 9113
 9114
 9115
 9116
 9117
 9118
 9119
 9120
 9121
 9122
 9123
 9124
 9125
 9126
 9127
 9128
 9129
 9130
 9131
 9132
 9133
 9134
 9135
 9136
 9137
 9138
 9139
 9140
 9141
 9142
 9143
 9144
 9145
 9146
 9147
 9148
 9149
 9150
 9151
 9152
 9153
 9154
 9155
 9156
 9157
 9158
 9159
 9160
 9161
 9162
 9163
 9164
 9165
 9166
 9167
 9168
 9169
 9170
 9171
 9172
 9173
 9174
 9175
 9176
 9177
 9178
 9179
 9180
 9181
 9182
 9183
 9184
 9185
 9186
 9187
 9188
 9189
 9190
 9191
 9192
 9193
 9194
 9195
 9196
 9197
 9198
 9199
 9200
 9201
 9202
 9203
 9204
 9205
 9206
 9207
 9208
 9209
 9210
 9211
 9212
 9213
 9214
 9215
 9216
 9217
 9218
 9219
 9220
 9221
 9222
 9223
 9224
 9225
 9226
 9227
 9228
 9229
 9230
 9231
 9232
 9233
 9234
 9235
 9236
 9237
 9238
 9239
 9240
 9241
 9242
 9243
 9244
 9245
 9246
 9247
 9248
 9249
 9250
 9251
 9252
 9253
 9254
 9255
 9256
 9257
 9258
 9259
 9260
 9261
 9262
 9263
 9264
 9265
 9266
 9267
 9268
 9269
 9270
 9271
 9272
 9273
 9274
 9275
 9276
 9277
 9278
 9279
 9280
 9281
 9282
 9283
 9284
 9285
 9286
 9287
 9288
 9289
 9290
 9291
 9292
 9293
 9294
 9295
 9296
 9297
 9298
 9299
 9300
 9301
 9302
 9303
 9304
 9305
 9306
 9307
 9308
 9309
 9310
 9311
 9312
 9313
 9314
 9315
 9316
 9317
 9318
 9319
 9320
 9321
 9322
 9323
 9324
 9325
 9326
 9327
 9328
 9329
 9330
 9331
 9332
 9333
 9334
 9335
 9336
 9337
 9338
 9339
 9340
 9341
 9342
 9343
 9344
 9345
 9346
 9347
 9348
 9349
 9350
 9351
 9352
 9353
 9354
 9355
 9356
 9357
 9358
 9359
 9360
 9361
 9362
 9363
 9364
 9365
 9366
 9367
 9368
 9369
 9370
 9371
 9372
 9373
 9374
 9375
 9376
 9377
 9378
 9379
 9380
 9381
 9382
 9383
 9384
 9385
 9386
 9387
 9388
 9389
 9390
 9391
 9392
 9393
 9394
 9395
 9396
 9397
 9398
 9399
 9400
 9401
 9402
 9403
 9404
 9405
 9406
 9407
 9408
 9409
 9410
 9411
 9412
 9413
 9414
 9415
 9416
 9417
 9418
 9419
 9420
 9421
 9422
 9423
 9424
 9425
 9426
 9427
 9428
 9429
 9430
 9431
 9432
 9433
 9434
 9435
 9436
 9437
 9438
 9439
 9440
 9441
 9442
 9443
 9444
 9445
 9446
 9447
 9448
 9449
 9450
 9451
 9452
 9453
 9454
 9455
 9456
 9457
 9458
 9459
 9460
 9461
 9462
 9463
 9464
 9465
 9466
 9467
 9468
 9469
 9470
 9471
 9472
 9473
 9474
 9475
 9476
 9477
 9478
 9479
 9480
 9481
 9482
 9483
 9484
 9485
 9486
 9487
 9488
 9489
 9490
 9491
 9492
 9493
 9494
 9495
 9496
 9497
 9498
 9499
 9500
 9501
 9502
 9503
 9504
 9505
 9506
 9507
 9508
 9509
 9510
 9511
 9512
 9513
 9514
 9515
 9516
 9517
 9518
 9519
 9520
 9521
 9522
 9523
 9524
 9525
 9526
 9527
 9528
 9529
 9530
 9531
 9532
 9533
 9534
 9535
 9536
 9537
 9538
 9539
 9540
 9541
 9542
 9543
 9544
 9545
 9546
 9547
 9548
 9549
 9550
 9551
 9552
 9553
 9554
 9555
 9556
 9557
 9558
 9559
 9560
 9561
 9562
 9563
 9564
 9565
 9566
 9567
 9568
 9569
 9570
 9571
 9572
 9573
 9574
 9575
 9576
 9577
 9578
 9579
 9580
 9581
 9582
 9583
 9584
 9585
 9586
 9587
 9588
 9589
 9590
 9591
 9592
 9593
 9594
 9595
 9596
 9597
 9598
 9599
 9600
 9601
 9602
 9603
 9604
 9605
 9606
 9607
 9608
 9609
 9610
 9611
 9612
 9613
 9614
 9615
 9616
 9617
 9618
 9619
 9620
 9621
 9622
 9623
 9624
 9625
 9626
 9627
 9628
 9629
 9630
 9631
 9632
 9633
 9634
 9635
 9636
 9637
 9638
 9639
 9640
 9641
 9642
 9643
 9644
 9645
 9646
 9647
 9648
 9649
 9650
 9651
 9652
 9653
 9654
 9655
 9656
 9657
 9658
 9659
 9660
 9661
 9662
 9663
 9664
 9665
 9666
 9667
 9668
 9669
 9670
 9671
 9672
 9673
 9674
 9675
 9676
 9677
 9678
 9679
 9680
 9681
 9682
 9683
 9684
 9685
 9686
 9687
 9688
 9689
 9690
 9691
 9692
 9693
 9694
 9695
 9696
 9697
 9698
 9699
 9700
 9701
 9702
 9703
 9704
 9705
 9706
 9707
 9708
 9709
 9710
 9711
 9712
 9713
 9714
 9715
 9716
 9717
 9718
 9719
 9720
 9721
 9722
 9723
 9724
 9725
 9726
 9727
 9728
 9729
 9730
 9731
 9732
 9733
 9734
 9735
 9736
 9737
 9738
 9739
 9740
 9741
 9742
 9743
 9744
 9745
 9746
 9747
 9748
 9749
 9750
 9751
 9752
 9753
 9754
 9755
 9756
 9757
 9758
 9759
 9760
 9761
 9762
 9763
 9764
 9765
 9766
 9767
 9768
 9769
 9770
 9771
 9772
 9773
 9774
 9775
 9776
 9777
 9778
 9779
 9780
 9781
 9782
 9783
 9784
 9785
 9786
 9787
 9788
 9789
 9790
 9791
 9792
 9793
 9794
 9795
 9796
 9797
 9798
 9799
 9800
 9801
 9802
 9803
 9804
 9805
 9806
 9807
 9808
 9809
 9810
 9811
 9812
 9813
 9814
 9815
 9816
 9817
 9818
 9819
 9820
 9821
 9822
 9823
 9824
 9825
 9826
 9827
 9828
 9829
 9830
 9831
 9832
 9833
 9834
 9835
 9836
 9837
 9838
 9839
 9840
 9841
 9842
 9843
 9844
 9845
 9846
 9847
 9848
 9849
 9850
 9851
 9852
 9853
 9854
 9855
 9856
 9857
 9858
 9859
 9860
 9861
 9862
 9863
 9864
 9865
 9866
 9867
 9868
 9869
 9870
 9871
 9872
 9873
 9874
 9875
 9876
 9877
 9878
 9879
 9880
 9881
 9882
 9883
 9884
 9885
 9886
 9887
 9888
 9889
 9890
 9891
 9892
 9893
 9894
 9895
 9896
 9897
 9898
 9899
 9900
 9901
 9902
 9903
 9904
 9905
 9906
 9907
 9908
 9909
 9910
 9911
 9912
 9913
 9914
 9915
 9916
 9917
 9918
 9919
 9920
 9921
 9922
 9923
 9924
 9925
 9926
 9927
 9928
 9929
 9930
 9931
 9932
 9933
 9934
 9935
 9936
 9937
 9938
 9939
 9940
 9941
 9942
 9943
 9944
 9945
 9946
 9947
 9948
 9949
 9950
 9951
 9952
 9953
 9954
 9955
 9956
 9957
 9958
 9959
 9960
 9961
 9962
 9963
 9964
 9965
 9966
 9967
 9968
 9969
 9970
 9971
 9972
 9973
 9974
 9975
 9976
 9977
 9978
 9979
 9980
 9981
 9982
 9983
 9984
 9985
 9986
 9987
 9988
 9989
 9990
 9991
 9992
 9993
 9994
 9995
 9996
 9997
 9998
 9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10098
10099
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10110
10111
10112
10113
10114
10115
10116
10117
10118
10119
10120
10121
10122
10123
10124
10125
10126
10127
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
10232
10233
10234
10235
10236
10237
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10472
10473
10474
10475
10476
10477
10478
10479
10480
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603
10604
10605
10606
10607
10608
10609
10610
10611
10612
10613
10614
10615
10616
10617
10618
10619
10620
10621
10622
10623
10624
10625
10626
10627
10628
10629
10630
10631
10632
10633
10634
10635
10636
10637
10638
10639
10640
10641
10642
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
10776
10777
10778
10779
10780
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10791
10792
10793
10794
10795
10796
10797
10798
10799
10800
10801
10802
10803
10804
10805
10806
10807
10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822
10823
10824
10825
10826
10827
10828
10829
10830
10831
10832
10833
10834
10835
10836
10837
10838
10839
10840
10841
10842
10843
10844
10845
10846
<PREDEFINED_ADA>

   <ASPECT id = "0" name = "Abstract_State" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Abstract_State'.

Annotate

There are three forms of this aspect (where ID is an identifier, and
ARG is a general expression).

`Annotate =&gt; ID'
Equivalent to `pragma Annotate (ID, Entity =&gt; Name);'

`Annotate =&gt; (ID)'
Equivalent to `pragma Annotate (ID, Entity =&gt; Name);'

`Annotate =&gt; (ID ,ID {, ARG})'
Equivalent to `pragma Annotate (ID, ID {, ARG}, Entity =&gt; Name);'
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Ada_2005" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to the one argument form of pragma `Ada_2005'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Ada_2012" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to the one argument form of pragma `Ada_2012'.
      </DOC>
   </ASPECT>

   <ASPECT id = "2/3" name = "Address" origin = "Ada RM" category = "unknown">
      <DOC>
Machine address of an entity. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "3/3" name = "Alignment" origin = "Ada RM" category = "unknown">
      <DOC>
Alignment of an object. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "4/3" name = "Alignment" origin = "Ada RM" category = "unknown">
      <DOC>
Alignment of a subtype. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "5/3" name = "All_Calls_Remote" origin = "Ada RM" category = "unknown">
      <DOC>
All remote procedure calls should use the Partition
Communication Subsystem, even if they are local. See E.2.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Async_Readers" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Async_Readers'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Async_Writers" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Async_Writers'.
      </DOC>
   </ASPECT>

   <ASPECT id = "6/3" name = "Asynchronous" origin = "Ada RM" category = "unknown">
      <DOC>
Remote procedure calls are asynchronous; the caller continues
without waiting for the call to return. See E.4.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "7/3" name = "Atomic" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that a type, object, or component is atomic. See C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "8/3" name = "Atomic_Components" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that the components of an array type or object are
atomic. See C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "9/3" name = "Attach_Handler" origin = "Ada RM" category = "unknown">
      <DOC>
Protected procedure is attached to an interrupt. See C.3.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "10/3" name = "Bit_Order" origin = "Ada RM" category = "unknown">
      <DOC>
Order of bit numbering in a record_representation_clause. See
      </DOC>
   </ASPECT>

   <ASPECT id = "15/3" name = "CPU" origin = "Ada RM" category = "unknown">
      <DOC>
Processor on which a given task should run. See D.16.
      </DOC>
   </ASPECT>

   <ASPECT id = "11/3" name = "Coding" origin = "Ada RM" category = "unknown">
      <DOC>
Internal representation of enumeration literals. Specified by
an enumeration_representation_clause, not by an
aspect_specification. See 13.4.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Compiler_Unit" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Compiler_Unit'.
      </DOC>
   </ASPECT>

   <ASPECT id = "12/3" name = "Component_Size" origin = "Ada RM" category = "unknown">
      <DOC>
Size in bits of a component of an array type. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "13/3" name = "Constant_Indexing" origin = "Ada RM" category = "unknown">
      <DOC>
Defines function(s) to implement user-defined
indexed_components. See 4.1.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Contract_Cases" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Contract_Cases', the sequence of
clauses being enclosed in parentheses so that syntactically it is an
aggregate.
      </DOC>
   </ASPECT>

   <ASPECT id = "14/3" name = "Convention" origin = "Ada RM" category = "unknown">
      <DOC>
Calling convention or other convention used for interfacing to
other languages. See B.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "16/3" name = "Default_Component_Value" origin = "Ada RM" category = "unknown">
      <DOC>
Default value for the components of an array-of-scalar
subtype. See 3.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "17/3" name = "Default_Iterator" origin = "Ada RM" category = "unknown">
      <DOC>
Default iterator to be used in for loops. See 5.5.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "18/3" name = "Default_Storage_Pool" origin = "Ada RM" category = "unknown">
      <DOC>
Default storage pool for a generic instance. See 13.11.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "19/3" name = "Default_Value" origin = "Ada RM" category = "unknown">
      <DOC>
Default value for a scalar subtype. See 3.5.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Depends" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Depends'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Dimension" origin = "GNAT RM" category = "unknown">
      <DOC>
The `Dimension' aspect is used to specify the dimensions of a given
subtype of a dimensioned numeric type. The aspect also specifies a
symbol used when doing formatted output of dimensioned quantities. The
syntax is:

with Dimension =&gt;
([Symbol =&gt;] SYMBOL, DIMENSION_VALUE {, DIMENSION_Value})

SYMBOL ::= STRING_LITERAL | CHARACTER_LITERAL

DIMENSION_VALUE ::=
RATIONAL
| others               =&gt; RATIONAL
| DISCRETE_CHOICE_LIST =&gt; RATIONAL

RATIONAL ::= [-] NUMERIC_LITERAL [/ NUMERIC_LITERAL]

This aspect can only be applied to a subtype whose parent type has a
`Dimension_Systen' aspect. The aspect must specify values for all
dimensions of the system. The rational values are the powers of the
corresponding dimensions that are used by the compiler to verify that
physical (numeric) computations are dimensionally consistent. For
example, the computation of a force must result in dimensions (L =&gt; 1,
M =&gt; 1, T =&gt; -2).  For further examples of the usage of this aspect,
see package `System.Dim.Mks'.  Note that when the dimensioned type is
an integer type, then any dimension value must be an integer literal.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Dimension_System" origin = "GNAT RM" category = "unknown">
      <DOC>
The `Dimension_System' aspect is used to define a system of dimensions
that will be used in subsequent subtype declarations with `Dimension'
aspects that reference this system. The syntax is:

with Dimension_System =&gt; (DIMENSION {, DIMENSION});

DIMENSION ::= ([Unit_Name   =&gt;] IDENTIFIER,
[Unit_Symbol =&gt;] SYMBOL,
[Dim_Symbol  =&gt;] SYMBOL)

SYMBOL ::= CHARACTER_LITERAL | STRING_LITERAL

This aspect is applied to a type, which must be a numeric derived type
(typically a floating-point type), that will represent values within
the dimension system. Each `DIMENSION' corresponds to one particular
dimension. A maximum of 7 dimensions may be specified. `Unit_Name' is
the name of the dimension (for example `Meter'). `Unit_Symbol' is the
shorthand used for quantities of this dimension (for example `m' for
`Meter').  `Dim_Symbol' gives the identification within the dimension
system (typically this is a single letter, e.g. `L' standing for length
for unit name `Meter').  The `Unit_Symbol' is used in formatted output
of dimensioned quantities.  The `Dim_Symbol' is used in error messages
when numeric operations have inconsistent dimensions.

GNAT provides the standard definition of the International MKS
system in the run-time package `System.Dim.Mks'. You can easily define
similar packages for cgs units or British units, and define conversion
factors between values in different systems. The MKS system is
characterized by the following aspect:

type Mks_Type is new Long_Long_Float with
Dimension_System =&gt; (
(Unit_Name =&gt; Meter,    Unit_Symbol =&gt; 'm',   Dim_Symbol =&gt; 'L'),
(Unit_Name =&gt; Kilogram, Unit_Symbol =&gt; "kg",  Dim_Symbol =&gt; 'M'),
(Unit_Name =&gt; Second,   Unit_Symbol =&gt; 's',   Dim_Symbol =&gt; 'T'),
(Unit_Name =&gt; Ampere,   Unit_Symbol =&gt; 'A',   Dim_Symbol =&gt; 'I'),
(Unit_Name =&gt; Kelvin,   Unit_Symbol =&gt; 'K',   Dim_Symbol =&gt; ')',
(Unit_Name =&gt; Mole,     Unit_Symbol =&gt; "mol", Dim_Symbol =&gt; 'N'),
(Unit_Name =&gt; Candela,  Unit_Symbol =&gt; "cd",  Dim_Symbol =&gt; 'J'));

Note that in the above type definition, we use the symbol `@' to
represent a theta character (avoiding the use of extended Latin-1
characters in this context).

See section "Performing Dimensionality Analysis in GNAT" in the GNAT
Users Guide for detailed examples of use of the dimension system.
      </DOC>
   </ASPECT>

   <ASPECT id = "20/3" name = "Dispatching_Domain" origin = "Ada RM" category = "unknown">
      <DOC>
Domain (group of processors) on which a given task should run.
See D.16.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "21/3" name = "Dynamic_Predicate" origin = "Ada RM" category = "unknown">
      <DOC>
Condition that must hold true for objects of a given subtype;
the subtype is not static. See 3.2.4.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Effective_Reads" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Effective_Reads'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Effective_Writes" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Effective_Writes'.
      </DOC>
   </ASPECT>

   <ASPECT id = "22/3" name = "Elaborate_Body" origin = "Ada RM" category = "unknown">
      <DOC>
A given package must have a body, and that body is elaborated
immediately after the declaration. See 10.2.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "23/3" name = "Export" origin = "Ada RM" category = "unknown">
      <DOC>
Entity is exported to another language. See B.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "24/3" name = "External_Name" origin = "Ada RM" category = "unknown">
      <DOC>
Name used to identify an imported or exported entity. See
B.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "25/3" name = "External_Tag" origin = "Ada RM" category = "unknown">
      <DOC>
Unique identifier for a tagged type in streams. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Favor_Top_Level" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Favor_Top_Level'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Global" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Global'.
      </DOC>
   </ASPECT>

   <ASPECT id = "26/3" name = "Implicit_Dereference" origin = "Ada RM" category = "unknown">
      <DOC>
Mechanism for user-defined implicit .all. See 4.1.5.
      </DOC>
   </ASPECT>

   <ASPECT id = "27/3" name = "Import" origin = "Ada RM" category = "unknown">
      <DOC>
Entity is imported from another language. See B.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "28/3" name = "Independent" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that a type, object, or component is independently
addressable. See C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "29/3" name = "Independent_Components" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that the components of an array or record type, or an
array object, are independently addressable. See C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Initial_Condition" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Initial_Condition'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Initializes" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Initializes'.
      </DOC>
   </ASPECT>

   <ASPECT id = "30/3" name = "Inline" origin = "Ada RM" category = "unknown">
      <DOC>
For efficiency, Inline calls are requested for a subprogram.
See 6.3.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Inline_Always" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Inline_Always'.
      </DOC>
   </ASPECT>

   <ASPECT id = "31/3" name = "Input" origin = "Ada RM" category = "unknown">
      <DOC>
Function to read a value from a stream for a given type,
including any bounds and discriminants. See 13.13.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "32/3" name = "Interrupt_Handler" origin = "Ada RM" category = "unknown">
      <DOC>
Protected procedure may be attached to interrupts. See C.3.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "33/3" name = "Interrupt_Priority" origin = "Ada RM" category = "unknown">
      <DOC>
Priority of a task object or type, or priority of a protected
object or type; the priority is in the interrupt range. See
D.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Invariant" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Invariant'. It is a synonym for
the language defined aspect `Type_Invariant' except that it is
separately controllable using pragma `Assertion_Policy'.

Aspect Invariant'Class

This aspect is equivalent to pragma `Type_Invariant_Class'. It is a
synonym for the language defined aspect `Type_Invariant'Class' except
that it is separately controllable using pragma `Assertion_Policy'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Iterable" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is used in the GNAT-defined formal container packages, to
provide a light-weight mechanism for loops over such containers,
without the overhead imposed by the tampering checks of standard
Ada2012 iterators. The value of the aspect is a aggregate with four
named  components: First, Next, Has_Element, and Element. The following
is a typical example of use:

type List is private with
Iterable =&gt; (First        =&gt; First_Element,
Next         =&gt; Advance,
Has_Element  =&gt; Get_Element,
Element      =&gt; List_Element);

* The value denoted by `First' must denote a primitive operation of
the  container type that returns a Cursor, which must a be a type
declared in the container package.

* The value of `Next' is a primitive operation of the container type
that takes a cursor and yields a cursor.

* `Has_Element' is an operation that applies to a cursor a yields an
element of the container.

* `Element' is the type of the elements of the container type, and
thus the result of the function denoted by Has_Element.
      </DOC>
   </ASPECT>

   <ASPECT id = "34/3" name = "Iterator_Element" origin = "Ada RM" category = "unknown">
      <DOC>
Element type to be used for user-defined iterators. See
      </DOC>
   </ASPECT>

   <ASPECT id = "35/3" name = "Layout" origin = "Ada RM" category = "unknown">
      <DOC>
Layout of record components. Specified by a
record_representation_clause, not by an aspect_specification.
See 13.5.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "36/3" name = "Link_Name" origin = "Ada RM" category = "unknown">
      <DOC>
Linker symbol used to identify an imported or exported entity.
See B.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Linker_Section" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to an `Linker_Section' pragma.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Lock_Free" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Lock_Free'.
      </DOC>
   </ASPECT>

   <ASPECT id = "37/3" name = "Machine_Radix" origin = "Ada RM" category = "unknown">
      <DOC>
Radix (2 or 10) that is used to represent a decimal fixed
point type. See F.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "No_Elaboration_Code_All" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to a `pragma No_Elaboration_Code_All'
statement for a program unit.
      </DOC>
   </ASPECT>

   <ASPECT id = "38/3" name = "No_Return" origin = "Ada RM" category = "unknown">
      <DOC>
A procedure will not return normally. See 6.5.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Object_Size" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to an `Object_Size' attribute definition
clause.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Obsolescent" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to an `Obsolescent' pragma. Note that the
evaluation of this aspect happens at the point of occurrence, it is not
delayed until the freeze point.
      </DOC>
   </ASPECT>

   <ASPECT id = "39/3" name = "Output" origin = "Ada RM" category = "unknown">
      <DOC>
Procedure to write a value to a stream for a given type,
including any bounds and discriminants. See 13.13.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "40/3" name = "Pack" origin = "Ada RM" category = "unknown">
      <DOC>
Minimize storage when laying out records and arrays. See
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Part_Of" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Part_Of'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Persistent_BSS" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Persistent_BSS'.
      </DOC>
   </ASPECT>

   <ASPECT id = "41/3" name = "Post" origin = "Ada RM" category = "unknown">
      <DOC>
Postcondition; a condition that must hold true after a call.
See 6.1.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "42/3" name = "Post'Class" origin = "Ada RM" category = "unknown">
      <DOC>
Postcondition inherited on type derivation. See 6.1.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "43/3" name = "Pre" origin = "Ada RM" category = "unknown">
      <DOC>
Precondition; a condition that must hold true before a call.
See 6.1.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "44/3" name = "Pre'Class" origin = "Ada RM" category = "unknown">
      <DOC>
Precondition inherited on type derivation. See 6.1.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Predicate" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Predicate'. It is thus similar to
the language defined aspects `Dynamic_Predicate' and `Static_Predicate'
except that whether the resulting predicate is static or dynamic is
controlled by the form of the expression. It is also separately
controllable using pragma `Assertion_Policy'.
      </DOC>
   </ASPECT>

   <ASPECT id = "45/3" name = "Preelaborate" origin = "Ada RM" category = "unknown">
      <DOC>
Code execution during elaboration is avoided for a given
package. See 10.2.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Preelaborate_05" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Preelaborate_05'.
      </DOC>
   </ASPECT>

   <ASPECT id = "46/3" name = "Priority" origin = "Ada RM" category = "unknown">
      <DOC>
Priority of a task object or type, or priority of a protected
object or type; the priority is not in the interrupt range.
See D.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "47/3" name = "Pure" origin = "Ada RM" category = "unknown">
      <DOC>
Side effects are avoided in the subprograms of a given
package. See 10.2.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Pure_05" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Pure_05'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Pure_12" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Pure_12'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Pure_Function" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Pure_Function'.
      </DOC>
   </ASPECT>

   <ASPECT id = "48/3" name = "Read" origin = "Ada RM" category = "unknown">
      <DOC>
Procedure to read a value from a stream for a given type. See
      </DOC>
   </ASPECT>

   <ASPECT id = "49/3" name = "Record" origin = "Ada RM" category = "unknown">
      <DOC>
layout

See Layout. See 13.5.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Refined_Depends" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Refined_Depends'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Refined_Global" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Refined_Global'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Refined_Post" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Refined_Post'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Refined_State" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Refined_State'.
      </DOC>
   </ASPECT>

   <ASPECT id = "50/3" name = "Relative_Deadline" origin = "Ada RM" category = "unknown">
      <DOC>
Task parameter used in Earliest Deadline First Dispatching.
See D.2.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Remote_Access_Type" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Remote_Access_Type'.
      </DOC>
   </ASPECT>

   <ASPECT id = "51/3" name = "Remote_Call_Interface" origin = "Ada RM" category = "unknown">
      <DOC>
Subprograms in a given package may be used in remote procedure
calls. See E.2.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "52/3" name = "Remote_Types" origin = "Ada RM" category = "unknown">
      <DOC>
Types in a given package may be used in remote procedure
calls. See E.2.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "SPARK_Mode" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `SPARK_Mode' and may be specified
for either or both of the specification and body of a subprogram or
package.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Scalar_Storage_Order" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to a `Scalar_Storage_Order' attribute
definition clause.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Shared" origin = "GNAT RM" category = "unknown">
      <DOC>
This booleanaspect is equivalent to pragma `Shared', and is thus a
synonym for aspect `Atomic'.
      </DOC>
   </ASPECT>

   <ASPECT id = "53/3" name = "Shared_Passive" origin = "Ada RM" category = "unknown">
      <DOC>
A given package is used to represent shared memory in a
distributed system. See E.2.1.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Simple_Storage_Pool" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to a `Simple_Storage_Pool' attribute
definition clause.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Simple_Storage_Pool_Type" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Simple_Storage_Pool_Type'.
      </DOC>
   </ASPECT>

   <ASPECT id = "54/3" name = "Size" origin = "Ada RM" category = "unknown">
      <DOC>
Size in bits of an object. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "55/3" name = "Size" origin = "Ada RM" category = "unknown">
      <DOC>
Size in bits of a subtype. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "56/3" name = "Small" origin = "Ada RM" category = "unknown">
      <DOC>
Scale factor for a fixed point type. See 3.5.10.
      </DOC>
   </ASPECT>

   <ASPECT id = "57/3" name = "Static_Predicate" origin = "Ada RM" category = "unknown">
      <DOC>
Condition that must hold true for objects of a given subtype;
the subtype may be static. See 3.2.4.
      </DOC>
   </ASPECT>

   <ASPECT id = "58/3" name = "Storage_Pool" origin = "Ada RM" category = "unknown">
      <DOC>
Pool of memory from which new will allocate for a given access
type. See 13.11.
      </DOC>
   </ASPECT>

   <ASPECT id = "59/3" name = "Storage_Size" origin = "Ada RM" category = "unknown">
      <DOC>
Sets memory size for allocations for an access type. See
      </DOC>
   </ASPECT>

   <ASPECT id = "60/3" name = "Storage_Size" origin = "Ada RM" category = "unknown">
      <DOC>
Size in storage elements reserved for a task type or single
task object. See 13.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "61/3" name = "Stream_Size" origin = "Ada RM" category = "unknown">
      <DOC>
Size in bits used to represent elementary objects in a stream.
See 13.13.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Suppress_Debug_Info" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Suppress_Debug_Info'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Suppress_Initialization" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Suppress_Initialization'.
      </DOC>
   </ASPECT>

   <ASPECT id = "62/3" name = "Synchronization" origin = "Ada RM" category = "unknown">
      <DOC>
Defines whether a given primitive operation of a synchronized
interface must be implemented by an entry or protected
procedure. See 9.5.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Test_Case" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Test_Case'.
      </DOC>
   </ASPECT>

   <ASPECT id = "1/3" name = "This" origin = "Ada RM" category = "unknown">
      <DOC>
subclause summarizes the definitions given elsewhere of the
language-defined aspects. Aspects are properties of entities that can be
specified by the Ada program; unless otherwise specified below, aspects can be
specified using an aspect_specification.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Thread_Local_Storage" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Thread_Local_Storage'.
      </DOC>
   </ASPECT>

   <ASPECT id = "63/3" name = "Type_Invariant" origin = "Ada RM" category = "unknown">
      <DOC>
A condition that must hold true for all objects of a type. See
      </DOC>
   </ASPECT>

   <ASPECT id = "64/3" name = "Type_Invariant'Class" origin = "Ada RM" category = "unknown">
      <DOC>
A condition that must hold true for all objects in a class of
types. See 7.3.2.
      </DOC>
   </ASPECT>

   <ASPECT id = "65/3" name = "Unchecked_Union" origin = "Ada RM" category = "unknown">
      <DOC>
Type is used to interface to a C union type. See B.3.3.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Universal_Aliasing" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Universal_Aliasing'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Universal_Data" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to pragma `Universal_Data'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Unmodified" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Unmodified'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Unreferenced" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Unreferenced'. Note that
in the case of formal parameters, it is not permitted to have aspects
for a formal parameter, so in this case the pragma form must be used.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Unreferenced_Objects" origin = "GNAT RM" category = "unknown">
      <DOC>
This boolean aspect is equivalent to pragma `Unreferenced_Objects'.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Value_Size" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to a `Value_Size' attribute definition clause.
      </DOC>
   </ASPECT>

   <ASPECT id = "66/3" name = "Variable_Indexing" origin = "Ada RM" category = "unknown">
      <DOC>
Defines function(s) to implement user-defined
indexed_components. See 4.1.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "67/3" name = "Volatile" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that a type, object, or component is volatile. See
C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "68/3" name = "Volatile_Components" origin = "Ada RM" category = "unknown">
      <DOC>
Declare that the components of an array type or object are
volatile. See C.6.
      </DOC>
   </ASPECT>

   <ASPECT id = "0" name = "Warnings" origin = "GNAT RM" category = "unknown">
      <DOC>
This aspect is equivalent to the two argument form of pragma `Warnings',
where the first argument is `ON' or `OFF' and the second argument is
the entity.
      </DOC>
   </ASPECT>

   <ASPECT id = "69/3" name = "Write" origin = "Ada RM" category = "unknown">
      <DOC>
Procedure to write a value to a stream for a given type. See
      </DOC>
   </ASPECT>

   <ATTRIBUTE id = "0" name = "AST_Entry" origin = "GNAT RM" category = "variable">
      <DOC>
This attribute is implemented only in OpenVMS versions of GNAT.
Applied to the name of an entry, it yields a value of the predefined
type AST_Handler (declared in the predefined package System, as
extended by the use of pragma `Extend_System (Aux_DEC)').  This value
enables the given entry to be called when an AST occurs.  For further
details, refer to the `DEC Ada Language Reference Manual', section
9.12a.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Abort_Signal" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Abort_Signal' (`Standard' is the only allowed prefix)
provides the entity for the special exception used to signal task abort
or asynchronous transfer of control.  Normally this attribute should
only be used in the tasking runtime (it is highly peculiar, and
completely outside the normal semantics of Ada, for a user program to
intercept the abort exception).
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "2" name = "Access" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix P that denotes a subprogram:


P'Access yields an access value that designates the subprogram
denoted by P. The type of P'Access is an access-to-subprogram
type (S), as determined by the expected type. See 3.10.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "4" name = "Access" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an aliased view of an object:


X'Access yields an access value that designates the object
denoted by X. The type of X'Access is an access-to-object
type, as determined by the expected type. The expected type
shall be a general access type. See 3.10.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "6/1" name = "Address" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an object, program unit, or label:


Denotes the address of the first of the storage elements
allocated to X. For a program unit or label, this value refers
to the machine code associated with the corresponding body or
statement. The value of this attribute is of type
System.Address. See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Address_Size" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Address_Size' (`Standard' is the only allowed prefix) is a
static constant giving the number of bits in an `Address'. It is the
same value as System.Address'Size, but has the advantage of being
static, while a direct reference to System.Address'Size is non-static
because Address is a private type.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "8" name = "Adjacent" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


S'Adjacent denotes a function with the following
specification:


function S'Adjacent (X, Towards : T)
return T


If Towards = X, the function yields X; otherwise, it yields
the machine number of the type T adjacent to X in the
direction of Towards, if that machine number exists. If the
result would be outside the base range of S, Constraint_Error
is raised. When T'Signed_Zeros is True, a zero result has the
sign of X. When Towards is zero, its sign has no bearing on
the result. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "12" name = "Aft" origin = "Ada RM" category = "variable">
      <DOC>
For every fixed point subtype S:


S'Aft yields the number of decimal digits needed after the
decimal point to accommodate the delta of the subtype S,
unless the delta of the subtype S is greater than 0.1, in
which case the attribute yields the value one. (S'Aft is the
smallest positive integer N for which (10**N)*S'Delta is
greater than or equal to one.) The value of this attribute is
of the type universal_integer. See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "13.1/2" name = "Alignment" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S:


The value of this attribute is of type universal_integer, and
nonnegative.


For an object X of subtype S, if S'Alignment is not zero, then
X'Alignment is a nonzero integral multiple of S'Alignment
unless specified otherwise by a representation item. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "14/1" name = "Alignment" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an object:


The value of this attribute is of type universal_integer, and
nonnegative; zero means that the object is not necessarily
aligned on a storage element boundary. If X'Alignment is not
zero, then X is aligned on a storage unit boundary and
X'Address is an integral multiple of X'Alignment (that is, the
Address modulo the Alignment is zero).
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Asm_Input" origin = "GNAT RM" category = "function">
      <DOC>
The `Asm_Input' attribute denotes a function that takes two parameters.
The first is a string, the second is an expression of the type
designated by the prefix.  The first (string) argument is required to
be a static expression, and is the constraint for the parameter, (e.g.
what kind of register is required).  The second argument is the value
to be used as the input argument.  The possible values for the constant
are the same as those used in the RTL, and are dependent on the
configuration file used to built the GCC back end.  *note Machine Code
Insertions::
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Asm_Output" origin = "GNAT RM" category = "function">
      <DOC>
The `Asm_Output' attribute denotes a function that takes two
parameters.  The first is a string, the second is the name of a variable
of the type designated by the attribute prefix.  The first (string)
argument is required to be a static expression and designates the
constraint for the parameter (e.g. what kind of register is required).
The second argument is the variable to be updated with the result.  The
possible values for constraint are the same as those used in the RTL,
and are dependent on the configuration file used to build the GCC back
end.  If there are no output operands, then this argument may either be
omitted, or explicitly given as `No_Output_Operands'.  *note Machine
Code Insertions::
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Atomic_Always_Lock_Free" origin = "GNAT RM" category = "unknown">
      <DOC>
The prefix of the `Atomic_Always_Lock_Free' attribute is a type.  The
result is a Boolean value which is True if the type has discriminants,
and False otherwise.  The result indicate whether atomic operations are
supported by the target for the given type.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "17" name = "Base" origin = "Ada RM" category = "type">
      <DOC>
For every scalar subtype S:


S'Base denotes an unconstrained subtype of the type of S. This
unconstrained subtype is called the base subtype of the type.
See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Bit" origin = "GNAT RM" category = "variable">
      <DOC>
`OBJ'Bit', where OBJ is any object, yields the bit offset within the
storage unit (byte) that contains the first bit of storage allocated
for the object.  The value of this attribute is of the type
`Universal_Integer', and is always a non-negative number not exceeding
the value of `System.Storage_Unit'.

For an object that is a variable or a constant allocated in a
register, the value is zero.  (The use of this attribute does not force
the allocation of a variable to memory).

For an object that is a formal parameter, this attribute applies to
either the matching actual parameter or to a copy of the matching
actual parameter.

For an access object the value is zero.  Note that `OBJ.all'Bit' is
subject to an `Access_Check' for the designated object.  Similarly for
a record component `X.C'Bit' is subject to a discriminant check and
`X(I).Bit' and `X(I1..I2)'Bit' are subject to index checks.

This attribute is designed to be compatible with the DEC Ada 83
definition and implementation of the `Bit' attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "19" name = "Bit_Order" origin = "Ada RM" category = "variable">
      <DOC>
For every specific record subtype S:


Denotes the bit ordering for the type of S. The value of this
attribute is of type System.Bit_Order. See 13.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Bit_Position" origin = "GNAT RM" category = "variable">
      <DOC>
`R.C'Bit_Position', where R is a record object and C is one of the
fields of the record type, yields the bit offset within the record
contains the first bit of storage allocated for the object.  The value
of this attribute is of the type `Universal_Integer'.  The value
depends only on the field C and is independent of the alignment of the
containing record R.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "21/1" name = "Body_Version" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix P that statically denotes a program unit:


Yields a value of the predefined type String that identifies
the version of the compilation unit that contains the body
(but not any subunits) of the program unit. See E.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "23" name = "Callable" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix T that is of a task type (after any implicit
dereference):


Yields the value True when the task denoted by T is callable,
and False otherwise; See 9.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "25" name = "Caller" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix E that denotes an entry_declaration:


Yields a value of the type Task_Id that identifies the task
whose call is now being serviced. Use of this attribute is
allowed only inside an accept_statement, or entry_body after
the entry_barrier, corresponding to the entry_declaration
denoted by E. See C.7.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "27" name = "Ceiling" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


S'Ceiling denotes a function with the following specification:


function S'Ceiling (X : T)
return T


The function yields the value Ceiling(X), i.e., the smallest
(most negative) integral value greater than or equal to X.
When X is zero, the result has the sign of X; a zero result
otherwise has a negative sign when S'Signed_Zeros is True. See
A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "31" name = "Class" origin = "Ada RM" category = "type">
      <DOC>
For every subtype S of a tagged type T (specific or
class-wide):


S'Class denotes a subtype of the class-wide type (called
T'Class in this International Standard) for the class rooted
at T (or if S already denotes a class-wide subtype, then
S'Class is the same as S).


S'Class is unconstrained. However, if S is constrained, then
the values of S'Class are only those that when converted to
the type T belong to S. See 3.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "33" name = "Class" origin = "Ada RM" category = "type">
      <DOC>
For every subtype S of a tagged type T (specific or class-wide):

S'Class denotes a subtype of the class-wide type (called T'Class
in this International Standard) for the class rooted at T (or if
S already denotes a class-wide subtype, then S'Class is the same
as S).

S'Class is unconstrained. However, if S is constrained, then the
values of S'Class are only those that when converted to the type
T belong to S. See 3.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "34" name = "Class" origin = "Ada RM" category = "unknown">
      <DOC>
For every subtype S of an untagged private type whose full
view is tagged:


Denotes the class-wide subtype corresponding to the full view
of S. This attribute is allowed only from the beginning of the
private part in which the full view is declared, until the
declaration of the full view. After the full view, the Class
attribute of the full view can be used. See 7.3.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "92" name = "Class'Input" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S'Class of a class-wide type T'Class:


S'Class'Input denotes a function with the following
specification:


function S'Class'Input(
Stream : not null access Ada.Streams.Root_Stream_Type'Class)
return T'Class


First reads the external tag from Stream and determines the
corresponding internal tag (by calling
Tags.Descendant_Tag(String'Input(Stream), S'Tag) which might
raise Tag_Error - see 3.9) and then dispatches to the
subprogram denoted by the Input attribute of the specific type
identified by the internal tag; returns that result. If the
specific type identified by the internal tag is abstract,
Constraint_Error is raised. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "165" name = "Class'Output" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S'Class of a class-wide type T'Class:


S'Class'Output denotes a procedure with the following
specification:


procedure S'Class'Output(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item   : in T'Class)


First writes the external tag of Item to Stream (by calling
String'Output(Stream, Tags.External_Tag(Item'Tag)) - see 3.9)
and then dispatches to the subprogram denoted by the Output
attribute of the specific type identified by the tag.
Tag_Error is raised if the tag of Item identifies a type
declared at an accessibility level deeper than that of S. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "191" name = "Class'Read" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S'Class of a class-wide type T'Class:


S'Class'Read denotes a procedure with the following
specification:


procedure S'Class'Read(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out T'Class)


Dispatches to the subprogram denoted by the Read attribute of
the specific type identified by the tag of Item. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "282" name = "Class'Write" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S'Class of a class-wide type T'Class:


S'Class'Write denotes a procedure with the following
specification:


procedure S'Class'Write(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item   : in T'Class)


Dispatches to the subprogram denoted by the Write attribute of
the specific type identified by the tag of Item. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Code_Address" origin = "GNAT RM" category = "variable">
      <DOC>
The `'Address' attribute may be applied to subprograms in Ada 95 and
Ada 2005, but the intended effect seems to be to provide an address
value which can be used to call the subprogram by means of an address
clause as in the following example:

procedure K is ...

procedure L;
for L'Address use K'Address;
pragma Import (Ada, L);

A call to `L' is then expected to result in a call to `K'.  In Ada 83,
where there were no access-to-subprogram values, this was a common
work-around for getting the effect of an indirect call.  GNAT
implements the above use of `Address' and the technique illustrated by
the example code works correctly.

However, for some purposes, it is useful to have the address of the
start of the generated code for the subprogram.  On some architectures,
this is not necessarily the same as the `Address' value described above.
For example, the `Address' value may reference a subprogram descriptor
rather than the subprogram itself.

The `'Code_Address' attribute, which can only be applied to
subprogram entities, always returns the address of the start of the
generated code of the specified subprogram, which may or may not be the
same value as is returned by the corresponding `'Address' attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Compiler_Version" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Compiler_Version' (`Standard' is the only allowed prefix)
yields a static string identifying the version of the compiler being
used to compile the unit containing the attribute reference. A typical
result would be something like "GNAT Pro 7.3.0w (20090221)".
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "36/1" name = "Component_Size" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an array subtype or array object
(after any implicit dereference):


Denotes the size in bits of components of the type of X. The
value of this attribute is of type universal_integer. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "38" name = "Compose" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Compose denotes a function with the following specification:


function S'Compose (Fraction : T;
Exponent : universal_integer)
return T


Let v be the value Fraction x T'Machine_Radix(Exponent-k),
where k is the normalized exponent of Fraction. If v is a
machine number of the type T, or if |v| &gt;= T'Model_Small, the
function yields v; otherwise, it yields either one of the
machine numbers of the type T adjacent to v. Constraint_Error
is optionally raised if v is outside the base range of S. A
zero result has the sign of Fraction when S'Signed_Zeros is
True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Constant_Indexing" origin = "GNAT RM" category = "unknown">
      <DOC>
PLEASE ADD DOCUMENTATION HERE???
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Constrained" origin = "GNAT RM" category = "unknown">
      <DOC>
In addition to the usage of this attribute in the Ada RM, `GNAT' also
permits the use of the `'Constrained' attribute in a generic template
for any type, including types without discriminants. The value of this
attribute in the generic instance when applied to a scalar type or a
record type without discriminants is always `True'. This usage is
compatible with older Ada compilers, including notably DEC Ada.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "42" name = "Constrained" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of a discriminated type (after any
implicit dereference):


Yields the value True if A denotes a constant, a value, a
tagged object, or a constrained variable, and False otherwise.
See 3.7.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "44" name = "Copy_Sign" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Copy_Sign denotes a function with the following
specification:


function S'Copy_Sign (Value, Sign : T)
return T


If the value of Value is nonzero, the function yields a result
whose magnitude is that of Value and whose sign is that of
Sign; otherwise, it yields the value zero. Constraint_Error is
optionally raised if the result is outside the base range of
S. A zero result has the sign of Sign when S'Signed_Zeros is
True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "48" name = "Count" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix E that denotes an entry of a task or protected
unit:


Yields the number of calls presently queued on the entry E of
the current instance of the unit. The value of this attribute
is of the type universal_integer. See 9.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Default_Bit_Order" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Default_Bit_Order' (`Standard' is the only permissible
prefix), provides the value `System.Default_Bit_Order' as a `Pos' value
(0 for `High_Order_First', 1 for `Low_Order_First').  This is used to
construct the definition of `Default_Bit_Order' in package `System'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Default_Iterator" origin = "GNAT RM" category = "unknown">
      <DOC>
PLEASE ADD DOCUMENTATION HERE???
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Default_Scalar_Storage_Order" origin = "GNAT RM" category = "unknown">
      <DOC>
`Standard'Default_Scalar_Storage_Order' (`Standard' is the only
permissible prefix), provides the current value of the default scalar
storage order (as specified using pragma
`Default_Scalar_Storage_Order', or equal to `Default_Bit_Order' if
unspecified) as a `System.Bit_Order' value. This is a static attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "50/1" name = "Definite" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix S that denotes a formal indefinite subtype:


S'Definite yields True if the actual subtype corresponding to
S is definite; otherwise, it yields False. The value of this
attribute is of the predefined type Boolean. See 12.5.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "52" name = "Delta" origin = "Ada RM" category = "variable">
      <DOC>
For every fixed point subtype S:


S'Delta denotes the delta of the fixed point subtype S. The
value of this attribute is of the type universal_real. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "54" name = "Denorm" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value True if every value expressible in the form
+- mantissa x T'Machine_Radix(T'Machine_Emin)
where mantissa is a nonzero T'Machine_Mantissa-digit fraction
in the number base T'Machine_Radix, the first digit of which
is zero, is a machine number (see 3.5.7) of the type T; yields
the value False otherwise. The value of this attribute is of
the predefined type Boolean. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Descriptor_Size" origin = "GNAT RM" category = "unknown">
      <DOC>
Non-static attribute `Descriptor_Size' returns the size in bits of the
descriptor allocated for a type.  The result is non-zero only for
unconstrained array types and the returned value is of type universal
integer.  In GNAT, an array descriptor contains bounds information and
is located immediately before the first element of the array.

type Unconstr_Array is array (Positive range &lt;&gt;) of Boolean;
Put_Line ("Descriptor size = " &amp; Unconstr_Array'Descriptor_Size'Img);

The attribute takes into account any additional padding due to type
alignment.  In the example above, the descriptor contains two values of
type `Positive' representing the low and high bound.  Since `Positive'
has a size of 31 bits and an alignment of 4, the descriptor size is `2 *
Positive'Size + 2' or 64 bits.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "56" name = "Digits" origin = "Ada RM" category = "variable">
      <DOC>
For every floating point subtype S:


S'Digits denotes the requested decimal precision for the
subtype S. The value of this attribute is of the type
universal_integer. See 3.5.8.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "58" name = "Digits" origin = "Ada RM" category = "variable">
      <DOC>
For every decimal fixed point subtype S:


S'Digits denotes the digits of the decimal fixed point subtype
S, which corresponds to the number of decimal digits that are
representable in objects of the subtype. The value of this
attribute is of the type universal_integer. See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Elab_Body" origin = "GNAT RM" category = "procedure">
      <DOC>
This attribute can only be applied to a program unit name.  It returns
the entity for the corresponding elaboration procedure for elaborating
the body of the referenced unit.  This is used in the main generated
elaboration procedure by the binder and is not normally used in any
other context.  However, there may be specialized situations in which it
is useful to be able to call this elaboration procedure from Ada code,
e.g. if it is necessary to do selective re-elaboration to fix some
error.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Elab_Spec" origin = "GNAT RM" category = "procedure">
      <DOC>
This attribute can only be applied to a program unit name.  It returns
the entity for the corresponding elaboration procedure for elaborating
the spec of the referenced unit.  This is used in the main generated
elaboration procedure by the binder and is not normally used in any
other context.  However, there may be specialized situations in which
it is useful to be able to call this elaboration procedure from Ada
code, e.g. if it is necessary to do selective re-elaboration to fix
some error.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Elab_Subp_Body" origin = "GNAT RM" category = "unknown">
      <DOC>
This attribute can only be applied to a library level subprogram name
and is only allowed in CodePeer mode. It returns the entity for the
corresponding elaboration procedure for elaborating the body of the
referenced subprogram unit. This is used in the main generated
elaboration procedure by the binder in CodePeer mode only and is
unrecognized otherwise.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Elaborated" origin = "GNAT RM" category = "variable">
      <DOC>
The prefix of the `'Elaborated' attribute must be a unit name.  The
value is a Boolean which indicates whether or not the given unit has
been elaborated.  This attribute is primarily intended for internal use
by the generated code for dynamic elaboration checking, but it can also
be used in user programs.  The value will always be True once
elaboration of all units has been completed.  An exception is for units
which need no elaboration, the value is always False for such units.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Emax" origin = "GNAT RM" category = "variable">
      <DOC>
The `Emax' attribute is provided for compatibility with Ada 83.  See
the Ada 83 reference manual for an exact description of the semantics of
this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Enabled" origin = "GNAT RM" category = "variable">
      <DOC>
The `Enabled' attribute allows an application program to check at
compile time to see if the designated check is currently enabled. The
prefix is a simple identifier, referencing any predefined check name
(other than `All_Checks') or a check name introduced by pragma
Check_Name. If no argument is given for the attribute, the check is for
the general state of the check, if an argument is given, then it is an
entity name, and the check indicates whether an `Suppress' or
`Unsuppress' has been given naming the entity (if not, then the
argument is ignored).

Note that instantiations inherit the check status at the point of the
instantiation, so a useful idiom is to have a library package that
introduces a check name with `pragma Check_Name', and then contains
generic packages or subprograms which use the `Enabled' attribute to
see if the check is enabled. A user of this package can then issue a
`pragma Suppress' or `pragma Unsuppress' before instantiating the
package or subprogram, controlling whether the check will be present.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Enum_Rep" origin = "GNAT RM" category = "function">
      <DOC>
For every enumeration subtype S, `S'Enum_Rep' denotes a function with
the following spec:

function S'Enum_Rep (Arg : S'Base)
return Universal_Integer;

It is also allowable to apply `Enum_Rep' directly to an object of an
enumeration type or to a non-overloaded enumeration literal.  In this
case `S'Enum_Rep' is equivalent to `TYP'Enum_Rep(S)' where TYP is the
type of the enumeration literal or object.

The function returns the representation value for the given
enumeration value.  This will be equal to value of the `Pos' attribute
in the absence of an enumeration representation clause.  This is a
static attribute (i.e. the result is static if the argument is static).

`S'Enum_Rep' can also be used with integer types and objects, in
which case it simply returns the integer value.  The reason for this is
to allow it to be used for `(&lt;&gt;)' discrete formal arguments in a
generic unit that can be instantiated with either enumeration types or
integer types.  Note that if `Enum_Rep' is used on a modular type whose
upper bound exceeds the upper bound of the largest signed integer type,
and the argument is a variable, so that the universal integer
calculation is done at run time, then the call to `Enum_Rep' may raise
`Constraint_Error'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Enum_Val" origin = "GNAT RM" category = "function">
      <DOC>
For every enumeration subtype S, `S'Enum_Val' denotes a function with
the following spec:

function S'Enum_Val (Arg : Universal_Integer)
return S'Base;

The function returns the enumeration value whose representation matches
the argument, or raises Constraint_Error if no enumeration literal of
the type has the matching value.  This will be equal to value of the
`Val' attribute in the absence of an enumeration representation clause.
This is a static attribute (i.e. the result is static if the argument
is static).
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Epsilon" origin = "GNAT RM" category = "variable">
      <DOC>
The `Epsilon' attribute is provided for compatibility with Ada 83.  See
the Ada 83 reference manual for an exact description of the semantics of
this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "60" name = "Exponent" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Exponent denotes a function with the following
specification:


function S'Exponent (X : T)
return universal_integer


The function yields the normalized exponent of X. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "64" name = "External_Tag" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a tagged type T (specific or
class-wide):


S'External_Tag denotes an external string representation for
S'Tag; it is of the predefined type String. External_Tag may
be specified for a specific tagged type via an
attribute_definition_clause; the expression of such a clause
shall be static. The default external tag representation is
implementation defined. See 13.13.2. See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Fast_Math" origin = "GNAT RM" category = "unknown">
      <DOC>
`Standard'Fast_Math' (`Standard' is the only allowed prefix) yields a
static Boolean value that is True if pragma `Fast_Math' is active, and
False otherwise.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "66/1" name = "First" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'First denotes the lower bound of the first index range; its
type is the corresponding index type. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "68" name = "First" origin = "Ada RM" category = "variable">
      <DOC>
For every scalar subtype S:


S'First denotes the lower bound of the range of S. The value
of this attribute is of the type of S. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "70/1" name = "First(N)" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'First(N) denotes the lower bound of the N-th index range;
its type is the corresponding index type. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "72" name = "First_Bit" origin = "Ada RM" category = "variable">
      <DOC>
For a component C of a composite, non-array object R:


If the nondefault bit ordering applies to the composite type,
and if a component_clause specifies the placement of C,
denotes the value given for the first_bit of the
component_clause; otherwise, denotes the offset, from the
start of the first of the storage elements occupied by C, of
the first bit occupied by C. This offset is measured in bits.
The first bit of a storage element is numbered zero. The value
of this attribute is of the type universal_integer. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "73.1/3" name = "First_Valid" origin = "Ada RM" category = "unknown">
      <DOC>
For every static discrete subtype S for which there exists at
least one value belonging to S that satisfies any predicate of
S:


S'First_Valid denotes the smallest value that belongs to S and
satisfies the predicate of S. The value of this attribute is
of the type of S. See 3.5.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Fixed_Value" origin = "GNAT RM" category = "function">
      <DOC>
For every fixed-point type S, `S'Fixed_Value' denotes a function with
the following specification:

function S'Fixed_Value (Arg : Universal_Integer)
return S;

The value returned is the fixed-point value V such that

V = Arg * S'Small

The effect is thus similar to first converting the argument to the
integer type used to represent S, and then doing an unchecked
conversion to the fixed-point type.  The difference is that there are
full range checks, to ensure that the result is in range.  This
attribute is primarily intended for use in implementation of the
input-output functions for fixed-point values.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "74" name = "Floor" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Floor denotes a function with the following specification:


function S'Floor (X : T)
return T


The function yields the value Floor(X), i.e., the largest
(most positive) integral value less than or equal to X. When X
is zero, the result has the sign of X; a zero result otherwise
has a positive sign. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "78" name = "Fore" origin = "Ada RM" category = "variable">
      <DOC>
For every fixed point subtype S:


S'Fore yields the minimum number of characters needed before
the decimal point for the decimal representation of any value
of the subtype S, assuming that the representation does not
include an exponent, but includes a one-character prefix that
is either a minus sign or a space. (This minimum number does
not include superfluous zeros or underlines, and is at least
) The value of this attribute is of the type
universal_integer. See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "80" name = "Fraction" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Fraction denotes a function with the following
specification:


function S'Fraction (X : T)
return T


The function yields the value X x T'Machine_Radix(-k), where k
is the normalized exponent of X. A zero result, which can only
occur when X is zero, has the sign of X. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "From_Any" origin = "GNAT RM" category = "unknown">
      <DOC>
This internal attribute is used for the generation of remote subprogram
stubs in the context of the Distributed Systems Annex.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Has_Access_Values" origin = "GNAT RM" category = "variable">
      <DOC>
The prefix of the `Has_Access_Values' attribute is a type.  The result
is a Boolean value which is True if the is an access type, or is a
composite type with a component (at any nesting depth) that is an
access type, and is False otherwise.  The intended use of this
attribute is in conjunction with generic definitions.  If the attribute
is applied to a generic private type, it indicates whether or not the
corresponding actual type has access values.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Has_Discriminants" origin = "GNAT RM" category = "variable">
      <DOC>
The prefix of the `Has_Discriminants' attribute is a type.  The result
is a Boolean value which is True if the type has discriminants, and
False otherwise.  The intended use of this attribute is in conjunction
with generic definitions.  If the attribute is applied to a generic
private type, it indicates whether or not the corresponding actual type
has discriminants.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "83.1/3" name = "Has_Same_Storage" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix X that denotes an object:


X'Has_Same_Storage denotes a function with the following
specification:


function X'Has_Same_Storage (Arg : any_type)
return Boolean


The actual parameter shall be a name that denotes an object.
The object denoted by the actual parameter can be of any type.
This function evaluates the names of the objects involved and
returns True if the representation of the object denoted by
the actual parameter occupies exactly the same bits as the
representation of the object denoted by X; otherwise, it
returns False. See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "84" name = "Identity" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix T that is of a task type (after any implicit
dereference):

Yields a value of the type Task_Id that identifies the task
denoted by T. See C.7.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "84/1" name = "Identity" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix E that denotes an exception:


E'Identity returns the unique identity of the exception. The
type of this attribute is Exception_Id. See 11.4.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "86" name = "Identity" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix T that is of a task type (after any implicit
dereference):


Yields a value of the type Task_Id that identifies the task
denoted by T. See C.7.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "86/1" name = "Identity" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix E that denotes an exception:

E'Identity returns the unique identity of the exception. The
type of this attribute is Exception_Id. See 11.4.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "88" name = "Image" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Image denotes a function with the following specification:


function S'Image(Arg : S'Base)
return String


The function returns an image of the value of Arg as a String.
See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Img" origin = "GNAT RM" category = "function">
      <DOC>
The `Img' attribute differs from `Image' in that it is applied directly
to an object, and yields the same result as `Image' for the subtype of
the object.  This is convenient for debugging:

Put_Line ("X = " &amp; X'Img);

has the same meaning as the more verbose:

Put_Line ("X = " &amp; T'Image (X));

where T is the (sub)type of the object `X'.

Note that technically, in analogy to `Image', `X'Img' returns a
parameterless function that returns the appropriate string when called.
This means that `X'Img' can be renamed as a function-returning-string,
or used in an instantiation as a function parameter.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Implicit_Dereference" origin = "GNAT RM" category = "unknown">
      <DOC>
PLEASE ADD DOCUMENTATION HERE???
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "96" name = "Input" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a specific type T:


S'Input denotes a function with the following specification:


function S'Input(
Stream : not null access Ada.Streams.Root_Stream_Type'Class)
return T


S'Input reads and returns one value from Stream, using any
bounds or discriminants written by a corresponding S'Output to
determine how much to read. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Integer_Value" origin = "GNAT RM" category = "function">
      <DOC>
For every integer type S, `S'Integer_Value' denotes a function with the
following spec:

function S'Integer_Value (Arg : Universal_Fixed)
return S;

The value returned is the integer value V, such that

Arg = V * T'Small

where T is the type of `Arg'.  The effect is thus similar to first
doing an unchecked conversion from the fixed-point type to its
corresponding implementation type, and then converting the result to
the target integer type.  The difference is that there are full range
checks, to ensure that the result is in range.  This attribute is
primarily intended for use in implementation of the standard
input-output functions for fixed-point values.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Invalid_Value" origin = "GNAT RM" category = "variable">
      <DOC>
For every scalar type S, S'Invalid_Value returns an undefined value of
the type. If possible this value is an invalid representation for the
type. The value returned is identical to the value used to initialize
an otherwise uninitialized value of the type if pragma
Initialize_Scalars is used, including the ability to modify the value
with the binder -Sxx flag and relevant environment variables at run
time.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Iterable" origin = "GNAT RM" category = "unknown">
      <DOC>
Equivalent to Aspect Iterable.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Iterator_Element" origin = "GNAT RM" category = "unknown">
      <DOC>
PLEASE ADD DOCUMENTATION HERE???
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Large" origin = "GNAT RM" category = "variable">
      <DOC>
The `Large' attribute is provided for compatibility with Ada 83.  See
the Ada 83 reference manual for an exact description of the semantics of
this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "100/1" name = "Last" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Last denotes the upper bound of the first index range; its
type is the corresponding index type. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "102" name = "Last" origin = "Ada RM" category = "variable">
      <DOC>
For every scalar subtype S:


S'Last denotes the upper bound of the range of S. The value of
this attribute is of the type of S. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "104/1" name = "Last(N)" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Last(N) denotes the upper bound of the N-th index range; its
type is the corresponding index type. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "106" name = "Last_Bit" origin = "Ada RM" category = "variable">
      <DOC>
For a component C of a composite, non-array object R:


If the nondefault bit ordering applies to the composite type,
and if a component_clause specifies the placement of C,
denotes the value given for the last_bit of the
component_clause; otherwise, denotes the offset, from the
start of the first of the storage elements occupied by C, of
the last bit occupied by C. This offset is measured in bits.
The value of this attribute is of the type universal_integer.
See 13.5.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "107.1/3" name = "Last_Valid" origin = "Ada RM" category = "unknown">
      <DOC>
For every static discrete subtype S for which there exists at
least one value belonging to S that satisfies any predicate of
S:


S'Last_Valid denotes the largest value that belongs to S and
satisfies the predicate of S. The value of this attribute is
of the type of S. See 3.5.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "108" name = "Leading_Part" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Leading_Part denotes a function with the following
specification:


function S'Leading_Part (X : T;
Radix_Digits : universal_integer)
return T


Let v be the value T'Machine_Radix(k-Radix_Digits), where k is
the normalized exponent of X. The function yields the value


* Floor(X/v) x v, when X is nonnegative and Radix_Digits is
positive;


* Ceiling(X/v) x v, when X is negative and Radix_Digits is
positive.


Constraint_Error is raised when Radix_Digits is zero or
negative. A zero result, which can only occur when X is zero,
has the sign of X. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "115/1" name = "Length" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Length denotes the number of values of the first index range
(zero for a null range); its type is universal_integer. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "117/1" name = "Length(N)" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Length(N) denotes the number of values of the N-th index
range (zero for a null range); its type is universal_integer.
See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Library_Level" origin = "GNAT RM" category = "unknown">
      <DOC>
`P'Library_Level', where P is an entity name, returns a Boolean value
which is True if the entity is declared at the library level, and False
otherwise. Note that within a generic instantition, the name of the
generic unit denotes the instance, which means that this attribute can
be used to test if a generic is instantiated at the library level, as
shown in this example:

generic

package Gen is
pragma Compile_Time_Error
(not Gen'Library_Level,
"Gen can only be instantiated at library level");

end Gen;
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Lock_Free" origin = "GNAT RM" category = "unknown">
      <DOC>
`P'Lock_Free', where P is a protected object, returns True if a pragma
`Lock_Free' applies to P.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Loop_Entry" origin = "GNAT RM" category = "unknown">
      <DOC>
Syntax:

X'Loop_Entry [(loop_name)]

The `Loop_Entry' attribute is used to refer to the value that an
expression had upon entry to a given loop in much the same way that the
`Old' attribute in a subprogram postcondition can be used to refer to
the value an expression had upon entry to the subprogram. The relevant
loop is either identified by the given loop name, or it is the
innermost enclosing loop when no loop name is given.

A `Loop_Entry' attribute can only occur within a `Loop_Variant' or
`Loop_Invariant' pragma. A common use of `Loop_Entry' is to compare the
current value of objects with their initial value at loop entry, in a
`Loop_Invariant' pragma.

The effect of using `X'Loop_Entry' is the same as declaring a constant
initialized with the initial value of `X' at loop entry. This copy is
not performed if the loop is not entered, or if the corresponding
pragmas are ignored or disabled.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "119" name = "Machine" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Machine denotes a function with the following specification:


function S'Machine (X : T)
return T


If X is a machine number of the type T, the function yields X;
otherwise, it yields the value obtained by rounding or
truncating X to either one of the adjacent machine numbers of
the type T. Constraint_Error is raised if rounding or
truncating X to the precision of the machine numbers results
in a value outside the base range of S. A zero result has the
sign of X when S'Signed_Zeros is True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "123" name = "Machine_Emax" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the largest (most positive) value of exponent such that
every value expressible in the canonical form (for the type
T), having a mantissa of T'Machine_Mantissa digits, is a
machine number (see 3.5.7) of the type T. This attribute
yields a value of the type universal_integer. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "125" name = "Machine_Emin" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the smallest (most negative) value of exponent such
that every value expressible in the canonical form (for the
type T), having a mantissa of T'Machine_Mantissa digits, is a
machine number (see 3.5.7) of the type T. This attribute
yields a value of the type universal_integer. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "127" name = "Machine_Mantissa" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the largest value of p such that every value
expressible in the canonical form (for the type T), having a
p-digit mantissa and an exponent between T'Machine_Emin and
T'Machine_Emax, is a machine number (see 3.5.7) of the type T.
This attribute yields a value of the type universal_integer.
See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "129" name = "Machine_Overflows" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value True if overflow and divide-by-zero are
detected and reported by raising Constraint_Error for every
predefined operation that yields a result of the type T;
yields the value False otherwise. The value of this attribute
is of the predefined type Boolean. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "131" name = "Machine_Overflows" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a fixed point type T:


Yields the value True if overflow and divide-by-zero are
detected and reported by raising Constraint_Error for every
predefined operation that yields a result of the type T;
yields the value False otherwise. The value of this attribute
is of the predefined type Boolean. See A.5.4.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "133" name = "Machine_Radix" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the radix of the hardware representation of the type T.
The value of this attribute is of the type universal_integer.
See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "135" name = "Machine_Radix" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a fixed point type T:


Yields the radix of the hardware representation of the type T.
The value of this attribute is of the type universal_integer.
See A.5.4.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "136.1/2" name = "Machine_Rounding" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Machine_Rounding denotes a function with the following
specification:


function S'Machine_Rounding (X : T)
return T


The function yields the integral value nearest to X. If X lies
exactly halfway between two integers, one of those integers is
returned, but which of them is returned is unspecified. A zero
result has the sign of X when S'Signed_Zeros is True. This
function provides access to the rounding behavior which is
most efficient on the target processor. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "137" name = "Machine_Rounds" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value True if rounding is performed on inexact
results of every predefined operation that yields a result of
the type T; yields the value False otherwise. The value of
this attribute is of the predefined type Boolean. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "139" name = "Machine_Rounds" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a fixed point type T:


Yields the value True if rounding is performed on inexact
results of every predefined operation that yields a result of
the type T; yields the value False otherwise. The value of
this attribute is of the predefined type Boolean. See A.5.4.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Machine_Size" origin = "GNAT RM" category = "variable">
      <DOC>
This attribute is identical to the `Object_Size' attribute.  It is
provided for compatibility with the DEC Ada 83 attribute of this name.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Mantissa" origin = "GNAT RM" category = "variable">
      <DOC>
The `Mantissa' attribute is provided for compatibility with Ada 83.  See
the Ada 83 reference manual for an exact description of the semantics of
this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "141" name = "Max" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Max denotes a function with the following specification:


function S'Max(Left, Right : S'Base)
return S'Base


The function returns the greater of the values of the two
parameters. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "144.1/3" name = "Max_Alignment_For_Allocation" origin = "Ada RM" category = "unknown">
      <DOC>
For every subtype S:


Denotes the maximum value for Alignment that could be
requested by the implementation via Allocate for an access
type whose designated subtype is S. The value of this
attribute is of type universal_integer. See 13.11.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Max_Interrupt_Priority" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Max_Interrupt_Priority' (`Standard' is the only permissible
prefix), provides the same value as `System.Max_Interrupt_Priority'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Max_Priority" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Max_Priority' (`Standard' is the only permissible prefix)
provides the same value as `System.Max_Priority'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "145" name = "Max_Size_In_Storage_Elements" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S:


Denotes the maximum value for Size_In_Storage_Elements that
could be requested by the implementation via Allocate for an
access type whose designated subtype is S. The value of this
attribute is of type universal_integer. See 13.11.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Maximum_Alignment" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Maximum_Alignment' (`Standard' is the only permissible
prefix) provides the maximum useful alignment value for the target.
This is a static value that can be used to specify the alignment for an
object, guaranteeing that it is properly aligned in all cases.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Mechanism_Code" origin = "GNAT RM" category = "variable">
      <DOC>
`FUNCTION'Mechanism_Code' yields an integer code for the mechanism used
for the result of function, and `SUBPROGRAM'Mechanism_Code (N)' yields
the mechanism used for formal parameter number N (a static integer
value with 1 meaning the first parameter) of SUBPROGRAM.  The code
returned is:

by copy (value)

by reference
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "147" name = "Min" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Min denotes a function with the following specification:


function S'Min(Left, Right : S'Base)
return S'Base


The function returns the lesser of the values of the two
parameters. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "150.1/2" name = "Mod" origin = "Ada RM" category = "function">
      <DOC>
For every modular subtype S:


S'Mod denotes a function with the following specification:


function S'Mod (Arg : universal_integer)
return S'Base


This function returns Arg mod S'Modulus, as a value of the
type of S. See 3.5.4.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "151" name = "Model" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Model denotes a function with the following specification:


function S'Model (X : T)
return T


If the Numerics Annex is not supported, the meaning of this
attribute is implementation defined; see G.2.2 for the
definition that applies to implementations supporting the
Numerics Annex. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "155" name = "Model_Emin" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


If the Numerics Annex is not supported, this attribute yields
an implementation defined value that is greater than or equal
to the value of T'Machine_Emin. See G.2.2 for further
requirements that apply to implementations supporting the
Numerics Annex. The value of this attribute is of the type
universal_integer. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "157" name = "Model_Epsilon" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value T'Machine_Radix(1 - T'Model_Mantissa). The
value of this attribute is of the type universal_real. See
A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "159" name = "Model_Mantissa" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


If the Numerics Annex is not supported, this attribute yields
an implementation defined value that is greater than or equal
to Ceiling(d x log(10) / log(T'Machine_Radix)) + 1, where d is
the requested decimal precision of T, and less than or equal
to the value of T'Machine_Mantissa. See G.2.2 for further
requirements that apply to implementations supporting the
Numerics Annex. The value of this attribute is of the type
universal_integer. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "161" name = "Model_Small" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value T'Machine_Radix(T'Model_Emin - 1). The value
of this attribute is of the type universal_real. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "163" name = "Modulus" origin = "Ada RM" category = "variable">
      <DOC>
For every modular subtype S:


S'Modulus yields the modulus of the type of S, as a value of
the type universal_integer. See 3.5.4.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Null_Parameter" origin = "GNAT RM" category = "variable">
      <DOC>
A reference `T'Null_Parameter' denotes an imaginary object of type or
subtype T allocated at machine address zero.  The attribute is allowed
only as the default expression of a formal parameter, or as an actual
expression of a subprogram call.  In either case, the subprogram must
be imported.

The identity of the object is represented by the address zero in the
argument list, independent of the passing mechanism (explicit or
default).

This capability is needed to specify that a zero address should be
passed for a record or other composite object passed by reference.
There is no way of indicating this without the `Null_Parameter'
attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Object_Size" origin = "GNAT RM" category = "variable">
      <DOC>
The size of an object is not necessarily the same as the size of the
type of an object.  This is because by default object sizes are
increased to be a multiple of the alignment of the object.  For example,
`Natural'Size' is 31, but by default objects of type `Natural' will
have a size of 32 bits.  Similarly, a record containing an integer and
a character:

type Rec is record
I : Integer;
C : Character;
end record;

will have a size of 40 (that is `Rec'Size' will be 40).  The alignment
will be 4, because of the integer field, and so the default size of
record objects for this type will be 64 (8 bytes).

If the alignment of the above record is specified to be 1, then the
object size will be 40 (5 bytes). This is true by default, and also an
object size of 40 can be explicitly specified in this case.

A consequence of this capability is that different object sizes can
be given to subtypes that would otherwise be considered in Ada to be
statically matching.  But it makes no sense to consider such subtypes
as statically matching.  Consequently, in `GNAT' we add a rule to the
static matching rules that requires object sizes to match.  Consider
this example:

procedure BadAVConvert is
type R is new Integer;
subtype R1 is R range 1 .. 10;
subtype R2 is R range 1 .. 10;
for R1'Object_Size use 8;
for R2'Object_Size use 16;
type R1P is access all R1;
type R2P is access all R2;
R1PV : R1P := new R1'(4);
R2PV : R2P;
begin
R2PV := R2P (R1PV);
|
&gt;&gt;&gt; target designated subtype not compatible with
type "R1" defined at line 3

end;

In the absence of lines 5 and 6, types `R1' and `R2' statically match
and hence the conversion on line 12 is legal. But since lines 5 and 6
cause the object sizes to differ, `GNAT' considers that types `R1' and
`R2' are not statically matching, and line 12 generates the diagnostic
shown above.

Similar additional checks are performed in other contexts requiring
statically matching subtypes.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Old" origin = "GNAT RM" category = "variable">
      <DOC>
In addition to the usage of `Old' defined in the Ada 2012 RM (usage
within `Post' aspect), GNAT also permits the use of this attribute in
implementation defined pragmas `Postcondition', `Contract_Cases' and
`Test_Case'. Also usages of `Old' which would be illegal according to
the Ada 2012 RM definition are allowed under control of implementation
defined pragma `Unevaluated_Use_Of_Old'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "164.1/3" name = "Old" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix X that denotes an object of a nonlimited type:


For each X'Old in a postcondition expression that is enabled,
a constant is implicitly declared at the beginning of the
subprogram or entry. The constant is of the type of X and is
initialized to the result of evaluating X (as an expression)
at the point of the constant declaration. The value of X'Old
in the postcondition expression is the value of this constant;
the type of X'Old is the type of X. These implicit constant
declarations occur in an arbitrary order. See 6.1.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "169" name = "Output" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S of a specific type T:


S'Output denotes a procedure with the following specification:


procedure S'Output(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T)


S'Output writes the value of Item to Stream, including any
bounds or discriminants. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "172.1/3" name = "Overlaps_Storage" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix X that denotes an object:


X'Overlaps_Storage denotes a function with the following
specification:


function X'Overlaps_Storage (Arg : any_type)
return Boolean


The actual parameter shall be a name that denotes an object.
The object denoted by the actual parameter can be of any type.
This function evaluates the names of the objects involved and
returns True if the representation of the object denoted by
the actual parameter shares at least one bit with the
representation of the object denoted by X; otherwise, it
returns False. See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "173/1" name = "Partition_Id" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix D that denotes a library-level declaration,
excepting a declaration of or within a declared-pure library
unit:


Denotes a value of the type universal_integer that identifies
the partition in which D was elaborated. If D denotes the
declaration of a remote call interface library unit (see
E.2.3) the given partition is the one where the body of D was
elaborated. See E.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Passed_By_Reference" origin = "GNAT RM" category = "variable">
      <DOC>
`TYPE'Passed_By_Reference' for any subtype TYPE returns a value of type
`Boolean' value that is `True' if the type is normally passed by
reference and `False' if the type is normally passed by copy in calls.
For scalar types, the result is always `False' and is static.  For
non-scalar types, the result is non-static.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Pool_Address" origin = "GNAT RM" category = "variable">
      <DOC>
`X'Pool_Address' for any object X returns the address of X within its
storage pool. This is the same as `X'Address', except that for an
unconstrained array whose bounds are allocated just before the first
component, `X'Pool_Address' returns the address of those bounds,
whereas `X'Address' returns the address of the first component.

Here, we are interpreting "storage pool" broadly to mean "wherever
the object is allocated", which could be a user-defined storage pool,
the global heap, on the stack, or in a static memory area. For an
object created by `new', `PTR.ALL'Pool_Address' is what is passed to
`Allocate' and returned from `Deallocate'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "175" name = "Pos" origin = "Ada RM" category = "function">
      <DOC>
For every discrete subtype S:


S'Pos denotes a function with the following specification:


function S'Pos(Arg : S'Base)
return universal_integer


This function returns the position number of the value of Arg,
as a value of type universal_integer. See 3.5.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "179" name = "Position" origin = "Ada RM" category = "variable">
      <DOC>
For a component C of a composite, non-array object R:


If the nondefault bit ordering applies to the composite type,
and if a component_clause specifies the placement of C,
denotes the value given for the position of the
component_clause; otherwise, denotes the same value as
R.C'Address - R'Address. The value of this attribute is of the
type universal_integer. See 13.5.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "181" name = "Pred" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Pred denotes a function with the following specification:


function S'Pred(Arg : S'Base)
return S'Base


For an enumeration type, the function returns the value whose
position number is one less than that of the value of Arg;
Constraint_Error is raised if there is no such value of the
type. For an integer type, the function returns the result of
subtracting one from the value of Arg. For a fixed point type,
the function returns the result of subtracting small from the
value of Arg. For a floating point type, the function returns
the machine number (as defined in 3.5.7) immediately below the
value of Arg; Constraint_Error is raised if there is no such
machine number. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "184.1/2" name = "Priority" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix P that denotes a protected object:


Denotes a non-aliased component of the protected object P.
This component is of type System.Any_Priority and its value is
the priority of P. P'Priority denotes a variable if and only
if P denotes a variable. A reference to this attribute shall
appear only within the body of P. See D.5.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "185/1" name = "Range" origin = "Ada RM" category = "type">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Range is equivalent to the range A'First .. A'Last, except
that the prefix A is only evaluated once. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "187" name = "Range" origin = "Ada RM" category = "type">
      <DOC>
For every scalar subtype S:


S'Range is equivalent to the range S'First .. S'Last. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "189/1" name = "Range(N)" origin = "Ada RM" category = "type">
      <DOC>
For a prefix A that is of an array type (after any implicit
dereference), or denotes a constrained array subtype:


A'Range(N) is equivalent to the range A'First(N) .. A'Last(N),
except that the prefix A is only evaluated once. See 3.6.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Range_Length" origin = "GNAT RM" category = "variable">
      <DOC>
`TYPE'Range_Length' for any discrete type TYPE yields the number of
values represented by the subtype (zero for a null range).  The result
is static for static subtypes.  `Range_Length' applied to the index
subtype of a one dimensional array always gives the same result as
`Length' applied to the array itself.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "195" name = "Read" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S of a specific type T:


S'Read denotes a procedure with the following specification:


procedure S'Read(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out T)


S'Read reads the value of Item from Stream. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Ref" origin = "GNAT RM" category = "unknown">
      <DOC>
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "199" name = "Remainder" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Remainder denotes a function with the following
specification:


function S'Remainder (X, Y : T)
return T


For nonzero Y, let v be the value X - n x Y, where n is the
integer nearest to the exact value of X/Y; if |n - X/Y| = 1/2,
then n is chosen to be even. If v is a machine number of the
type T, the function yields v; otherwise, it yields zero.
Constraint_Error is raised if Y is zero. A zero result has the
sign of X when S'Signed_Zeros is True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Restriction_Set" origin = "GNAT RM" category = "unknown">
      <DOC>
This attribute allows compile time testing of restrictions that are
currently in effect. It is primarily intended for specializing code in
the run-time based on restrictions that are active (e.g.  don't need to
save fpt registers if restriction No_Floating_Point is known to be in
effect), but can be used anywhere.

There are two forms:

System'Restriction_Set (partition_boolean_restriction_NAME)
System'Restriction_Set (No_Dependence =&gt; library_unit_NAME);

In the case of the first form, the only restriction names allowed are
parameterless restrictions that are checked for consistency at bind
time. For a complete list see the subtype
`System.Rident.Partition_Boolean_Restrictions'.

The result returned is True if the restriction is known to be in
effect, and False if the restriction is known not to be in effect. An
important guarantee is that the value of a Restriction_Set attribute is
known to be consistent throughout all the code of a partition.

This is trivially achieved if the entire partition is compiled with
a consistent set of restriction pragmas. However, the compilation model
does not require this. It is possible to compile one set of units with
one set of pragmas, and another set of units with another set of
pragmas. It is even possible to compile a spec with one set of pragmas,
and then WITH the same spec with a different set of pragmas.
Inconsistencies in the actual use of the restriction are checked at
bind time.

In order to achieve the guarantee of consistency for the
Restriction_Set pragma, we consider that a use of the pragma that
yields False is equivalent to a violation of the restriction.

So for example if you write

if System'Restriction_Set (No_Floating_Point) then

else

end if;

And the result is False, so that the else branch is executed, you can
assume that this restriction is not set for any unit in the partition.
This is checked by considering this use of the restriction pragma to be
a violation of the restriction No_Floating_Point. This means that no
other unit can attempt to set this restriction (if some unit does
attempt to set it, the binder will refuse to bind the partition).

Technical note: The restriction name and the unit name are
intepreted entirely syntactically, as in the corresponding Restrictions
pragma, they are not analyzed semantically, so they do not have a type.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Result" origin = "GNAT RM" category = "variable">
      <DOC>
`FUNCTION'Result' can only be used with in a Postcondition pragma for a
function. The prefix must be the name of the corresponding function.
This is used to refer to the result of the function in the
postcondition expression.  For a further discussion of the use of this
attribute and examples of its use, see the description of pragma
Postcondition.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "202.1/3" name = "Result" origin = "Ada RM" category = "unknown">
      <DOC>
For a prefix F that denotes a function declaration:


Within a postcondition expression for function F, denotes the
result object of the function. The type of this attribute is
that of the function result except within a Post'Class
postcondition expression for a function with a controlling
result or with a controlling access result. For a controlling
result, the type of the attribute is T'Class, where T is the
function result type. For a controlling access result, the
type of the attribute is an anonymous access type whose
designated type is T'Class, where T is the designated type of
the function result type. See 6.1.1.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "203" name = "Round" origin = "Ada RM" category = "function">
      <DOC>
For every decimal fixed point subtype S:


S'Round denotes a function with the following specification:


function S'Round(X : universal_real)
return S'Base


The function returns the value obtained by rounding X (away
from 0, if X is midway between two values of the type of S).
See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "207" name = "Rounding" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Rounding denotes a function with the following
specification:


function S'Rounding (X : T)
return T


The function yields the integral value nearest to X, rounding
away from zero if X lies exactly halfway between two integers.
A zero result has the sign of X when S'Signed_Zeros is True.
See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Safe_Emax" origin = "GNAT RM" category = "variable">
      <DOC>
The `Safe_Emax' attribute is provided for compatibility with Ada 83.
See the Ada 83 reference manual for an exact description of the
semantics of this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "211" name = "Safe_First" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the lower bound of the safe range (see 3.5.7) of the
type T. If the Numerics Annex is not supported, the value of
this attribute is implementation defined; see G.2.2 for the
definition that applies to implementations supporting the
Numerics Annex. The value of this attribute is of the type
universal_real. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Safe_Large" origin = "GNAT RM" category = "variable">
      <DOC>
The `Safe_Large' attribute is provided for compatibility with Ada 83.
See the Ada 83 reference manual for an exact description of the
semantics of this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "213" name = "Safe_Last" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the upper bound of the safe range (see 3.5.7) of the
type T. If the Numerics Annex is not supported, the value of
this attribute is implementation defined; see G.2.2 for the
definition that applies to implementations supporting the
Numerics Annex. The value of this attribute is of the type
universal_real. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Safe_Small" origin = "GNAT RM" category = "unknown">
      <DOC>
The `Safe_Small' attribute is provided for compatibility with Ada 83.
See the Ada 83 reference manual for an exact description of the
semantics of this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Scalar_Storage_Order" origin = "GNAT RM" category = "unknown">
      <DOC>
For every array or record type S, the representation attribute
`Scalar_Storage_Order' denotes the order in which storage elements that
make up scalar components are ordered within S. The value given must be
a static expression of type System.Bit_Order. The following is an
example of the use of this feature:

--  Component type definitions

subtype Yr_Type is Natural range 0 .. 127;
subtype Mo_Type is Natural range 1 .. 12;
subtype Da_Type is Natural range 1 .. 31;

--  Record declaration

type Date is record
Years_Since_1980 : Yr_Type;
Month            : Mo_Type;
Day_Of_Month     : Da_Type;
end record;

--  Record representation clause

for Date use record
Years_Since_1980 at 0 range 0  ..  6;
Month            at 0 range 7  .. 10;
Day_Of_Month     at 0 range 11 .. 15;
end record;

--  Attribute definition clauses

for Date'Bit_Order use System.High_Order_First;
for Date'Scalar_Storage_Order use System.High_Order_First;
--  If Scalar_Storage_Order is specified, it must be consistent with
--  Bit_Order, so it's best to always define the latter explicitly if
--  the former is used.

Other properties are as for standard representation attribute
`Bit_Order', as defined by Ada RM 13.5.3(4). The default is
`System.Default_Bit_Order'.

For a record type T, if `T'Scalar_Storage_Order' is specified
explicitly, it shall be equal to `T'Bit_Order'. Note: this means that
if a `Scalar_Storage_Order' attribute definition clause is not
confirming, then the type's `Bit_Order' shall be specified explicitly
and set to the same value.

Derived types inherit an explicitly set scalar storage order from
their parent types. This may be overridden for the derived type by
giving an explicit scalar storage order for the derived type. For a
record extension, the derived type must have the same scalar storage
order as the parent type.

If a component of T is of a record or array type, then that type must
also have a `Scalar_Storage_Order' attribute definition clause.

A component of a record or array type that is a packed array, or that
does not start on a byte boundary, must have the same scalar storage
order as the enclosing record or array type.

No component of a type that has an explicit `Scalar_Storage_Order'
attribute definition may be aliased.

A confirming `Scalar_Storage_Order' attribute definition clause (i.e.
with a value equal to `System.Default_Bit_Order') has no effect.

If the opposite storage order is specified, then whenever the value
of a scalar component of an object of type S is read, the storage
elements of the enclosing machine scalar are first reversed (before
retrieving the component value, possibly applying some shift and mask
operatings on the enclosing machine scalar), and the opposite operation
is done for writes.

In that case, the restrictions set forth in 13.5.1(10.3/2) for
scalar components are relaxed. Instead, the following rules apply:

* the underlying storage elements are those at positions
`(position + first_bit / storage_element_size) ..
(position + (last_bit + storage_element_size - 1) /
storage_element_size)'

* the sequence of underlying storage elements shall have         a
size no greater than the largest machine scalar

* the enclosing machine scalar is defined as the smallest machine
scalar starting at a position no greater than
`position + first_bit / storage_element_size' and covering
storage elements at least up to `position + (last_bit +
storage_element_size - 1) / storage_element_size'

* the position of the component is interpreted relative to that
machine  scalar.


If no scalar storage order is specified for a type (either directly,
or by inheritance in the case of a derived type), then the default is
normally the native ordering of the target, but this default can be
overridden using pragma `Default_Scalar_Storage_Order'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "215" name = "Scale" origin = "Ada RM" category = "variable">
      <DOC>
For every decimal fixed point subtype S:


S'Scale denotes the scale of the subtype S, defined as the
value N such that S'Delta = 10.0**(-N). The scale indicates
the position of the point relative to the rightmost
significant digits of values of subtype S. The value of this
attribute is of the type universal_integer. See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "217" name = "Scaling" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Scaling denotes a function with the following specification:


function S'Scaling (X : T;
Adjustment : universal_integer)
return T


Let v be the value X x T'Machine_Radix(Adjustment). If v is a
machine number of the type T, or if |v| &gt;= T'Model_Small, the
function yields v; otherwise, it yields either one of the
machine numbers of the type T adjacent to v. Constraint_Error
is optionally raised if v is outside the base range of S. A
zero result has the sign of X when S'Signed_Zeros is True. See
A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "221" name = "Signed_Zeros" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a floating point type T:


Yields the value True if the hardware representation for the
type T has the capability of representing both positively and
negatively signed zeros, these being generated and used by the
predefined operations of the type T as specified in IEC
:1989; yields the value False otherwise. The value of this
attribute is of the predefined type Boolean. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Simple_Storage_Pool" origin = "GNAT RM" category = "unknown">
      <DOC>
For every nonformal, nonderived access-to-object type ACC, the
representation attribute `Simple_Storage_Pool' may be specified via an
attribute_definition_clause (or by specifying the equivalent aspect):


My_Pool : My_Simple_Storage_Pool_Type;

type Acc is access My_Data_Type;

for Acc'Simple_Storage_Pool use My_Pool;

The name given in an attribute_definition_clause for the
`Simple_Storage_Pool' attribute shall denote a variable of a "simple
storage pool type" (see pragma `Simple_Storage_Pool_Type').

The use of this attribute is only allowed for a prefix denoting a
type for which it has been specified. The type of the attribute is the
type of the variable specified as the simple storage pool of the access
type, and the attribute denotes that variable.

It is illegal to specify both `Storage_Pool' and
`Simple_Storage_Pool' for the same access type.

If the `Simple_Storage_Pool' attribute has been specified for an
access type, then applying the `Storage_Pool' attribute to the type is
flagged with a warning and its evaluation raises the exception
`Program_Error'.

If the Simple_Storage_Pool attribute has been specified for an access
type S, then the evaluation of the attribute `S'Storage_Size' returns
the result of calling `Storage_Size (S'Simple_Storage_Pool)', which is
intended to indicate the number of storage elements reserved for the
simple storage pool. If the Storage_Size function has not been defined
for the simple storage pool type, then this attribute returns zero.

If an access type S has a specified simple storage pool of type SSP,
then the evaluation of an allocator for that access type calls the
primitive `Allocate' procedure for type SSP, passing
`S'Simple_Storage_Pool' as the pool parameter. The detailed semantics
of such allocators is the same as those defined for allocators in
section 13.11 of the Ada Reference Manual, with the term "simple
storage pool" substituted for "storage pool".

If an access type S has a specified simple storage pool of type SSP,
then a call to an instance of the `Ada.Unchecked_Deallocation' for that
access type invokes the primitive `Deallocate' procedure for type SSP,
passing `S'Simple_Storage_Pool' as the pool parameter. The detailed
semantics of such unchecked deallocations is the same as defined in
section 13.11.2 of the Ada Reference Manual, except that the term
"simple storage pool" is substituted for "storage pool".
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "223" name = "Size" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S:


If S is definite, denotes the size (in bits) that the
implementation would choose for the following objects of
subtype S:


* A record component of subtype S when the record type is
packed.


* The formal parameter of an instance of
Unchecked_Conversion that converts from subtype S to some
other subtype.


If S is indefinite, the meaning is implementation defined. The
value of this attribute is of the type universal_integer. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "228/1" name = "Size" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an object:


Denotes the size in bits of the representation of the object.
The value of this attribute is of the type universal_integer.
See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Small" origin = "GNAT RM" category = "variable">
      <DOC>
The `Small' attribute is defined in Ada 95 (and Ada 2005) only for
fixed-point types.  GNAT also allows this attribute to be applied to
floating-point types for compatibility with Ada 83.  See the Ada 83
reference manual for an exact description of the semantics of this
attribute when applied to floating-point types.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "230" name = "Small" origin = "Ada RM" category = "variable">
      <DOC>
For every fixed point subtype S:


S'Small denotes the small of the type of S. The value of this
attribute is of the type universal_real. See 3.5.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "232" name = "Storage_Pool" origin = "Ada RM" category = "variable">
      <DOC>
For every access-to-object subtype S:


Denotes the storage pool of the type of S. The type of this
attribute is Root_Storage_Pool'Class. See 13.11.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "234" name = "Storage_Size" origin = "Ada RM" category = "variable">
      <DOC>
For every access-to-object subtype S:


Yields the result of calling Storage_Size(S'Storage_Pool),
which is intended to be a measure of the number of storage
elements reserved for the pool. The type of this attribute is
universal_integer. See 13.11.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "236/1" name = "Storage_Size" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix T that denotes a task object (after any implicit
dereference):


Denotes the number of storage elements reserved for the task.
The value of this attribute is of the type universal_integer.
The Storage_Size includes the size of the task's stack, if
any. The language does not specify whether or not it includes
other storage associated with the task (such as the "task
control block" used by some implementations.) See 13.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Storage_Unit" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Storage_Unit' (`Standard' is the only permissible prefix)
provides the same value as `System.Storage_Unit'.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "237.1/2" name = "Stream_Size" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of an elementary type T:

Denotes the number of bits occupied in a stream by items of
subtype S. Hence, the number of stream elements required per
item of elementary type T is:

T'Stream_Size / Ada.Streams.Stream_Element'Size

The value of this attribute is of type universal_integer and
is a multiple of Stream_Element'Size. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "237.1/3" name = "Stream_Size" origin = "Ada RM" category = "unknown">
      <DOC>
For every subtype S of an elementary type T:


Denotes the number of bits read from or written to a stream by
the default implementations of S'Read and S'Write. Hence, the
number of stream elements required per item of elementary type
T is:


T'Stream_Size / Ada.Streams.Stream_Element'Size


The value of this attribute is of type universal_integer and
is a multiple of Stream_Element'Size. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Stub_Type" origin = "GNAT RM" category = "type">
      <DOC>
The GNAT implementation of remote access-to-classwide types is
organized as described in AARM section E.4 (20.t): a value of an RACW
type (designating a remote object) is represented as a normal access
value, pointing to a "stub" object which in turn contains the necessary
information to contact the designated remote object. A call on any
dispatching operation of such a stub object does the remote call, if
necessary, using the information in the stub object to locate the
target partition, etc.

For a prefix `T' that denotes a remote access-to-classwide type,
`T'Stub_Type' denotes the type of the corresponding stub objects.

By construction, the layout of `T'Stub_Type' is identical to that of
type `RACW_Stub_Type' declared in the internal implementation-defined
unit `System.Partition_Interface'. Use of this attribute will create an
implicit dependency on this unit.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "238" name = "Succ" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Succ denotes a function with the following specification:


function S'Succ(Arg : S'Base)
return S'Base


For an enumeration type, the function returns the value whose
position number is one more than that of the value of Arg;
Constraint_Error is raised if there is no such value of the
type. For an integer type, the function returns the result of
adding one to the value of Arg. For a fixed point type, the
function returns the result of adding small to the value of
Arg. For a floating point type, the function returns the
machine number (as defined in 3.5.7) immediately above the
value of Arg; Constraint_Error is raised if there is no such
machine number. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "System_Allocator_Alignment" origin = "GNAT RM" category = "unknown">
      <DOC>
`Standard'System_Allocator_Alignment' (`Standard' is the only
permissible prefix) provides the observable guaranted to be honored by
the system allocator (malloc). This is a static value that can be used
in user storage pools based on malloc either to reject allocation with
alignment too large or to enable a realignment circuitry if the
alignment request is larger than this value.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "242" name = "Tag" origin = "Ada RM" category = "variable">
      <DOC>
For every subtype S of a tagged type T (specific or
class-wide):


S'Tag denotes the tag of the type T (or if T is class-wide,
the tag of the root type of the corresponding class). The
value of this attribute is of type Tag. See 3.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "244" name = "Tag" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that is of a class-wide tagged type (after any
implicit dereference):


X'Tag denotes the tag of X. The value of this attribute is of
type Tag. See 3.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Target_Name" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Target_Name' (`Standard' is the only permissible prefix)
provides a static string value that identifies the target for the
current compilation. For GCC implementations, this is the standard gcc
target name without the terminating slash (for example, GNAT 5.0 on
windows yields "i586-pc-mingw32msv").
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "246" name = "Terminated" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix T that is of a task type (after any implicit
dereference):


Yields the value True if the task denoted by T is terminated,
and False otherwise. The value of this attribute is of the
predefined type Boolean. See 9.9.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Tick" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Tick' (`Standard' is the only permissible prefix) provides
the same value as `System.Tick',
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "To_Address" origin = "GNAT RM" category = "variable">
      <DOC>
The `System'To_Address' (`System' is the only permissible prefix)
denotes a function identical to `System.Storage_Elements.To_Address'
except that it is a static attribute.  This means that if its argument
is a static expression, then the result of the attribute is a static
expression.  This means that such an expression can be used in contexts
(e.g. preelaborable packages) which require a static expression and
where the function call could not be used (since the function call is
always non-static, even if its argument is static). The argument must
be in the range -(2**(m-1) .. 2**m-1, where m is the memory size
(typically 32 or 64). Negative values are intepreted in a modular
manner (e.g. -1 means the same as 16#FFFF_FFFF# on a 32 bits machine).
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "To_Any" origin = "GNAT RM" category = "unknown">
      <DOC>
This internal attribute is used for the generation of remote subprogram
stubs in the context of the Distributed Systems Annex.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "248" name = "Truncation" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Truncation denotes a function with the following
specification:


function S'Truncation (X : T)
return T


The function yields the value Ceiling(X) when X is negative,
and Floor(X) otherwise. A zero result has the sign of X when
S'Signed_Zeros is True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "TypeCode" origin = "GNAT RM" category = "unknown">
      <DOC>
This internal attribute is used for the generation of remote subprogram
stubs in the context of the Distributed Systems Annex.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Type_Class" origin = "GNAT RM" category = "variable">
      <DOC>
`TYPE'Type_Class' for any type or subtype TYPE yields the value of the
type class for the full type of TYPE.  If TYPE is a generic formal
type, the value is the value for the corresponding actual subtype.  The
value of this attribute is of type `System.Aux_DEC.Type_Class', which
has the following definition:

type Type_Class is
(Type_Class_Enumeration,
Type_Class_Integer,
Type_Class_Fixed_Point,
Type_Class_Floating_Point,
Type_Class_Array,
Type_Class_Record,
Type_Class_Access,
Type_Class_Task,
Type_Class_Address);

Protected types yield the value `Type_Class_Task', which thus applies
to all concurrent types.  This attribute is designed to be compatible
with the DEC Ada 83 attribute of the same name.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Type_Key" origin = "GNAT RM" category = "unknown">
      <DOC>
The `Type_Key' attribute is applicable to a type or subtype and yields
a value of type Standard.String containing encoded information about
the type or subtype. This provides improved compatibility with other
implementations that support this attribute.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "UET_Address" origin = "GNAT RM" category = "variable">
      <DOC>
The `UET_Address' attribute can only be used for a prefix which denotes
a library package.  It yields the address of the unit exception table
when zero cost exception handling is used.  This attribute is intended
only for use within the GNAT implementation.  See the unit
`Ada.Exceptions' in files `a-except.ads' and `a-except.adb' for details
on how this attribute is used in the implementation.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "252" name = "Unbiased_Rounding" origin = "Ada RM" category = "function">
      <DOC>
For every subtype S of a floating point type T:


S'Unbiased_Rounding denotes a function with the following
specification:


function S'Unbiased_Rounding (X : T)
return T


The function yields the integral value nearest to X, rounding
toward the even integer if X lies exactly halfway between two
integers. A zero result has the sign of X when S'Signed_Zeros
is True. See A.5.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "256" name = "Unchecked_Access" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes an aliased view of an object:


All rules and semantics that apply to X'Access (see 3.10.2)
apply also to X'Unchecked_Access, except that, for the
purposes of accessibility rules and checks, it is as if X were
declared immediately within a library package. See 13.10.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Unconstrained_Array" origin = "GNAT RM" category = "variable">
      <DOC>
The `Unconstrained_Array' attribute can be used with a prefix that
denotes any type or subtype. It is a static attribute that yields
`True' if the prefix designates an unconstrained array, and `False'
otherwise. In a generic instance, the result is still static, and
yields the result of applying this test to the generic actual.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Universal_Literal_String" origin = "GNAT RM" category = "variable">
      <DOC>
The prefix of `Universal_Literal_String' must be a named number.  The
static result is the string consisting of the characters of the number
as defined in the original source.  This allows the user program to
access the actual text of named numbers without intermediate
conversions and without the need to enclose the strings in quotes (which
would preclude their use as numbers).

For example, the following program prints the first 50 digits of pi:

with Text_IO; use Text_IO;
with Ada.Numerics;
procedure Pi is
begin
Put (Ada.Numerics.Pi'Universal_Literal_String);
end;
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Unrestricted_Access" origin = "GNAT RM" category = "variable">
      <DOC>
The `Unrestricted_Access' attribute is similar to `Access' except that
all accessibility and aliased view checks are omitted.  This is a
user-beware attribute.

For objects, it is similar to `Address', for which it is a desirable
replacement where the value desired is an access type.  In other words,
its effect is similar to first applying the `Address' attribute and
then doing an unchecked conversion to a desired access type.

For subprograms, `P'Unrestricted_Access' may be used where
`P'Access' would be illegal, to construct a value of a less-nested
named access type that designates a more-nested subprogram. This value
may be used in indirect calls, so long as the more-nested subprogram
still exists; once the subprogram containing it has returned, such
calls are erroneous. For example:

package body P is

type Less_Nested is not null access procedure;
Global : Less_Nested;

procedure P1 is
begin
Global.all;
end P1;

procedure P2 is
Local_Var : Integer;

procedure More_Nested is
begin
Local_Var ...
end More_Nested;
begin
Global := More_Nested'Unrestricted_Access;
P1;
end P2;

end P;

When P1 is called from P2, the call via Global is OK, but if P1 were
called after P2 returns, it would be an erroneous use of a dangling
pointer.

For objects, it is possible to use `Unrestricted_Access' for any
type, but care must be exercised if it is used to create pointers to
unconstrained array objects.  In this case, the resulting pointer has
the same scope as the context of the attribute, and may not be returned
to some enclosing scope.  For instance, a function cannot use
`Unrestricted_Access' to create a pointer to unconstrained and then
return that value to the caller.  In addition, it is only valid to
create pointers to unconstrained arrays using this attribute if the
pointer has the normal default "fat" representation where a pointer has
two components, one points to the array and one points to the bounds.
If a size clause is used to force "thin" representation for a pointer
to unconstrained where there is only space for a single pointer, then
the resulting pointer is not usable.

In the simple case where a direct use of Unrestricted_Access attempts
to make a thin pointer for a non-aliased object, the compiler will
reject the use as illegal, as shown in the following example:

with System; use System;
procedure SliceUA2 is
type A is access all String;
for A'Size use Standard'Address_Size;

procedure P (Arg : A) is
begin
null;
end P;

X : String := "hello world!";
X2 : aliased String := "hello world!";

AV : A := X'Unrestricted_Access;    -- ERROR
|
&gt;&gt;&gt; illegal use of Unrestricted_Access attribute
&gt;&gt;&gt; attempt to generate thin pointer to unaliased object

begin
P (X'Unrestricted_Access);          -- ERROR
|
&gt;&gt;&gt; illegal use of Unrestricted_Access attribute
&gt;&gt;&gt; attempt to generate thin pointer to unaliased object

P (X(7 .. 12)'Unrestricted_Access); -- ERROR
|
&gt;&gt;&gt; illegal use of Unrestricted_Access attribute
&gt;&gt;&gt; attempt to generate thin pointer to unaliased object

P (X2'Unrestricted_Access);         -- OK
end;

but other cases cannot be detected by the compiler, and are considered
to be erroneous. Consider the following example:

with System; use System;
with System; use System;
procedure SliceUA is
type AF is access all String;

type A is access all String;
for A'Size use Standard'Address_Size;

procedure P (Arg : A) is
begin
if Arg'Length /= 6 then
raise Program_Error;
end if;
end P;

X : String := "hello world!";
Y : AF := X (7 .. 12)'Unrestricted_Access;

begin
P (A (Y));
end;

A normal unconstrained array value or a constrained array object marked
as aliased has the bounds in memory just before the array, so a thin
pointer can retrieve both the data and the bounds.  But in this case,
the non-aliased object `X' does not have the bounds before the string.
If the size clause for type `A' were not present, then the pointer
would be a fat pointer, where one component is a pointer to the bounds,
and all would be well.  But with the size clause present, the
conversion from fat pointer to thin pointer in the call loses the
bounds, and so this is erroneous, and the program likely raises a
`Program_Error' exception.

In general, it is advisable to completely avoid mixing the use of
thin pointers and the use of `Unrestricted_Access' where the designated
type is an unconstrained array.  The use of thin pointers should be
restricted to cases of porting legacy code that implicitly assumes the
size of pointers, and such code should not in any case be using this
attribute.

Another erroneous situation arises if the attribute is applied to a
constant. The resulting pointer can be used to access the constant, but
the effect of trying to modify a constant in this manner is not
well-defined. Consider this example:

P : constant Integer := 4;
type R is access all Integer;
RV : R := P'Unrestricted_Access;

RV.all := 3;

Here we attempt to modify the constant P from 4 to 3, but the compiler
may or may not notice this attempt, and subsequent references to P may
yield either the value 3 or the value 4 or the assignment may blow up
if the compiler decides to put P in read-only memory. One particular
case where `Unrestricted_Access' can be used in this way is to modify
the value of an `IN' parameter:

procedure K (S : in String) is
type R is access all Character;
RV : R := S (3)'Unrestricted_Access;
begin
RV.all := 'a';
end;

In general this is a risky approach. It may appear to "work" but such
uses of `Unrestricted_Access' are potentially non-portable, even from
one version of `GNAT' to another, so are best avoided if possible.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Update" origin = "GNAT RM" category = "unknown">
      <DOC>
The `Update' attribute creates a copy of an array or record value with
one or more modified components. The syntax is:

PREFIX'Update ( RECORD_COMPONENT_ASSOCIATION_LIST )
PREFIX'Update ( ARRAY_COMPONENT_ASSOCIATION {, ARRAY_COMPONENT_ASSOCIATION } )
PREFIX'Update ( MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION
{, MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION } )

MULTIDIMENSIONAL_ARRAY_COMPONENT_ASSOCIATION ::= INDEX_EXPRESSION_LIST_LIST =&gt; EXPRESSION
INDEX_EXPRESSION_LIST_LIST                   ::= INDEX_EXPRESSION_LIST {| INDEX_EXPRESSION_LIST }
INDEX_EXPRESSION_LIST                        ::= ( EXPRESSION {, EXPRESSION } )

where `PREFIX' is the name of an array or record object, and the
association list in parentheses does not contain an `others' choice.
The effect is to yield a copy of the array or record value which is
unchanged apart from the components mentioned in the association list,
which are changed to the indicated value. The original value of the
array or record value is not affected. For example:

type Arr is Array (1 .. 5) of Integer;

Avar1 : Arr := (1,2,3,4,5);
Avar2 : Arr := Avar1'Update (2 =&gt; 10, 3 .. 4 =&gt; 20);

yields a value for `Avar2' of 1,10,20,20,5 with `Avar1' begin
unmodified. Similarly:

type Rec is A, B, C : Integer;

Rvar1 : Rec := (A =&gt; 1, B =&gt; 2, C =&gt; 3);
Rvar2 : Rec := Rvar1'Update (B =&gt; 20);

yields a value for `Rvar2' of (A =&gt; 1, B =&gt; 20, C =&gt; 3), with `Rvar1'
being unmodifed.  Note that the value of the attribute reference is
computed completely before it is used. This means that if you write:

Avar1 := Avar1'Update (1 =&gt; 10, 2 =&gt; Function_Call);

then the value of `Avar1' is not modified if `Function_Call' raises an
exception, unlike the effect of a series of direct assignments to
elements of `Avar1'. In general this requires that two extra complete
copies of the object are required, which should be kept in mind when
considering efficiency.

The `Update' attribute cannot be applied to prefixes of a limited
type, and cannot reference discriminants in the case of a record type.
The accessibility level of an Update attribute result object is defined
as for an aggregate.

In the record case, no component can be mentioned more than once. In
the array case, two overlapping ranges can appear in the association
list, in which case the modifications are processed left to right.

Multi-dimensional arrays can be modified, as shown by this example:

A : array (1 .. 10, 1 .. 10) of Integer;

A := A'Update ((1, 2) =&gt; 20, (3, 4) =&gt; 30);

which changes element (1,2) to 20 and (3,4) to 30.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "VADS_Size" origin = "GNAT RM" category = "variable">
      <DOC>
The `'VADS_Size' attribute is intended to make it easier to port legacy
code which relies on the semantics of `'Size' as implemented by the
VADS Ada 83 compiler.  GNAT makes a best effort at duplicating the same
semantic interpretation.  In particular, `'VADS_Size' applied to a
predefined or other primitive type with no Size clause yields the
Object_Size (for example, `Natural'Size' is 32 rather than 31 on
typical machines).  In addition `'VADS_Size' applied to an object gives
the result that would be obtained by applying the attribute to the
corresponding type.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "258" name = "Val" origin = "Ada RM" category = "function">
      <DOC>
For every discrete subtype S:


S'Val denotes a function with the following specification:


function S'Val(Arg : universal_integer)
return S'Base


This function returns a value of the type of S whose position
number equals the value of Arg. See 3.5.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "262" name = "Valid" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix X that denotes a scalar object (after any
implicit dereference):


Yields True if and only if the object denoted by X is normal,
has a valid representation, and the predicate of the nominal
subtype of X evaluates to True. The value of this attribute is
of the predefined type Boolean. See 13.9.2.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Valid_Scalars" origin = "GNAT RM" category = "unknown">
      <DOC>
The `'Valid_Scalars' attribute is intended to make it easier to check
the validity of scalar subcomponents of composite objects. It is
defined for any prefix `X' that denotes an object.  The value of this
attribute is of the predefined type Boolean.  `X'Valid_Scalars' yields
True if and only if evaluation of `P'Valid' yields True for every
scalar part P of X or if X has no scalar parts. It is not specified in
what order the scalar parts are checked, nor whether any more are
checked after any one of them is determined to be invalid. If the
prefix `X' is of a class-wide type `T'Class' (where `T' is the
associated specific type), or if the prefix `X' is of a specific tagged
type `T', then only the scalar parts of components of `T' are
traversed; in other words, components of extensions of `T' are not
traversed even if `T'Class (X)'Tag /= T'Tag' . The compiler will issue
a warning if it can be determined at compile time that the prefix of
the attribute has no scalar parts (e.g., if the prefix is of an access
type, an interface type, an undiscriminated task type, or an
undiscriminated protected type).

For scalar types, `Valid_Scalars' is equivalent to `Valid'. The use
of this attribute is not permitted for `Unchecked_Union' types for which
in general it is not possible to determine the values of the
discriminants.

Note: `Valid_Scalars' can generate a lot of code, especially in the
case of a large variant record. If the attribute is called in many
places in the same program applied to objects of the same type, it can
reduce program size to write a function with a single use of the
attribute, and then call that function from multiple places.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "264" name = "Value" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Value denotes a function with the following specification:


function S'Value(Arg : String)
return S'Base


This function returns a value given an image of the value as a
String, ignoring any leading or trailing spaces. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Value_Size" origin = "GNAT RM" category = "variable">
      <DOC>
`TYPE'Value_Size' is the number of bits required to represent a value
of the given subtype.  It is the same as `TYPE'Size', but, unlike
`Size', may be set for non-first subtypes.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "268/1" name = "Version" origin = "Ada RM" category = "variable">
      <DOC>
For a prefix P that statically denotes a program unit:


Yields a value of the predefined type String that identifies
the version of the compilation unit that contains the
declaration of the program unit. See E.3.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Wchar_T_Size" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Wchar_T_Size' (`Standard' is the only permissible prefix)
provides the size in bits of the C `wchar_t' type primarily for
constructing the definition of this type in package `Interfaces.C'. The
result is a static constant.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "270" name = "Wide_Image" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Wide_Image denotes a function with the following
specification:


function S'Wide_Image(Arg : S'Base)
return Wide_String


The function returns an image of the value of Arg as a
Wide_String. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "274" name = "Wide_Value" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Wide_Value denotes a function with the following
specification:


function S'Wide_Value(Arg : Wide_String)
return S'Base


This function returns a value given an image of the value as a
Wide_String, ignoring any leading or trailing spaces. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "277.1/2" name = "Wide_Wide_Image" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Wide_Wide_Image denotes a function with the following
specification:


function S'Wide_Wide_Image(Arg : S'Base)
return Wide_Wide_String


The function returns an image of the value of Arg, that is, a
sequence of characters representing the value in display form.
See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "277.5/2" name = "Wide_Wide_Value" origin = "Ada RM" category = "function">
      <DOC>
For every scalar subtype S:


S'Wide_Wide_Value denotes a function with the following
specification:


function S'Wide_Wide_Value(Arg : Wide_Wide_String)
return S'Base


This function returns a value given an image of the value as a
Wide_Wide_String, ignoring any leading or trailing spaces. See
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "277.9/2" name = "Wide_Wide_Width" origin = "Ada RM" category = "variable">
      <DOC>
For every scalar subtype S:


S'Wide_Wide_Width denotes the maximum length of a
Wide_Wide_String returned by S'Wide_Wide_Image over all values
of the subtype S. It denotes zero for a subtype that has a
null range. Its type is universal_integer. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "278" name = "Wide_Width" origin = "Ada RM" category = "variable">
      <DOC>
For every scalar subtype S:


S'Wide_Width denotes the maximum length of a Wide_String
returned by S'Wide_Image over all values of the subtype S. It
denotes zero for a subtype that has a null range. Its type is
universal_integer. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "280" name = "Width" origin = "Ada RM" category = "variable">
      <DOC>
For every scalar subtype S:


S'Width denotes the maximum length of a String returned by
S'Image over all values of the subtype S. It denotes zero for
a subtype that has a null range. Its type is
universal_integer. See 3.5.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "0" name = "Word_Size" origin = "GNAT RM" category = "variable">
      <DOC>
`Standard'Word_Size' (`Standard' is the only permissible prefix)
provides the value `System.Word_Size'. The result is a static constant.
      </DOC>
   </ATTRIBUTE>

   <ATTRIBUTE id = "286" name = "Write" origin = "Ada RM" category = "procedure">
      <DOC>
For every subtype S of a specific type T:


S'Write denotes a procedure with the following specification:


procedure S'Write(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T)


S'Write writes the value of Item to Stream. See 13.13.2.
      </DOC>
   </ATTRIBUTE>

   <PRAGMA id = "0" name = "AST_Entry" origin = "GNAT RM">
      <DOC>
Syntax:
pragma AST_Entry (entry_IDENTIFIER);

This pragma is implemented only in the OpenVMS implementation of GNAT.
The argument is the simple name of a single entry; at most one
`AST_Entry' pragma is allowed for any given entry.  This pragma must be
used in conjunction with the `AST_Entry' attribute, and is only allowed
after the entry declaration and in the same task type specification or
single task as the entry to which it applies.  This pragma specifies
that the given entry may be used to handle an OpenVMS asynchronous
system trap (`AST') resulting from an OpenVMS system service call.  The
pragma does not affect normal use of the entry.  For further details on
this pragma, see the DEC Ada Language Reference Manual, section 9.12a.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Abort_Defer" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Abort_Defer;

This pragma must appear at the start of the statement sequence of a
handled sequence of statements (right after the `begin').  It has the
effect of deferring aborts for the sequence of statements (but not for
the declarations or handlers, if any, associated with this statement
sequence).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Abstract_State" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.4.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_05" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_05;
pragma Ada_05 (local_NAME);

A configuration pragma that establishes Ada 2005 mode for the unit to
which it applies, regardless of the mode set by the command line
switches.  This pragma is useful when writing a reusable component that
itself uses Ada 2005 features, but which is intended to be usable from
either Ada 83 or Ada 95 programs.

The one argument form (which is not a configuration pragma) is used
for managing the transition from Ada 95 to Ada 2005 in the run-time
library. If an entity is marked as Ada_2005 only, then referencing the
entity in Ada_83 or Ada_95 mode will generate a warning. In addition,
in Ada_83 or Ada_95 mode, a preference rule is established which does
not choose such an entity unless it is unambiguously specified. This
avoids extra subprograms marked this way from generating ambiguities in
otherwise legal pre-Ada_2005 programs. The one argument form is
intended for exclusive use in the GNAT run-time library.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_12" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_12;
pragma Ada_12 (local_NAME);

A configuration pragma that establishes Ada 2012 mode for the unit to
which it applies, regardless of the mode set by the command line
switches.  This mode is set automatically for the `Ada' and `System'
packages and their children, so you need not specify it in these
contexts.  This pragma is useful when writing a reusable component that
itself uses Ada 2012 features, but which is intended to be usable from
Ada 83, Ada 95, or Ada 2005 programs.

The one argument form, which is not a configuration pragma, is used
for managing the transition from Ada 2005 to Ada 2012 in the run-time
library. If an entity is marked as Ada_201 only, then referencing the
entity in any pre-Ada_2012 mode will generate a warning. In addition,
in any pre-Ada_2012 mode, a preference rule is established which does
not choose such an entity unless it is unambiguously specified. This
avoids extra subprograms marked this way from generating ambiguities in
otherwise legal pre-Ada_2012 programs. The one argument form is
intended for exclusive use in the GNAT run-time library.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_2005" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_2005;

This configuration pragma is a synonym for pragma Ada_05 and has the
same syntax and effect.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_2012" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_2012;

This configuration pragma is a synonym for pragma Ada_12 and has the
same syntax and effect.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_83" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_83;

A configuration pragma that establishes Ada 83 mode for the unit to
which it applies, regardless of the mode set by the command line
switches.  In Ada 83 mode, GNAT attempts to be as compatible with the
syntax and semantics of Ada 83, as defined in the original Ada 83
Reference Manual as possible.  In particular, the keywords added by Ada
95 and Ada 2005 are not recognized, optional package bodies are allowed,
and generics may name types with unknown discriminants without using
the `(&lt;&gt;)' notation.  In addition, some but not all of the additional
restrictions of Ada 83 are enforced.

Ada 83 mode is intended for two purposes.  Firstly, it allows
existing Ada 83 code to be compiled and adapted to GNAT with less
effort.  Secondly, it aids in keeping code backwards compatible with
Ada 83.  However, there is no guarantee that code that is processed
correctly by GNAT in Ada 83 mode will in fact compile and execute with
an Ada 83 compiler, since GNAT does not enforce all the additional
checks required by Ada 83.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ada_95" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Ada_95;

A configuration pragma that establishes Ada 95 mode for the unit to
which it applies, regardless of the mode set by the command line
switches.  This mode is set automatically for the `Ada' and `System'
packages and their children, so you need not specify it in these
contexts.  This pragma is useful when writing a reusable component that
itself uses Ada 95 features, but which is intended to be usable from
either Ada 83 or Ada 95 programs.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "All_Calls_Remote" origin = "Ada RM">
      <DOC>
Syntax:

pragma All_Calls_Remote [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Allow_Integer_Address" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Allow_Integer_Address;

In almost all versions of GNAT, `System.Address' is a private type in
accordance with the implementation advice in the RM. This means that
integer values, in particular integer literals, are not allowed as
address values.  If the configuration pragma `Allow_Integer_Address' is
given, then integer expressions may be used anywhere a value of type
`System.Address' is required.  The effect is to introduce an implicit
unchecked conversion from the integer value to type `System.Address'.
The reverse case of using an address where an integer type is required
is handled analogously.  The following example compiles without errors:

pragma Allow_Integer_Address;
with System; use System;
package AddrAsInt is
X : Integer;
Y : Integer;
for X'Address use 16#1240#;
for Y use at 16#3230#;
m : Address := 16#4000#;
n : constant Address := 4000;
p : constant Address := Address (X + Y);
v : Integer := y'Address;
w : constant Integer := Integer (Y'Address);
type R is new integer;
RR : R := 1000;
Z : Integer;
for Z'Address use RR;
end AddrAsInt;

Note that pragma `Allow_Integer_Address' is ignored if `System.Address'
is not a private type. In implementations of `GNAT' where
System.Address is a visible integer type (notably the implementations
for `OpenVMS'), this pragma serves no purpose but is ignored rather
than rejected to allow common sets of sources to be used in the two
situations.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Annotate" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Annotate (IDENTIFIER [,IDENTIFIER {, ARG}] [entity =&gt; local_NAME]);

ARG ::= NAME | EXPRESSION

This pragma is used to annotate programs.  IDENTIFIER identifies the
type of annotation.  GNAT verifies that it is an identifier, but does
not otherwise analyze it. The second optional identifier is also left
unanalyzed, and by convention is used to control the action of the tool
to which the annotation is addressed.  The remaining ARG arguments can
be either string literals or more generally expressions.  String
literals are assumed to be either of type `Standard.String' or else
`Wide_String' or `Wide_Wide_String' depending on the character literals
they contain.  All other kinds of arguments are analyzed as
expressions, and must be unambiguous. The last argument if present must
have the identifier `Entity' and GNAT verifies that a local name is
given.

The analyzed pragma is retained in the tree, but not otherwise
processed by any part of the GNAT compiler, except to generate
corresponding note lines in the generated ALI file. For the format of
these note lines, see the compiler source file lib-writ.ads. This
pragma is intended for use by external tools, including ASIS. The use
of pragma Annotate does not affect the compilation process in any way.
This pragma may be used as a configuration pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Assert" origin = "Ada RM">
      <DOC>
Syntax:
pragma Assert (
boolean_EXPRESSION
[, string_EXPRESSION]);

The effect of this pragma depends on whether the corresponding command
line switch is set to activate assertions.  The pragma expands into code
equivalent to the following:

if assertions-enabled then
if not boolean_EXPRESSION then
System.Assertions.Raise_Assert_Failure
(string_EXPRESSION);
end if;
end if;

The string argument, if given, is the message that will be associated
with the exception occurrence if the exception is raised.  If no second
argument is given, the default message is `FILE:NNN', where FILE is the
name of the source file containing the assert, and NNN is the line
number of the assert.  A pragma is not a statement, so if a statement
sequence contains nothing but a pragma assert, then a null statement is
required in addition, as in:


if J &gt; 3 then
pragma Assert (K &gt; 3, "Bad value for K");
null;
end if;

Note that, as with the `if' statement to which it is equivalent, the
type of the expression is either `Standard.Boolean', or any type derived
from this standard type.

Assert checks can be either checked or ignored. By default they are
ignored.  They will be checked if either the command line switch
`-gnata' is used, or if an `Assertion_Policy' or `Check_Policy' pragma
is used to enable `Assert_Checks'.

If assertions are ignored, then there is no run-time effect (and in
particular, any side effects from the expression will not occur at run
time).  (The expression is still analyzed at compile time, and may
cause types to be frozen if they are mentioned here for the first time).

If assertions are checked, then the given expression is tested, and
if it is `False' then `System.Assertions.Raise_Assert_Failure' is called
which results in the raising of `Assert_Failure' with the given message.

You should generally avoid side effects in the expression arguments
of this pragma, because these side effects will turn on and off with the
setting of the assertions mode, resulting in assertions that have an
effect on the program.  However, the expressions are analyzed for
semantic correctness whether or not assertions are enabled, so turning
assertions on and off cannot affect the legality of a program.

Note that the implementation defined policy `DISABLE', given in a
pragma `Assertion_Policy', can be used to suppress this semantic
analysis.

Note: this is a standard language-defined pragma in versions of Ada
from 2005 on. In GNAT, it is implemented in all versions of Ada, and
the DISABLE policy is an implementation-defined addition.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Assert_And_Cut" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Assert_And_Cut (
boolean_EXPRESSION
[, string_EXPRESSION]);

The effect of this pragma is identical to that of pragma `Assert',
except that in an `Assertion_Policy' pragma, the identifier
`Assert_And_Cut' is used to control whether it is ignored or checked
(or disabled).

The intention is that this be used within a subprogram when the
given test expresion sums up all the work done so far in the
subprogram, so that the rest of the subprogram can be verified
(informally or formally) using only the entry preconditions, and the
expression in this pragma. This allows dividing up a subprogram into
sections for the purposes of testing or formal verification. The pragma
also serves as useful documentation.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Assertion_Policy" origin = "Ada RM">
      <DOC>
Syntax:
pragma Assertion_Policy (CHECK | DISABLE | IGNORE);

pragma Assertion_Policy (
ASSERTION_KIND =&gt; POLICY_IDENTIFIER
{, ASSERTION_KIND =&gt; POLICY_IDENTIFIER});

ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND

RM_ASSERTION_KIND ::= Assert               |
Static_Predicate     |
Dynamic_Predicate    |
Pre                  |
Pre'Class            |
Post                 |
Post'Class           |
Type_Invariant       |
Type_Invariant'Class

ID_ASSERTION_KIND ::= Assertions           |
Assert_And_Cut       |
Assume               |
Contract_Cases       |
Debug                |
Invariant            |
Invariant'Class      |
Loop_Invariant       |
Loop_Variant         |
Postcondition        |
Precondition         |
Predicate            |
Refined_Post         |
Statement_Assertions

POLICY_IDENTIFIER ::= Check | Disable | Ignore

This is a standard Ada 2012 pragma that is available as an
implementation-defined pragma in earlier versions of Ada.  The
assertion kinds `RM_ASSERTION_KIND' are those defined in the Ada
standard. The assertion kinds `ID_ASSERTION_KIND' are implementation
defined additions recognized by the GNAT compiler.

The pragma applies in both cases to pragmas and aspects with matching
names, e.g. `Pre' applies to the Pre aspect, and `Precondition' applies
to both the `Precondition' pragma and the aspect `Precondition'. Note
that the identifiers for pragmas Pre_Class and Post_Class are Pre'Class
and Post'Class (not Pre_Class and Post_Class), since these pragmas are
intended to be identical to the corresponding aspects).

If the policy is `CHECK', then assertions are enabled, i.e.  the
corresponding pragma or aspect is activated.  If the policy is
`IGNORE', then assertions are ignored, i.e.  the corresponding pragma
or aspect is deactivated.  This pragma overrides the effect of the
`-gnata' switch on the command line.

The implementation defined policy `DISABLE' is like `IGNORE' except
that it completely disables semantic checking of the corresponding
pragma or aspect. This is useful when the pragma or aspect argument
references subprograms in a with'ed package which is replaced by a
dummy package for the final build.

The implementation defined assertion kind `Assertions' applies to all
assertion kinds. The form with no assertion kind given implies this
choice, so it applies to all assertion kinds (RM defined, and
implementation defined).

The implementation defined assertion kind `Statement_Assertions'
applies to `Assert', `Assert_And_Cut', `Assume', `Loop_Invariant', and
`Loop_Variant'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Assume" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Assume (
boolean_EXPRESSION
[, string_EXPRESSION]);

The effect of this pragma is identical to that of pragma `Assert',
except that in an `Assertion_Policy' pragma, the identifier `Assume' is
used to control whether it is ignored or checked (or disabled).

The intention is that this be used for assumptions about the
external environment. So you cannot expect to verify formally or
informally that the condition is met, this must be established by
examining things outside the program itself.  For example, we may have
code that depends on the size of `Long_Long_Integer' being at least 64.
So we could write:

pragma Assume (Long_Long_Integer'Size &gt;= 64);

This assumption cannot be proved from the program itself, but it acts
as a useful run-time check that the assumption is met, and documents
the need to ensure that it is met by reference to information outside
the program.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Assume_No_Invalid_Values" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Assume_No_Invalid_Values (On | Off);

This is a configuration pragma that controls the assumptions made by the
compiler about the occurrence of invalid representations (invalid
values) in the code.

The default behavior (corresponding to an Off argument for this
pragma), is to assume that values may in general be invalid unless the
compiler can prove they are valid. Consider the following example:

V1 : Integer range 1 .. 10;
V2 : Integer range 11 .. 20;

for J in V2 .. V1 loop

end loop;

if V1 and V2 have valid values, then the loop is known at compile time
not to execute since the lower bound must be greater than the upper
bound. However in default mode, no such assumption is made, and the
loop may execute. If `Assume_No_Invalid_Values (On)' is given, the
compiler will assume that any occurrence of a variable other than in an
explicit `'Valid' test always has a valid value, and the loop above
will be optimized away.

The use of `Assume_No_Invalid_Values (On)' is appropriate if you
know your code is free of uninitialized variables and other possible
sources of invalid representations, and may result in more efficient
code. A program that accesses an invalid representation with this
pragma in effect is erroneous, so no guarantees can be made about its
behavior.

It is peculiar though permissible to use this pragma in conjunction
with validity checking (-gnatVa). In such cases, accessing invalid
values will generally give an exception, though formally the program is
erroneous so there are no guarantees that this will always be the case,
and it is recommended that these two options not be used together.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ast_Entry" origin = "GNAT RM">
      <DOC>
Syntax:
pragma AST_Entry (entry_IDENTIFIER);

This pragma is implemented only in the OpenVMS implementation of GNAT.
The argument is the simple name of a single entry; at most one
`AST_Entry' pragma is allowed for any given entry.  This pragma must be
used in conjunction with the `AST_Entry' attribute, and is only allowed
after the entry declaration and in the same task type specification or
single task as the entry to which it applies.  This pragma specifies
that the given entry may be used to handle an OpenVMS asynchronous
system trap (`AST') resulting from an OpenVMS system service call.  The
pragma does not affect normal use of the entry.  For further details on
this pragma, see the DEC Ada Language Reference Manual, section 9.12a.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Async_Readers" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Async_Writers" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Asynchronous" origin = "Ada RM">
      <DOC>
Syntax:

pragma Asynchronous;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Atomic" origin = "Ada RM">
      <DOC>
Syntax:

pragma Atomic;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Atomic_Components" origin = "Ada RM">
      <DOC>
Syntax:

pragma Atomic_Components;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Attach_Handler" origin = "Ada RM">
      <DOC>
Syntax:

pragma Attach_Handler;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Attribute_Definition" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Attribute_Definition
([Attribute  =&gt;] ATTRIBUTE_DESIGNATOR,
[Entity     =&gt;] LOCAL_NAME,
[Expression =&gt;] EXPRESSION | NAME);

If `Attribute' is a known attribute name, this pragma is equivalent to
the attribute definition clause:

for Entity'Attribute use Expression;

If `Attribute' is not a recognized attribute name, the pragma is
ignored, and a warning is emitted. This allows source code to be
written that takes advantage of some new attribute, while remaining
compilable with earlier compilers.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CIL_Constructor" origin = "GNAT RM">
      <DOC>
Syntax:

pragma CIL_Constructor ([Entity =&gt;] function_LOCAL_NAME);

This pragma is used to assert that the specified Ada function should be
mapped to the .NET constructor for some Ada tagged record type.

See section 4.1 of the `GNAT User's Guide: Supplement for the .NET
Platform.' for related information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CPP_Class" origin = "GNAT RM">
      <DOC>
Syntax:

pragma CPP_Class ([Entity =&gt;] LOCAL_NAME);

The argument denotes an entity in the current declarative region that is
declared as a record type. It indicates that the type corresponds to an
externally declared C++ class type, and is to be laid out the same way
that C++ would lay out the type. If the C++ class has virtual primitives
then the record must be declared as a tagged record type.

Types for which `CPP_Class' is specified do not have assignment or
equality operators defined (such operations can be imported or declared
as subprograms as required). Initialization is allowed only by
constructor functions (see pragma `CPP_Constructor'). Such types are
implicitly limited if not explicitly declared as limited or derived
from a limited type, and an error is issued in that case.

See *note Interfacing to C++:: for related information.

Note: Pragma `CPP_Class' is currently obsolete. It is supported for
backward compatibility but its functionality is available using pragma
`Import' with `Convention' = `CPP'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CPP_Constructor" origin = "GNAT RM">
      <DOC>
Syntax:

pragma CPP_Constructor ([Entity =&gt;] LOCAL_NAME
[, [External_Name =&gt;] static_string_EXPRESSION ]
[, [Link_Name     =&gt;] static_string_EXPRESSION ]);

This pragma identifies an imported function (imported in the usual way
with pragma `Import') as corresponding to a C++ constructor. If
`External_Name' and `Link_Name' are not specified then the `Entity'
argument is a name that must have been previously mentioned in a pragma
`Import' with `Convention' = `CPP'. Such name must be of one of the
following forms:

* `function FNAME return T'

* `function FNAME return T'Class'

* `function FNAME (...) return T'

* `function FNAME (...) return T'Class'

where T is a limited record type imported from C++ with pragma `Import'
and `Convention' = `CPP'.

The first two forms import the default constructor, used when an
object of type T is created on the Ada side with no explicit
constructor.  The latter two forms cover all the non-default
constructors of the type.  See the GNAT Pro User's Guide for details.

If no constructors are imported, it is impossible to create any
objects on the Ada side and the type is implicitly declared abstract.

Pragma `CPP_Constructor' is intended primarily for automatic
generation using an automatic binding generator tool (such as the
`-fdump-ada-spec' GCC switch).  See *note Interfacing to C++:: for more
related information.

Note: The use of functions returning class-wide types for
constructors is currently obsolete. They are supported for backward
compatibility. The use of functions returning the type T leave the Ada
sources more clear because the imported C++ constructors always return
an object of type T; that is, they never return an object whose type is
a descendant of type T.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CPP_Virtual" origin = "GNAT RM">
      <DOC>
This pragma is now obsolete and, other than generating a warning if
warnings on obsolescent features are enabled, is completely ignored.
It is retained for compatibility purposes. It used to be required to
ensure compoatibility with C++, but is no longer required for that
purpose because GNAT generates the same object layout as the G++
compiler by default.

See *note Interfacing to C++:: for related information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CPP_Vtable" origin = "GNAT RM">
      <DOC>
This pragma is now obsolete and, other than generating a warning if
warnings on obsolescent features are enabled, is completely ignored.
It used to be required to ensure compatibility with C++, but is no
longer required for that purpose because GNAT generates the same object
layout as the G++ compiler by default.

See *note Interfacing to C++:: for related information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "CPU" origin = "Ada RM">
      <DOC>
Syntax:

pragma CPU (EXPRESSION);

This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "C_Pass_By_Copy" origin = "GNAT RM">
      <DOC>
Syntax:
pragma C_Pass_By_Copy
([Max_Size =&gt;] static_integer_EXPRESSION);

Normally the default mechanism for passing C convention records to C
convention subprograms is to pass them by reference, as suggested by RM
B.3(69).  Use the configuration pragma `C_Pass_By_Copy' to change this
default, by requiring that record formal parameters be passed by copy
if all of the following conditions are met:

* The size of the record type does not exceed the value specified for
`Max_Size'.

* The record type has `Convention C'.

* The formal parameter has this record type, and the subprogram has a
foreign (non-Ada) convention.

If these conditions are met the argument is passed by copy, i.e. in a
manner consistent with what C expects if the corresponding formal in the
C prototype is a struct (rather than a pointer to a struct).

You can also pass records by copy by specifying the convention
`C_Pass_By_Copy' for the record type, or by using the extended `Import'
and `Export' pragmas, which allow specification of passing mechanisms
on a parameter by parameter basis.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Check" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Check (
[Name    =&gt;] CHECK_KIND,
[Check   =&gt;] Boolean_EXPRESSION
[, [Message =&gt;] string_EXPRESSION] );

CHECK_KIND ::= IDENTIFIER           |
Pre'Class            |
Post'Class           |
Type_Invariant'Class |
Invariant'Class

This pragma is similar to the predefined pragma `Assert' except that an
extra identifier argument is present. In conjunction with pragma
`Check_Policy', this can be used to define groups of assertions that can
be independently controlled. The identifier `Assertion' is special, it
refers to the normal set of pragma `Assert' statements.

Checks introduced by this pragma are normally deactivated by
default. They can be activated either by the command line option
`-gnata', which turns on all checks, or individually controlled using
pragma `Check_Policy'.

The identifiers `Assertions' and `Statement_Assertions' are not
permitted as check kinds, since this would cause confusion with the use
of these identifiers in `Assertion_Policy' and `Check_Policy' pragmas,
where they are used to refer to sets of assertions.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Check_Float_Overflow" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Check_Float_Overflow;

In Ada, the predefined floating-point types (`Short_Float', `Float',
`Long_Float', `Long_Long_Float') are defined to be _unconstrained_.
This means that even though each has a well-defined base range, an
operation that delivers a result outside this base range is not
required to raise an exception.  This implementation permission
accommodates the notion of infinities in IEEE floating-point, and
corresponds to the efficient execution mode on most machines. GNAT will
not raise overflow exceptions on these machines; instead it will
generate infinities and NaN's as defined in the IEEE standard.

Generating infinities, although efficient, is not always desirable.
Often the preferable approach is to check for overflow, even at the
(perhaps considerable) expense of run-time performance.  This can be
accomplished by defining your own constrained floating-point subtypes -
i.e., by supplying explicit range constraints - and indeed such a
subtype can have the same base range as its base type. For example:

subtype My_Float is Float range Float'Range;

Here `My_Float' has the same range as `Float' but is constrained, so
operations on `My_Float' values will be checked for overflow against
this range.

This style will achieve the desired goal, but it is often more
convenient to be able to simply use the standard predefined
floating-point types as long as overflow checking could be guaranteed.
The `Check_Float_Overflow' configuration pragma achieves this effect.
If a unit is compiled subject to this configuration pragma, then all
operations on predefined floating-point types including operations on
base types of these floating-point types will be treated as though
those types were constrained, and overflow checks will be generated.
The `Constraint_Error' exception is raised if the result is out of
range.

This mode can also be set by use of the compiler switch `-gnateF'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Check_Name" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Check_Name (check_name_IDENTIFIER);

This is a configuration pragma that defines a new implementation
defined check name (unless IDENTIFIER matches one of the predefined
check names, in which case the pragma has no effect). Check names are
global to a partition, so if two or more configuration pragmas are
present in a partition mentioning the same name, only one new check
name is introduced.

An implementation defined check name introduced with this pragma may
be used in only three contexts: `pragma Suppress', `pragma Unsuppress',
and as the prefix of a `Check_Name'Enabled' attribute reference. For
any of these three cases, the check name must be visible. A check name
is visible if it is in the configuration pragmas applying to the
current unit, or if it appears at the start of any unit that is part of
the dependency set of the current unit (e.g., units that are mentioned
in `with' clauses).

Check names introduced by this pragma are subject to control by
compiler switches (in particular -gnatp) in the usual manner.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Check_Policy" origin = "GNAT RM">
      <DOC>
Syntax:
pragma Check_Policy
([Name   =&gt;] CHECK_KIND,
[Policy =&gt;] POLICY_IDENTIFIER);

pragma Check_Policy (
CHECK_KIND =&gt; POLICY_IDENTIFIER
{, CHECK_KIND =&gt; POLICY_IDENTIFIER});

ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND

CHECK_KIND ::= IDENTIFIER           |
Pre'Class            |
Post'Class           |
Type_Invariant'Class |
Invariant'Class

The identifiers Name and Policy are not allowed as CHECK_KIND values. This
avoids confusion between the two possible syntax forms for this pragma.

POLICY_IDENTIFIER ::= ON | OFF | CHECK | DISABLE | IGNORE

This pragma is used to set the checking policy for assertions (specified
by aspects or pragmas), the `Debug' pragma, or additional checks to be
checked using the `Check' pragma. It may appear either as a
configuration pragma, or within a declarative part of package. In the
latter case, it applies from the point where it appears to the end of
the declarative region (like pragma `Suppress').

The `Check_Policy' pragma is similar to the predefined
`Assertion_Policy' pragma, and if the check kind corresponds to one of
the assertion kinds that are allowed by `Assertion_Policy', then the
effect is identical.

If the first argument is Debug, then the policy applies to Debug
pragmas, disabling their effect if the policy is `OFF', `DISABLE', or
`IGNORE', and allowing them to execute with normal semantics if the
policy is `ON' or `CHECK'. In addition if the policy is `DISABLE', then
the procedure call in `Debug' pragmas will be totally ignored and not
analyzed semantically.

Finally the first argument may be some other identifier than the
above possibilities, in which case it controls a set of named assertions
that can be checked using pragma `Check'. For example, if the pragma:

pragma Check_Policy (Critical_Error, OFF);

is given, then subsequent `Check' pragmas whose first argument is also
`Critical_Error' will be disabled.

The check policy is `OFF' to turn off corresponding checks, and `ON'
to turn on corresponding checks. The default for a set of checks for
which no `Check_Policy' is given is `OFF' unless the compiler switch
`-gnata' is given, which turns on all checks by default.

The check policy settings `CHECK' and `IGNORE' are recognized as
synonyms for `ON' and `OFF'. These synonyms are provided for
compatibility with the standard `Assertion_Policy' pragma. The check
policy setting `DISABLE' causes the second argument of a corresponding
`Check' pragma to be completely ignored and not analyzed.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Comment" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Comment (static_string_EXPRESSION);

This is almost identical in effect to pragma `Ident'.  It allows the
placement of a comment into the object file and hence into the
executable file if the operating system permits such usage.  The
difference is that `Comment', unlike `Ident', has no limitations on
placement of the pragma (it can be placed anywhere in the main source
unit), and if more than one pragma is used, all comments are retained.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Common_Object" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Common_Object (
[Internal =&gt;] LOCAL_NAME
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Size     =&gt;] EXTERNAL_SYMBOL] );

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma enables the shared use of variables stored in overlaid
linker areas corresponding to the use of `COMMON' in Fortran.  The
single object LOCAL_NAME is assigned to the area designated by the
EXTERNAL argument.  You may define a record to correspond to a series
of fields.  The SIZE argument is syntax checked in GNAT, but otherwise
ignored.

`Common_Object' is not supported on all platforms.  If no support is
available, then the code generator will issue a message indicating that
the necessary attribute for implementation of this pragma is not
available.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Compile_Time_Error" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Compile_Time_Error
(boolean_EXPRESSION, static_string_EXPRESSION);

This pragma can be used to generate additional compile time error
messages. It is particularly useful in generics, where errors can be
issued for specific problematic instantiations. The first parameter is
a boolean expression. The pragma is effective only if the value of this
expression is known at compile time, and has the value True. The set of
expressions whose values are known at compile time includes all static
boolean expressions, and also other values which the compiler can
determine at compile time (e.g., the size of a record type set by an
explicit size representation clause, or the value of a variable which
was initialized to a constant and is known not to have been modified).
If these conditions are met, an error message is generated using the
value given as the second argument. This string value may contain
embedded ASCII.LF characters to break the message into multiple lines.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Compile_Time_Warning" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Compile_Time_Warning
(boolean_EXPRESSION, static_string_EXPRESSION);

Same as pragma Compile_Time_Error, except a warning is issued instead
of an error message. Note that if this pragma is used in a package that
is with'ed by a client, the client will get the warning even though it
is issued by a with'ed package (normally warnings in with'ed units are
suppressed, but this is a special exception to that rule).

One typical use is within a generic where compile time known
characteristics of formal parameters are tested, and warnings given
appropriately. Another use with a first parameter of True is to warn a
client about use of a package, for example that it is not fully
implemented.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Compiler_Unit" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Compiler_Unit;

This pragma is obsolete. It is equivalent to Compiler_Unit_Warning. It
is retained so that old versions of the GNAT run-time that use this
pragma can be compiled with newer versions of the compiler.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Compiler_Unit_Warning" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Compiler_Unit_Warning;

This pragma is intended only for internal use in the GNAT run-time
library.  It indicates that the unit is used as part of the compiler
build. The effect is to generate warnings for the use of constructs
(for example, conditional expressions) that would cause trouble when
bootstrapping using an older version of GNAT. For the exact list of
restrictions, see the compiler sources and references to
Check_Compiler_Unit.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Complete_Representation" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Complete_Representation;

This pragma must appear immediately within a record representation
clause. Typical placements are before the first component clause or
after the last component clause. The effect is to give an error message
if any component is missing a component clause. This pragma may be used
to ensure that a record representation clause is complete, and that
this invariant is maintained if fields are added to the record in the
future.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Complex_Representation" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Complex_Representation
([Entity =&gt;] LOCAL_NAME);

The ENTITY argument must be the name of a record type which has two
fields of the same floating-point type.  The effect of this pragma is
to force gcc to use the special internal complex representation form for
this record, which may be more efficient.  Note that this may result in
the code for this type not conforming to standard ABI (application
binary interface) requirements for the handling of record types.  For
example, in some environments, there is a requirement for passing
records by pointer, and the use of this pragma may result in passing
this type in floating-point registers.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Component_Alignment" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Component_Alignment (
[Form =&gt;] ALIGNMENT_CHOICE
[, [Name =&gt;] type_LOCAL_NAME]);

ALIGNMENT_CHOICE ::=
Component_Size
| Component_Size_4
| Storage_Unit
| Default

Specifies the alignment of components in array or record types.  The
meaning of the FORM argument is as follows:

`Component_Size'
Aligns scalar components and subcomponents of the array or record
type on boundaries appropriate to their inherent size (naturally
aligned).  For example, 1-byte components are aligned on byte
boundaries, 2-byte integer components are aligned on 2-byte
boundaries, 4-byte integer components are aligned on 4-byte
boundaries and so on.  These alignment rules correspond to the
normal rules for C compilers on all machines except the VAX.

`Component_Size_4'
Naturally aligns components with a size of four or fewer bytes.
Components that are larger than 4 bytes are placed on the next
-byte boundary.

`Storage_Unit'
Specifies that array or record components are byte aligned, i.e.
aligned on boundaries determined by the value of the constant
`System.Storage_Unit'.

`Default'
Specifies that array or record components are aligned on default
boundaries, appropriate to the underlying hardware or operating
system or both.  For OpenVMS VAX systems, the `Default' choice is
the same as the `Storage_Unit' choice (byte alignment).  For all
other systems, the `Default' choice is the same as
`Component_Size' (natural alignment).

If the `Name' parameter is present, TYPE_LOCAL_NAME must refer to a
local record or array type, and the specified alignment choice applies
to the specified type.  The use of `Component_Alignment' together with
a pragma `Pack' causes the `Component_Alignment' pragma to be ignored.
The use of `Component_Alignment' together with a record representation
clause is only effective for fields not specified by the representation
clause.

If the `Name' parameter is absent, the pragma can be used as either
a configuration pragma, in which case it applies to one or more units in
accordance with the normal rules for configuration pragmas, or it can be
used within a declarative part, in which case it applies to types that
are declared within this declarative part, or within any nested scope
within this declarative part.  In either case it specifies the alignment
to be applied to any record or array type which has otherwise standard
representation.

If the alignment for a record or array type is not specified (using
pragma `Pack', pragma `Component_Alignment', or a record rep clause),
the GNAT uses the default alignment as described previously.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Contract_Cases" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Contract_Cases (
Condition =&gt; Consequence
{,Condition =&gt; Consequence});

The `Contract_Cases' pragma allows defining fine-grain specifications
that can complement or replace the contract given by a precondition and
a postcondition. Additionally, the `Contract_Cases' pragma can be used
by testing and formal verification tools. The compiler checks its
validity and, depending on the assertion policy at the point of
declaration of the pragma, it may insert a check in the executable. For
code generation, the contract cases

pragma Contract_Cases (
Cond1 =&gt; Pred1,
Cond2 =&gt; Pred2);

are equivalent to

C1 : constant Boolean := Cond1;  --  evaluated at subprogram entry
C2 : constant Boolean := Cond2;  --  evaluated at subprogram entry
pragma Precondition ((C1 and not C2) or (C2 and not C1));
pragma Postcondition (if C1 then Pred1);
pragma Postcondition (if C2 then Pred2);

The precondition ensures that one and only one of the conditions is
satisfied on entry to the subprogram.  The postcondition ensures that
for the condition that was True on entry, the corrresponding
consequence is True on exit. Other consequence expressions are not
evaluated.

A precondition `P' and postcondition `Q' can also be expressed as
contract cases:

pragma Contract_Cases (P =&gt; Q);

The placement and visibility rules for `Contract_Cases' pragmas are
identical to those described for preconditions and postconditions.

The compiler checks that boolean expressions given in conditions and
consequences are valid, where the rules for conditions are the same as
the rule for an expression in `Precondition' and the rules for
consequences are the same as the rule for an expression in
`Postcondition'. In particular, attributes `'Old' and `'Result' can
only be used within consequence expressions.  The condition for the
last contract case may be `others', to denote any case not captured by
the previous cases. The following is an example of use within a package
spec:

package Math_Functions is

function Sqrt (Arg : Float) return Float;
pragma Contract_Cases ((Arg in 0 .. 99) =&gt; Sqrt'Result &lt; 10,
Arg &gt;= 100       =&gt; Sqrt'Result &gt;= 10,
others           =&gt; Sqrt'Result = 0);

end Math_Functions;

The meaning of contract cases is that only one case should apply at each
call, as determined by the corresponding condition evaluating to True,
and that the consequence for this case should hold when the subprogram
returns.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Controlled" origin = "Ada RM">
      <DOC>
Syntax:

pragma Controlled (first_subtype_local_name);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Convention" origin = "Ada RM">
      <DOC>
Syntax:

pragma Convention ([Convention=&gt;]convention_identifier,[Entity=&gt;]local_name);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Convention_Identifier" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Convention_Identifier (
[Name =&gt;]       IDENTIFIER,
[Convention =&gt;] convention_IDENTIFIER);

This pragma provides a mechanism for supplying synonyms for existing
convention identifiers. The `Name' identifier can subsequently be used
as a synonym for the given convention in other pragmas (including for
example pragma `Import' or another `Convention_Identifier' pragma). As
an example of the use of this, suppose you had legacy code which used
Fortran77 as the identifier for Fortran. Then the pragma:

pragma Convention_Identifier (Fortran77, Fortran);

would allow the use of the convention identifier `Fortran77' in
subsequent code, avoiding the need to modify the sources. As another
example, you could use this to parameterize convention requirements
according to systems. Suppose you needed to use `Stdcall' on windows
systems, and `C' on some other system, then you could define a
convention identifier `Library' and use a single
`Convention_Identifier' pragma to specify which convention would be
used system-wide.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Debug" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Debug ([CONDITION, ]PROCEDURE_CALL_WITHOUT_SEMICOLON);

PROCEDURE_CALL_WITHOUT_SEMICOLON ::=
PROCEDURE_NAME
| PROCEDURE_PREFIX ACTUAL_PARAMETER_PART

The procedure call argument has the syntactic form of an expression,
meeting the syntactic requirements for pragmas.

If debug pragmas are not enabled or if the condition is present and
evaluates to False, this pragma has no effect. If debug pragmas are
enabled, the semantics of the pragma is exactly equivalent to the
procedure call statement corresponding to the argument with a
terminating semicolon. Pragmas are permitted in sequences of
declarations, so you can use pragma `Debug' to intersperse calls to
debug procedures in the middle of declarations. Debug pragmas can be
enabled either by use of the command line switch `-gnata' or by use of
the pragma `Check_Policy' with a first argument of `Debug'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Debug_Policy" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Debug_Policy (CHECK | DISABLE | IGNORE | ON | OFF);

This pragma is equivalent to a corresponding `Check_Policy' pragma with
a first argument of `Debug'. It is retained for historical
compatibility reasons.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Default_Scalar_Storage_Order" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Default_Scalar_Storage_Order (High_Order_First | Low_Order_First);

Normally if no explicit `Scalar_Storage_Order' is given for a record
type or array type, then the scalar storage order defaults to the
ordinary default for the target. But this default may be overridden
using this pragma.  The pragma may appear as a configuration pragma, or
locally within a package spec or declarative part. In the latter case,
it applies to all subsequent types declared within that package spec or
declarative part.

If this pragma is used as a configuration pragma which appears
within a configuration pragma file (as opposed to appearing explicitly
at the start of a single unit), then the binder will require that all
units in a partition be compiled in a similar manner, including all
units in the run-time that are included in the partition.

The following example shows the use of this pragma:

pragma Default_Scalar_Storage_Order (High_Order_First);
with System; use System;
package DSSO1 is
type H1 is record
a : Integer;
end record;

type L2 is record
a : Integer;
end record;
for L2'Scalar_Storage_Order use Low_Order_First;

type L2a is new L2;

package Inner is
type H3 is record
a : Integer;
end record;

pragma Default_Scalar_Storage_Order (Low_Order_First);

type L4 is record
a : Integer;
end record;
end Inner;

type H4a is new Inner.L4;

type H5 is record
a : Integer;
end record;
end DSSO1;

In this example record types L.. have `Low_Order_First' scalar storage
order, and record types H.. have `High_Order_First'.  Note that in the
case of `H4a', the order is not inherited from the parent type. Only an
explicitly set `Scalar_Storage_Order' gets inherited on type derivation.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Default_Storage_Pool" origin = "Ada RM">
      <DOC>
Syntax:

pragma Default_Storage_Pool (storage_pool_NAME | null);

This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Depends" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 6.1.5.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Detect_Blocking" origin = "Ada RM">
      <DOC>
Syntax:

pragma Detect_Blocking;

This is a standard pragma in Ada 2005, that is available in all earlier
versions of Ada as an implementation-defined pragma.

This is a configuration pragma that forces the detection of
potentially blocking operations within a protected operation, and to
raise Program_Error if that happens.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Disable_Atomic_Synchronization" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Disable_Atomic_Synchronization [(Entity)];

Ada requires that accesses (reads or writes) of an atomic variable be
regarded as synchronization points in the case of multiple tasks.
Particularly in the case of multi-processors this may require special
handling, e.g. the generation of memory barriers. This capability may
be turned off using this pragma in cases where it is known not to be
required.

The placement and scope rules for this pragma are the same as those
for `pragma Suppress'. In particular it can be used as a configuration
pragma, or in a declaration sequence where it applies till the end of
the scope. If an `Entity' argument is present, the action applies only
to that entity.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Discard_Names" origin = "Ada RM">
      <DOC>
Syntax:

pragma Discard_Names [([On =&gt; ] local_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Dispatching_Domain" origin = "Ada RM">
      <DOC>
Syntax:

pragma Dispatching_Domain (EXPRESSION);

This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Effective_Reads" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Effective_Writes" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Elaborate" origin = "Ada RM">
      <DOC>
Syntax:

pragma Elaborate (library_unit_name{, library_unit_name});
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Elaborate_All" origin = "Ada RM">
      <DOC>
Syntax:

pragma Elaborate_All (library_unit_name{, library_unit_name});
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Elaborate_Body" origin = "Ada RM">
      <DOC>
Syntax:

pragma Elaborate_Body [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Elaboration_Checks" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Elaboration_Checks (Dynamic | Static);

This is a configuration pragma that provides control over the
elaboration model used by the compilation affected by the pragma.  If
the parameter is `Dynamic', then the dynamic elaboration model
described in the Ada Reference Manual is used, as though the `-gnatE'
switch had been specified on the command line.  If the parameter is
`Static', then the default GNAT static model is used.  This
configuration pragma overrides the setting of the command line.  For
full details on the elaboration models used by the GNAT compiler, see
*note Elaboration Order Handling in GNAT: (gnat_ugn)Elaboration Order
Handling in GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Eliminate" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Eliminate ([Entity          =&gt;] DEFINING_DESIGNATOR,
[Source_Location =&gt;] STRING_LITERAL);

The string literal given for the source location is a string which
specifies the line number of the occurrence of the entity, using the
syntax for SOURCE_TRACE given below:

SOURCE_TRACE     ::= SOURCE_REFERENCE [LBRACKET SOURCE_TRACE RBRACKET]

LBRACKET         ::= [
RBRACKET         ::= ]

SOURCE_REFERENCE ::= FILE_NAME : LINE_NUMBER

LINE_NUMBER      ::= DIGIT {DIGIT}

Spaces around the colon in a `Source_Reference' are optional.

The `DEFINING_DESIGNATOR' matches the defining designator used in an
explicit subprogram declaration, where the `entity' name in this
designator appears on the source line specified by the source location.

The source trace that is given as the `Source_Location' shall obey
the following rules. The `FILE_NAME' is the short name (with no
directory information) of an Ada source file, given using exactly the
required syntax for the underlying file system (e.g. case is important
if the underlying operating system is case sensitive). `LINE_NUMBER'
gives the line number of the occurrence of the `entity' as a decimal
literal without an exponent or point. If an `entity' is not declared in
a generic instantiation (this includes generic subprogram instances),
the source trace includes only one source reference. If an entity is
declared inside a generic instantiation, its source trace (when parsing
from left to right) starts with the source location of the declaration
of the entity in the generic unit and ends with the source location of
the instantiation (it is given in square brackets). This approach is
recursively used in case of nested instantiations: the rightmost
(nested most deeply in square brackets) element of the source trace is
the location of the outermost instantiation, the next to left element
is the location of the next (first nested) instantiation in the code of
the corresponding generic unit, and so on, and the leftmost element
(that is out of any square brackets) is the location of the declaration
of the entity to eliminate in a generic unit.

Note that the `Source_Location' argument specifies which of a set of
similarly named entities is being eliminated, dealing both with
overloading, and also appearance of the same entity name in different
scopes.

This pragma indicates that the given entity is not used in the
program to be compiled and built. The effect of the pragma is to allow
the compiler to eliminate the code or data associated with the named
entity. Any reference to an eliminated entity causes a compile-time or
link-time error.

The intention of pragma `Eliminate' is to allow a program to be
compiled in a system-independent manner, with unused entities
eliminated, without needing to modify the source text. Normally the
required set of `Eliminate' pragmas is constructed automatically using
the gnatelim tool.

Any source file change that removes, splits, or adds lines may make
the set of Eliminate pragmas invalid because their `Source_Location'
argument values may get out of date.

Pragma `Eliminate' may be used where the referenced entity is a
dispatching operation. In this case all the subprograms to which the
given operation can dispatch are considered to be unused (are never
called as a result of a direct or a dispatching call).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Enable_Atomic_Synchronization" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Enable_Atomic_Synchronization [(Entity)];

Ada requires that accesses (reads or writes) of an atomic variable be
regarded as synchronization points in the case of multiple tasks.
Particularly in the case of multi-processors this may require special
handling, e.g. the generation of memory barriers. This synchronization
is performed by default, but can be turned off using `pragma
Disable_Atomic_Synchronization'. The `Enable_Atomic_Synchronization'
pragma can be used to turn it back on.

The placement and scope rules for this pragma are the same as those
for `pragma Unsuppress'. In particular it can be used as a
configuration  pragma, or in a declaration sequence where it applies
till the end of the scope. If an `Entity' argument is present, the
action applies only to that entity.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export" origin = "Ada RM">
      <DOC>
Syntax:

pragma Export ([Convention=&gt;]convention_identifier,[Entity=&gt;]local_name;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Exception" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Exception (
[Internal =&gt;] LOCAL_NAME
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Form     =&gt;] Ada | VMS]
[, [Code     =&gt;] static_integer_EXPRESSION]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma is implemented only in the OpenVMS implementation of GNAT.
It causes the specified exception to be propagated outside of the Ada
program, so that it can be handled by programs written in other OpenVMS
languages.  This pragma establishes an external name for an Ada
exception and makes the name available to the OpenVMS Linker as a
global symbol.  For further details on this pragma, see the DEC Ada
Language Reference Manual, section 13.9a3.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Function" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Function (
[Internal         =&gt;] LOCAL_NAME
[, [External         =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types  =&gt;] PARAMETER_TYPES]
[, [Result_Type      =&gt;] result_SUBTYPE_MARK]
[, [Mechanism        =&gt;] MECHANISM]
[, [Result_Mechanism =&gt;] MECHANISM_NAME]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION
| ""

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::= Value | Reference

Use this pragma to make a function externally callable and optionally
provide information on mechanisms to be used for passing parameter and
result values.  We recommend, for the purposes of improving portability,
this pragma always be used in conjunction with a separate pragma
`Export', which must precede the pragma `Export_Function'.  GNAT does
not require a separate pragma `Export', but if none is present,
`Convention Ada' is assumed, which is usually not what is wanted, so it
is usually appropriate to use this pragma in conjunction with a
`Export' or `Convention' pragma that specifies the desired foreign
convention.  Pragma `Export_Function' (and `Export', if present) must
appear in the same declarative region as the function to which they
apply.

INTERNAL_NAME must uniquely designate the function to which the
pragma applies.  If more than one function name exists of this name in
the declarative part you must use the `Parameter_Types' and
`Result_Type' parameters is mandatory to achieve the required unique
designation.  SUBTYPE_MARKs in these parameters must exactly match the
subtypes in the corresponding function specification, using positional
notation to match parameters with subtype marks.  The form with an
`'Access' attribute can be used to match an anonymous access parameter.

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form still
allows the specification of parameter mechanisms.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Object" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Object
[Internal =&gt;] LOCAL_NAME
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Size     =&gt;] EXTERNAL_SYMBOL]

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma designates an object as exported, and apart from the
extended rules for external symbols, is identical in effect to the use
of the normal `Export' pragma applied to an object.  You may use a
separate Export pragma (and you probably should from the point of view
of portability), but it is not required.  SIZE is syntax checked, but
otherwise ignored by GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Procedure" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Procedure (
[Internal        =&gt;] LOCAL_NAME
[, [External        =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types =&gt;] PARAMETER_TYPES]
[, [Mechanism       =&gt;] MECHANISM]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION
| ""

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::= Value | Reference

This pragma is identical to `Export_Function' except that it applies to
a procedure rather than a function and the parameters `Result_Type' and
`Result_Mechanism' are not permitted.  GNAT does not require a separate
pragma `Export', but if none is present, `Convention Ada' is assumed,
which is usually not what is wanted, so it is usually appropriate to
use this pragma in conjunction with a `Export' or `Convention' pragma
that specifies the desired foreign convention.

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form still
allows the specification of parameter mechanisms.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Value" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Value (
[Value     =&gt;] static_integer_EXPRESSION,
[Link_Name =&gt;] static_string_EXPRESSION);

This pragma serves to export a static integer value for external use.
The first argument specifies the value to be exported. The Link_Name
argument specifies the symbolic name to be associated with the integer
value. This pragma is useful for defining a named static value in Ada
that can be referenced in assembly language units to be linked with the
application. This pragma is currently supported only for the AAMP
target and is ignored for other targets.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Export_Valued_Procedure" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Export_Valued_Procedure (
[Internal        =&gt;] LOCAL_NAME
[, [External        =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types =&gt;] PARAMETER_TYPES]
[, [Mechanism       =&gt;] MECHANISM]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION
| ""

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::= Value | Reference

This pragma is identical to `Export_Procedure' except that the first
parameter of LOCAL_NAME, which must be present, must be of mode `OUT',
and externally the subprogram is treated as a function with this
parameter as the result of the function.  GNAT provides for this
capability to allow the use of `OUT' and `IN OUT' parameters in
interfacing to external functions (which are not permitted in Ada
functions).  GNAT does not require a separate pragma `Export', but if
none is present, `Convention Ada' is assumed, which is almost certainly
not what is wanted since the whole point of this pragma is to interface
with foreign language functions, so it is usually appropriate to use
this pragma in conjunction with a `Export' or `Convention' pragma that
specifies the desired foreign convention.

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form still
allows the specification of parameter mechanisms.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Extend_System" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Extend_System ([Name =&gt;] IDENTIFIER);

This pragma is used to provide backwards compatibility with other
implementations that extend the facilities of package `System'.  In
GNAT, `System' contains only the definitions that are present in the
Ada RM.  However, other implementations, notably the DEC Ada 83
implementation, provide many extensions to package `System'.

For each such implementation accommodated by this pragma, GNAT
provides a package `Aux_XXX', e.g. `Aux_DEC' for the DEC Ada 83
implementation, which provides the required additional definitions.  You
can use this package in two ways.  You can `with' it in the normal way
and access entities either by selection or using a `use' clause.  In
this case no special processing is required.

However, if existing code contains references such as `System.XXX'
where XXX is an entity in the extended definitions provided in package
`System', you may use this pragma to extend visibility in `System' in a
non-standard way that provides greater compatibility with the existing
code.  Pragma `Extend_System' is a configuration pragma whose single
argument is the name of the package containing the extended definition
(e.g. `Aux_DEC' for the DEC Ada case).  A unit compiled under control
of this pragma will be processed using special visibility processing
that looks in package `System.Aux_XXX' where `Aux_XXX' is the pragma
argument for any entity referenced in package `System', but not found
in package `System'.

You can use this pragma either to access a predefined `System'
extension supplied with the compiler, for example `Aux_DEC' or you can
construct your own extension unit following the above definition.  Note
that such a package is a child of `System' and thus is considered part
of the implementation.  To compile it you will have to use the `-gnatg'
switch, or the `/GNAT_INTERNAL' qualifier on OpenVMS, for compiling
System units, as explained in the GNAT Pro User's Guide.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Extensions_Allowed" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Extensions_Allowed (On | Off);

This configuration pragma enables or disables the implementation
extension mode (the use of Off as a parameter cancels the effect of the
`-gnatX' command switch).

In extension mode, the latest version of the Ada language is
implemented (currently Ada 2012), and in addition a small number of
GNAT specific extensions are recognized as follows:

Constrained attribute for generic objects
The `Constrained' attribute is permitted for objects of generic
types. The result indicates if the corresponding actual is
constrained.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "External" origin = "GNAT RM">
      <DOC>
Syntax:

pragma External (
[   Convention    =&gt;] convention_IDENTIFIER,
[   Entity        =&gt;] LOCAL_NAME
[, [External_Name =&gt;] static_string_EXPRESSION ]
[, [Link_Name     =&gt;] static_string_EXPRESSION ]);

This pragma is identical in syntax and semantics to pragma `Export' as
defined in the Ada Reference Manual.  It is provided for compatibility
with some Ada 83 compilers that used this pragma for exactly the same
purposes as pragma `Export' before the latter was standardized.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "External_Name_Casing" origin = "GNAT RM">
      <DOC>
Syntax:

pragma External_Name_Casing (
Uppercase | Lowercase
[, Uppercase | Lowercase | As_Is]);

This pragma provides control over the casing of external names
associated with Import and Export pragmas.  There are two cases to
consider:

Implicit external names
Implicit external names are derived from identifiers.  The most
common case arises when a standard Ada Import or Export pragma is
used with only two arguments, as in:

pragma Import (C, C_Routine);

Since Ada is a case-insensitive language, the spelling of the
identifier in the Ada source program does not provide any
information on the desired casing of the external name, and so a
convention is needed.  In GNAT the default treatment is that such
names are converted to all lower case letters.  This corresponds
to the normal C style in many environments.  The first argument of
pragma `External_Name_Casing' can be used to control this
treatment.  If `Uppercase' is specified, then the name will be
forced to all uppercase letters.  If `Lowercase' is specified,
then the normal default of all lower case letters will be used.

This same implicit treatment is also used in the case of extended
DEC Ada 83 compatible Import and Export pragmas where an external
name is explicitly specified using an identifier rather than a
string.

Explicit external names
Explicit external names are given as string literals.  The most
common case arises when a standard Ada Import or Export pragma is
used with three arguments, as in:

pragma Import (C, C_Routine, "C_routine");

In this case, the string literal normally provides the exact
casing required for the external name.  The second argument of
pragma `External_Name_Casing' may be used to modify this behavior.
If `Uppercase' is specified, then the name will be forced to all
uppercase letters.  If `Lowercase' is specified, then the name
will be forced to all lowercase letters.  A specification of
`As_Is' provides the normal default behavior in which the casing is
taken from the string provided.

This pragma may appear anywhere that a pragma is valid.  In particular,
it can be used as a configuration pragma in the `gnat.adc' file, in
which case it applies to all subsequent compilations, or it can be used
as a program unit pragma, in which case it only applies to the current
unit, or it can be used more locally to control individual
Import/Export pragmas.

It is primarily intended for use with OpenVMS systems, where many
compilers convert all symbols to upper case by default.  For
interfacing to such compilers (e.g. the DEC C compiler), it may be
convenient to use the pragma:

pragma External_Name_Casing (Uppercase, Uppercase);

to enforce the upper casing of all external symbols.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Fast_Math" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Fast_Math;

This is a configuration pragma which activates a mode in which speed is
considered more important for floating-point operations than absolutely
accurate adherence to the requirements of the standard. Currently the
following operations are affected:

Complex Multiplication
The normal simple formula for complex multiplication can result in
intermediate overflows for numbers near the end of the range. The
Ada standard requires that this situation be detected and
corrected by scaling, but in Fast_Math mode such cases will simply
result in overflow. Note that to take advantage of this you must
instantiate your own version of
`Ada.Numerics.Generic_Complex_Types' under control of the pragma,
rather than use the preinstantiated versions.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Favor_Top_Level" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Favor_Top_Level (type_NAME);

The named type must be an access-to-subprogram type. This pragma is an
efficiency hint to the compiler, regarding the use of 'Access or
'Unrestricted_Access on nested (non-library-level) subprograms. The
pragma means that nested subprograms are not used with this type, or
are rare, so that the generated code should be efficient in the
top-level case. When this pragma is used, dynamically generated
trampolines may be used on some targets for nested subprograms.  See
also the No_Implicit_Dynamic_Code restriction.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Finalize_Storage_Only" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);

This pragma allows the compiler not to emit a Finalize call for objects
defined at the library level.  This is mostly useful for types where
finalization is only used to deal with storage reclamation since in most
environments it is not necessary to reclaim memory just before
terminating execution, hence the name.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Float_Representation" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);

FLOAT_REP ::= VAX_Float | IEEE_Float

In the one argument form, this pragma is a configuration pragma which
allows control over the internal representation chosen for the
predefined floating point types declared in the packages `Standard' and
`System'. On all systems other than OpenVMS, the argument must be
`IEEE_Float' and the pragma has no effect. On OpenVMS, the argument may
be `VAX_Float' to specify the use of the VAX float format for the
floating-point types in Standard. This requires that the standard
runtime libraries be recompiled.

The two argument form specifies the representation to be used for
the specified floating-point type. On all systems other than OpenVMS,
the argument must be `IEEE_Float' to specify the use of IEEE format, as
follows:

* For a digits value of 6, 32-bit IEEE short format will be used.

* For a digits value of 15, 64-bit IEEE long format will be used.

* No other value of digits is permitted.

On OpenVMS, the argument may be `VAX_Float' to specify the use of
the VAX float format, as follows:

* For digits values up to 6, F float format will be used.

* For digits values from 7 to 9, D float format will be used.

* For digits values from 10 to 15, G float format will be used.

* Digits values above 15 are not allowed.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Global" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 6.1.4.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ident" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Ident (static_string_EXPRESSION);

This pragma is identical in effect to pragma `Comment'. It is provided
for compatibility with other Ada compilers providing this pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Implementation_Defined" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Implementation_Defined (local_NAME);

This pragma marks a previously declared entioty as
implementation-defined.  For an overloaded entity, applies to the most
recent homonym.

pragma Implementation_Defined;

The form with no arguments appears anywhere within a scope, most
typically a package spec, and indicates that all entities that are
defined within the package spec are Implementation_Defined.

This pragma is used within the GNAT runtime library to identify
implementation-defined entities introduced in language-defined units,
for the purpose of implementing the No_Implementation_Identifiers
restriction.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Implemented" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Implemented (procedure_LOCAL_NAME, implementation_kind);

implementation_kind ::= By_Entry | By_Protected_Procedure | By_Any

This is an Ada 2012 representation pragma which applies to protected,
task and synchronized interface primitives. The use of pragma
Implemented provides a way to impose a static requirement on the
overriding operation by adhering to one of the three implementation
kinds: entry, protected procedure or any of the above. This pragma is
available in all earlier versions of Ada as an implementation-defined
pragma.

type Synch_Iface is synchronized interface;
procedure Prim_Op (Obj : in out Iface) is abstract;
pragma Implemented (Prim_Op, By_Protected_Procedure);

protected type Prot_1 is new Synch_Iface with
procedure Prim_Op;  --  Legal
end Prot_1;

protected type Prot_2 is new Synch_Iface with
entry Prim_Op;      --  Illegal
end Prot_2;

task type Task_Typ is new Synch_Iface with
entry Prim_Op;      --  Illegal
end Task_Typ;

When applied to the procedure_or_entry_NAME of a requeue statement,
pragma Implemented determines the runtime behavior of the requeue.
Implementation kind By_Entry guarantees that the action of requeueing
will proceed from an entry to another entry. Implementation kind
By_Protected_Procedure transforms the requeue into a dispatching call,
thus eliminating the chance of blocking. Kind By_Any shares the
behavior of By_Entry and By_Protected_Procedure depending on the
target's overriding subprogram kind.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Implicit_Packing" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Implicit_Packing;

This is a configuration pragma that requests implicit packing for packed
arrays for which a size clause is given but no explicit pragma Pack or
specification of Component_Size is present. It also applies to records
where no record representation clause is present. Consider this example:

type R is array (0 .. 7) of Boolean;
for R'Size use 8;

In accordance with the recommendation in the RM (RM 13.3(53)), a Size
clause does not change the layout of a composite object. So the Size
clause in the above example is normally rejected, since the default
layout of the array uses 8-bit components, and thus the array requires
a minimum of 64 bits.

If this declaration is compiled in a region of code covered by an
occurrence of the configuration pragma Implicit_Packing, then the Size
clause in this and similar examples will cause implicit packing and
thus be accepted. For this implicit packing to occur, the type in
question must be an array of small components whose size is known at
compile time, and the Size clause must specify the exact size that
corresponds to the number of elements in the array multiplied by the
size in bits of the component type (both single and multi-dimensioned
arrays can be controlled with this pragma).

Similarly, the following example shows the use in the record case

type r is record
a, b, c, d, e, f, g, h : boolean;
chr                    : character;
end record;
for r'size use 16;

Without a pragma Pack, each Boolean field requires 8 bits, so the
minimum size is 72 bits, but with a pragma Pack, 16 bits would be
sufficient. The use of pragma Implicit_Packing allows this record
declaration to compile without an explicit pragma Pack.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import" origin = "Ada RM">
      <DOC>
Syntax:

pragma Import ([Convention=&gt;]convention_identifier,[Entity=&gt;]local_name;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import_Exception" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Import_Exception (
[Internal =&gt;] LOCAL_NAME
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Form     =&gt;] Ada | VMS]
[, [Code     =&gt;] static_integer_EXPRESSION]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma is implemented only in the OpenVMS implementation of GNAT.
It allows OpenVMS conditions (for example, from OpenVMS system services
or other OpenVMS languages) to be propagated to Ada programs as Ada
exceptions.  The pragma specifies that the exception associated with an
exception declaration in an Ada program be defined externally (in
non-Ada code).  For further details on this pragma, see the DEC Ada
Language Reference Manual, section 13.9a.3.1.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import_Function" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Import_Function (
[Internal                 =&gt;] LOCAL_NAME,
[, [External                 =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types          =&gt;] PARAMETER_TYPES]
[, [Result_Type              =&gt;] SUBTYPE_MARK]
[, [Mechanism                =&gt;] MECHANISM]
[, [Result_Mechanism         =&gt;] MECHANISM_NAME]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::=
Value
| Reference

This pragma is used in conjunction with a pragma `Import' to specify
additional information for an imported function.  The pragma `Import'
(or equivalent pragma `Interface') must precede the `Import_Function'
pragma and both must appear in the same declarative part as the
function specification.

The INTERNAL argument must uniquely designate the function to which
the pragma applies.  If more than one function name exists of this name
in the declarative part you must use the `Parameter_Types' and
RESULT_TYPE parameters to achieve the required unique designation.
Subtype marks in these parameters must exactly match the subtypes in
the corresponding function specification, using positional notation to
match parameters with subtype marks.  The form with an `'Access'
attribute can be used to match an anonymous access parameter.

You may optionally use the MECHANISM and RESULT_MECHANISM parameters
to specify passing mechanisms for the parameters and result.  If you
specify a single mechanism name, it applies to all parameters.
Otherwise you may specify a mechanism on a parameter by parameter basis
using either positional or named notation.  If the mechanism is not
specified, the default mechanism is used.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import_Object" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Import_Object
[Internal =&gt;] LOCAL_NAME
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Size     =&gt;] EXTERNAL_SYMBOL]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma designates an object as imported, and apart from the
extended rules for external symbols, is identical in effect to the use
of the normal `Import' pragma applied to an object.  Unlike the
subprogram case, you need not use a separate `Import' pragma, although
you may do so (and probably should do so from a portability point of
view).  SIZE is syntax checked, but otherwise ignored by GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import_Procedure" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Import_Procedure (
[Internal                 =&gt;] LOCAL_NAME
[, [External                 =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types          =&gt;] PARAMETER_TYPES]
[, [Mechanism                =&gt;] MECHANISM]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::= Value | Reference

This pragma is identical to `Import_Function' except that it applies to
a procedure rather than a function and the parameters `Result_Type' and
`Result_Mechanism' are not permitted.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Import_Valued_Procedure" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Import_Valued_Procedure (
[Internal                 =&gt;] LOCAL_NAME
[, [External                 =&gt;] EXTERNAL_SYMBOL]
[, [Parameter_Types          =&gt;] PARAMETER_TYPES]
[, [Mechanism                =&gt;] MECHANISM]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

PARAMETER_TYPES ::=
null
| TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

TYPE_DESIGNATOR ::=
subtype_NAME
| subtype_Name ' Access

MECHANISM ::=
MECHANISM_NAME
| (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

MECHANISM_ASSOCIATION ::=
[formal_parameter_NAME =&gt;] MECHANISM_NAME

MECHANISM_NAME ::= Value | Reference

This pragma is identical to `Import_Procedure' except that the first
parameter of LOCAL_NAME, which must be present, must be of mode `OUT',
and externally the subprogram is treated as a function with this
parameter as the result of the function.  The purpose of this
capability is to allow the use of `OUT' and `IN OUT' parameters in
interfacing to external functions (which are not permitted in Ada
functions).  You may optionally use the `Mechanism' parameters to
specify passing mechanisms for the parameters.  If you specify a single
mechanism name, it applies to all parameters.  Otherwise you may
specify a mechanism on a parameter by parameter basis using either
positional or named notation.  If the mechanism is not specified, the
default mechanism is used.

Note that it is important to use this pragma in conjunction with a
separate pragma Import that specifies the desired convention, since
otherwise the default convention is Ada, which is almost certainly not
what is required.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Independent" origin = "Ada RM">
      <DOC>
Syntax:

pragma Independent (Local_NAME);

This pragma is standard in Ada 2012 mode (which also provides an aspect
of the same name). It is also available as an implementation-defined
pragma in all earlier versions. It specifies that the designated object
or all objects of the designated type must be independently
addressable. This means that separate tasks can safely manipulate such
objects. For example, if two components of a record are independent,
then two separate tasks may access these two components.  This may place
constraints on the representation of the object (for instance
prohibiting tight packing).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Independent_Components" origin = "Ada RM">
      <DOC>
Syntax:

pragma Independent_Components (Local_NAME);

This pragma is standard in Ada 2012 mode (which also provides an aspect
of the same name). It is also available as an implementation-defined
pragma in all earlier versions. It specifies that the components of the
designated object, or the components of each object of the designated
type, must be independently addressable. This means that separate tasks
can safely manipulate separate components in the composite object. This
may place constraints on the representation of the object (for instance
prohibiting tight packing).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Initial_Condition" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.6.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Initialize_Scalars" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Initialize_Scalars;

This pragma is similar to `Normalize_Scalars' conceptually but has two
important differences.  First, there is no requirement for the pragma
to be used uniformly in all units of a partition, in particular, it is
fine to use this just for some or all of the application units of a
partition, without needing to recompile the run-time library.

In the case where some units are compiled with the pragma, and some
without, then a declaration of a variable where the type is defined in
package Standard or is locally declared will always be subject to
initialization, as will any declaration of a scalar variable.  For
composite variables, whether the variable is initialized may also
depend on whether the package in which the type of the variable is
declared is compiled with the pragma.

The other important difference is that you can control the value used
for initializing scalar objects.  At bind time, you can select several
options for initialization. You can initialize with invalid values
(similar to Normalize_Scalars, though for Initialize_Scalars it is not
always possible to determine the invalid values in complex cases like
signed component fields with non-standard sizes). You can also
initialize with high or low values, or with a specified bit pattern.
See the GNAT Pro User's Guide for binder options for specifying these
cases.

This means that you can compile a program, and then without having to
recompile the program, you can run it with different values being used
for initializing otherwise uninitialized values, to test if your program
behavior depends on the choice.  Of course the behavior should not
change, and if it does, then most likely you have an incorrect
reference to an uninitialized value.

It is even possible to change the value at execution time
eliminating even the need to rebind with a different switch using an
environment variable.  See the GNAT Pro User's Guide for details.

Note that pragma `Initialize_Scalars' is particularly useful in
conjunction with the enhanced validity checking that is now provided in
GNAT, which checks for invalid values under more conditions.  Using
this feature (see description of the `-gnatV' flag in the GNAT Pro
User's Guide) in conjunction with pragma `Initialize_Scalars' provides
a powerful new tool to assist in the detection of problems caused by
uninitialized variables.

Note: the use of `Initialize_Scalars' has a fairly extensive effect
on the generated code. This may cause your code to be substantially
larger. It may also cause an increase in the amount of stack required,
so it is probably a good idea to turn on stack checking (see
description of stack checking in the GNAT Pro User's Guide) when using
this pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Initializes" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.1.5.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Inline" origin = "Ada RM">
      <DOC>
Syntax:

pragma Inline;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Inline_Always" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Inline_Always (NAME [, NAME]);

Similar to pragma `Inline' except that inlining is not subject to the
use of option `-gnatn' or `-gnatN' and the inlining happens regardless
of whether these options are used.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Inline_Generic" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Inline_Generic (GNAME {, GNAME});

GNAME ::= generic_unit_NAME | generic_instance_NAME

This pragma is provided for compatibility with Dec Ada 83. It has no
effect in `GNAT' (which always inlines generics), other than to check
that the given names are all names of generic units or generic
instances.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Inspection_Point" origin = "Ada RM">
      <DOC>
Syntax:

pragma Inspection_Point [(object_name {, object_name})];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Interface" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Interface (
[Convention    =&gt;] convention_identifier,
[Entity        =&gt;] local_NAME
[, [External_Name =&gt;] static_string_expression]
[, [Link_Name     =&gt;] static_string_expression]);

This pragma is identical in syntax and semantics to the standard Ada
pragma `Import'.  It is provided for compatibility with Ada 83.  The
definition is upwards compatible both with pragma `Interface' as
defined in the Ada 83 Reference Manual, and also with some extended
implementations of this pragma in certain Ada 83 implementations.  The
only difference between pragma `Interface' and pragma `Import' is that
there is special circuitry to allow both pragmas to appear for the same
subprogram entity (normally it is illegal to have multiple `Import'
pragmas. This is useful in maintaining Ada 83/Ada 95 compatibility and
is compatible with other Ada 83 compilers.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Interface_Name" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Interface_Name (
[Entity        =&gt;] LOCAL_NAME
[, [External_Name =&gt;] static_string_EXPRESSION]
[, [Link_Name     =&gt;] static_string_EXPRESSION]);

This pragma provides an alternative way of specifying the interface name
for an interfaced subprogram, and is provided for compatibility with Ada
83 compilers that use the pragma for this purpose.  You must provide at
least one of EXTERNAL_NAME or LINK_NAME.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Interrupt_Handler" origin = "Ada RM">
      <DOC>
Syntax:

pragma Interrupt_Handler (procedure_LOCAL_NAME);

This program unit pragma is supported for parameterless protected
procedures as described in Annex C of the Ada Reference Manual. On the
AAMP target the pragma can also be specified for nonprotected
parameterless procedures that are declared at the library level (which
includes procedures declared at the top level of a library package). In
the case of AAMP, when this pragma is applied to a nonprotected
procedure, the instruction `IERET' is generated for returns from the
procedure, enabling maskable interrupts, in place of the normal return
instruction.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Interrupt_Priority" origin = "Ada RM">
      <DOC>
Syntax:

pragma Interrupt_Priority;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Interrupt_State" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Interrupt_State
([Name  =&gt;] value,
[State =&gt;] SYSTEM | RUNTIME | USER);

Normally certain interrupts are reserved to the implementation.  Any
attempt to attach an interrupt causes Program_Error to be raised, as
described in RM C.3.2(22).  A typical example is the `SIGINT' interrupt
used in many systems for an `Ctrl-C' interrupt.  Normally this
interrupt is reserved to the implementation, so that `Ctrl-C' can be
used to interrupt execution.  Additionally, signals such as `SIGSEGV',
`SIGABRT', `SIGFPE' and `SIGILL' are often mapped to specific Ada
exceptions, or used to implement run-time functions such as the `abort'
statement and stack overflow checking.

Pragma `Interrupt_State' provides a general mechanism for overriding
such uses of interrupts.  It subsumes the functionality of pragma
`Unreserve_All_Interrupts'.  Pragma `Interrupt_State' is not available
on Windows or VMS.  On all other platforms than VxWorks, it applies to
signals; on VxWorks, it applies to vectored hardware interrupts and may
be used to mark interrupts required by the board support package as
reserved.

Interrupts can be in one of three states:
* System

The interrupt is reserved (no Ada handler can be installed), and
the Ada run-time may not install a handler. As a result you are
guaranteed standard system default action if this interrupt is
raised.

* Runtime

The interrupt is reserved (no Ada handler can be installed). The
run time is allowed to install a handler for internal control
purposes, but is not required to do so.

* User

The interrupt is unreserved.  The user may install a handler to
provide some other action.

These states are the allowed values of the `State' parameter of the
pragma.  The `Name' parameter is a value of the type
`Ada.Interrupts.Interrupt_ID'.  Typically, it is a name declared in
`Ada.Interrupts.Names'.

This is a configuration pragma, and the binder will check that there
are no inconsistencies between different units in a partition in how a
given interrupt is specified. It may appear anywhere a pragma is legal.

The effect is to move the interrupt to the specified state.

By declaring interrupts to be SYSTEM, you guarantee the standard
system action, such as a core dump.

By declaring interrupts to be USER, you guarantee that you can
install a handler.

Note that certain signals on many operating systems cannot be caught
and handled by applications.  In such cases, the pragma is ignored.
See the operating system documentation, or the value of the array
`Reserved' declared in the spec of package `System.OS_Interface'.

Overriding the default state of signals used by the Ada runtime may
interfere with an application's runtime behavior in the cases of the
synchronous signals, and in the case of the signal used to implement
the `abort' statement.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Invariant" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Invariant
([Entity =&gt;]    private_type_LOCAL_NAME,
[Check  =&gt;]    EXPRESSION
[,[Message =&gt;] String_Expression]);

This pragma provides exactly the same capabilities as the
Type_Invariant aspect defined in AI05-0146-1, and in the Ada 2012
Reference Manual. The Type_Invariant aspect is fully implemented in Ada
2012 mode, but since it requires the use of the aspect syntax, which is
not available except in 2012 mode, it is not possible to use the
Type_Invariant aspect in earlier versions of Ada. However the Invariant
pragma may be used in any version of Ada. Also note that the aspect
Invariant is a synonym in GNAT for the aspect Type_Invariant, but there
is no pragma Type_Invariant.

The pragma must appear within the visible part of the package
specification, after the type to which its Entity argument appears. As
with the Invariant aspect, the Check expression is not analyzed until
the end of the visible part of the package, so it may contain forward
references. The Message argument, if present, provides the exception
message used if the invariant is violated. If no Message parameter is
provided, a default message that identifies the line on which the
pragma appears is used.

It is permissible to have multiple Invariants for the same type
entity, in which case they are and'ed together. It is permissible to
use this pragma in Ada 2012 mode, but you cannot have both an invariant
aspect and an invariant pragma for the same entity.

For further details on the use of this pragma, see the Ada 2012
documentation of the Type_Invariant aspect.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Java_Constructor" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Java_Constructor ([Entity =&gt;] function_LOCAL_NAME);

This pragma is used to assert that the specified Ada function should be
mapped to the Java constructor for some Ada tagged record type.

See section 7.3.2 of the `GNAT User's Guide: Supplement for the JVM
Platform.' for related information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Java_Interface" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Java_Interface ([Entity =&gt;] abstract_tagged_type_LOCAL_NAME);

This pragma is used to assert that the specified Ada abstract tagged
type is to be mapped to a Java interface name.

See sections 7.1 and 7.2 of the `GNAT User's Guide: Supplement for
the JVM Platform.' for related information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Keep_Names" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Keep_Names ([On =&gt;] enumeration_first_subtype_LOCAL_NAME);

The LOCAL_NAME argument must refer to an enumeration first subtype in
the current declarative part. The effect is to retain the enumeration
literal names for use by `Image' and `Value' even if a global
`Discard_Names' pragma applies. This is useful when you want to
generally suppress enumeration literal names and for example you
therefore use a `Discard_Names' pragma in the `gnat.adc' file, but you
want to retain the names for specific enumeration types.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "License" origin = "GNAT RM">
      <DOC>
Syntax:

pragma License (Unrestricted | GPL | Modified_GPL | Restricted);

This pragma is provided to allow automated checking for appropriate
license conditions with respect to the standard and modified GPL.  A
pragma `License', which is a configuration pragma that typically
appears at the start of a source file or in a separate `gnat.adc' file,
specifies the licensing conditions of a unit as follows:

* Unrestricted This is used for a unit that can be freely used with
no license restrictions.  Examples of such units are public domain
units, and units from the Ada Reference Manual.

* GPL This is used for a unit that is licensed under the unmodified
GPL, and which therefore cannot be `with''ed by a restricted unit.

* Modified_GPL This is used for a unit licensed under the GNAT
modified GPL that includes a special exception paragraph that
specifically permits the inclusion of the unit in programs without
requiring the entire program to be released under the GPL.

* Restricted This is used for a unit that is restricted in that it
is not permitted to depend on units that are licensed under the
GPL.  Typical examples are proprietary code that is to be released
under more restrictive license conditions.  Note that restricted
units are permitted to `with' units which are licensed under the
modified GPL (this is the whole point of the modified GPL).


Normally a unit with no `License' pragma is considered to have an
unknown license, and no checking is done.  However, standard GNAT
headers are recognized, and license information is derived from them as
follows.

A GNAT license header starts with a line containing 78 hyphens.  The
following comment text is searched for the appearance of any of the
following strings.

If the string "GNU General Public License" is found, then the unit
is assumed to have GPL license, unless the string "As a special
exception" follows, in which case the license is assumed to be modified
GPL.

If one of the strings "This specification is adapted from the Ada
Semantic Interface" or "This specification is derived from the Ada
Reference Manual" is found then the unit is assumed to be unrestricted.

These default actions means that a program with a restricted license
pragma will automatically get warnings if a GPL unit is inappropriately
`with''ed.  For example, the program:

with Sem_Ch3;
with GNAT.Sockets;
procedure Secret_Stuff is

end Secret_Stuff

if compiled with pragma `License' (`Restricted') in a `gnat.adc' file
will generate the warning:

with Sem_Ch3;
|
&gt;&gt;&gt; license of withed unit "Sem_Ch3" is incompatible

with GNAT.Sockets;
procedure Secret_Stuff is

Here we get a warning on `Sem_Ch3' since it is part of the GNAT
compiler and is licensed under the GPL, but no warning for
`GNAT.Sockets' which is part of the GNAT run time, and is therefore
licensed under the modified GPL.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Link_With" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Link_With (static_string_EXPRESSION {,static_string_EXPRESSION});

This pragma is provided for compatibility with certain Ada 83 compilers.
It has exactly the same effect as pragma `Linker_Options' except that
spaces occurring within one of the string expressions are treated as
separators. For example, in the following case:

pragma Link_With ("-labc -ldef");

results in passing the strings `-labc' and `-ldef' as two separate
arguments to the linker. In addition pragma Link_With allows multiple
arguments, with the same effect as successive pragmas.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Linker_Alias" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Linker_Alias (
[Entity =&gt;] LOCAL_NAME,
[Target =&gt;] static_string_EXPRESSION);

LOCAL_NAME must refer to an object that is declared at the library
level. This pragma establishes the given entity as a linker alias for
the given target. It is equivalent to `__attribute__((alias))' in GNU C
and causes LOCAL_NAME to be emitted as an alias for the symbol
STATIC_STRING_EXPRESSION in the object file, that is to say no space is
reserved for LOCAL_NAME by the assembler and it will be resolved to the
same address as STATIC_STRING_EXPRESSION by the linker.

The actual linker name for the target must be used (e.g. the fully
encoded name with qualification in Ada, or the mangled name in C++), or
it must be declared using the C convention with `pragma Import' or
`pragma Export'.

Not all target machines support this pragma. On some of them it is
accepted only if `pragma Weak_External' has been applied to LOCAL_NAME.

--  Example of the use of pragma Linker_Alias

package p is
i : Integer := 1;
pragma Export (C, i);

new_name_for_i : Integer;
pragma Linker_Alias (new_name_for_i, "i");
end p;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Linker_Constructor" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Linker_Constructor (procedure_LOCAL_NAME);

PROCEDURE_LOCAL_NAME must refer to a parameterless procedure that is
declared at the library level. A procedure to which this pragma is
applied will be treated as an initialization routine by the linker.  It
is equivalent to `__attribute__((constructor))' in GNU C and causes
PROCEDURE_LOCAL_NAME to be invoked before the entry point of the
executable is called (or immediately after the shared library is loaded
if the procedure is linked in a shared library), in particular before
the Ada run-time environment is set up.

Because of these specific contexts, the set of operations such a
procedure can perform is very limited and the type of objects it can
manipulate is essentially restricted to the elementary types. In
particular, it must only contain code to which pragma Restrictions
(No_Elaboration_Code) applies.

This pragma is used by GNAT to implement auto-initialization of
shared Stand Alone Libraries, which provides a related capability
without the restrictions listed above. Where possible, the use of Stand
Alone Libraries is preferable to the use of this pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Linker_Destructor" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Linker_Destructor (procedure_LOCAL_NAME);

PROCEDURE_LOCAL_NAME must refer to a parameterless procedure that is
declared at the library level. A procedure to which this pragma is
applied will be treated as a finalization routine by the linker.  It is
equivalent to `__attribute__((destructor))' in GNU C and causes
PROCEDURE_LOCAL_NAME to be invoked after the entry point of the
executable has exited (or immediately before the shared library is
unloaded if the procedure is linked in a shared library), in particular
after the Ada run-time environment is shut down.

See `pragma Linker_Constructor' for the set of restrictions that
apply because of these specific contexts.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Linker_Options" origin = "Ada RM">
      <DOC>
Syntax:

pragma Linker_Options (string_expression);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Linker_Section" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Linker_Section (
[Entity  =&gt;] LOCAL_NAME,
[Section =&gt;] static_string_EXPRESSION);

LOCAL_NAME must refer to an object, type, or subprogram that is
declared at the library level. This pragma specifies the name of the
linker section for the given entity. It is equivalent to
`__attribute__((section))' in GNU C and causes LOCAL_NAME to be placed
in the STATIC_STRING_EXPRESSION section of the executable (assuming the
linker doesn't rename the section).  GNAT also provides an
implementation defined aspect of the same name.

In the case of specifying this aspect for a type, the effect is to
specify the corresponding for all library level objects of the type
which do not have an explicit linker section set. Note that this only
applies to whole objects, not to components of composite objects.

In the case of a subprogram, the linker section applies to all
previously declared matching overloaded subprograms in the current
declarative part which do not already have a linker section assigned.
The linker section aspect is useful in this case for specifying
different linker sections for different elements of such an overloaded
set.

Note that an empty string specifies that no linker section is
specified.  This is not quite the same as omitting the pragma or
aspect, since it can be used to specify that one element of an
overloaded set of subprograms has the default linker section, or that
one object of a type for which a linker section is specified should has
the default linker section.

The compiler normally places library-level entities in standard
sections depending on the class: procedures and functions generally go
in the `.text' section, initialized variables in the `.data' section
and uninitialized variables in the `.bss' section.

Other, special sections may exist on given target machines to map
special hardware, for example I/O ports or flash memory. This pragma is
a means to defer the final layout of the executable to the linker, thus
fully working at the symbolic level with the compiler.

Some file formats do not support arbitrary sections so not all target
machines support this pragma. The use of this pragma may cause a program
execution to be erroneous if it is used to place an entity into an
inappropriate section (e.g. a modified variable into the `.text'
section). See also `pragma Persistent_BSS'.

--  Example of the use of pragma Linker_Section

package IO_Card is
Port_A : Integer;
pragma Volatile (Port_A);
pragma Linker_Section (Port_A, ".bss.port_a");

Port_B : Integer;
pragma Volatile (Port_B);
pragma Linker_Section (Port_B, ".bss.port_b");

type Port_Type is new Integer with Linker_Section =&gt; ".bss";
PA : Port_Type with Linker_Section =&gt; ".bss.PA";
PB : Port_Type; --  ends up in linker section ".bss"

procedure Q with Linker_Section =&gt; "Qsection";
end IO_Card;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "List" origin = "Ada RM">
      <DOC>
Syntax:

pragma List (identifier);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Lock_Free" origin = "GNAT RM">
      <DOC>
Syntax: This pragma may be specified for protected types or objects. It
specifies that the implementation of protected operations must be
implemented without locks.  Compilation fails if the compiler cannot
generate lock-free code for the operations.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Locking_Policy" origin = "Ada RM">
      <DOC>
Syntax:

pragma Locking_Policy (policy_identifier);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Locl_Free" origin = "GNAT RM">
      <DOC>
Syntax: PLEASE ADD DOCUMENTATION HERE???
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Long_Float" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Long_Float (FLOAT_FORMAT);

FLOAT_FORMAT ::= D_Float | G_Float

This pragma is implemented only in the OpenVMS implementation of GNAT.
It allows control over the internal representation chosen for the
predefined type `Long_Float' and for floating point type
representations with `digits' specified in the range 7 through 15.  For
further details on this pragma, see the `DEC Ada Language Reference
Manual', section 3.5.7b.  Note that to use this pragma, the standard
runtime libraries must be recompiled.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Loop_Invariant" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Loop_Invariant ( boolean_EXPRESSION );

The effect of this pragma is similar to that of pragma `Assert', except
that in an `Assertion_Policy' pragma, the identifier `Loop_Invariant'
is used to control whether it is ignored or checked (or disabled).

`Loop_Invariant' can only appear as one of the items in the sequence
of statements of a loop body, or nested inside block statements that
appear in the sequence of statements of a loop body.  The intention is
that it be used to represent a "loop invariant" assertion, i.e.
something that is true each time through the loop, and which can be
used to show that the loop is achieving its purpose.

Multiple `Loop_Invariant' and `Loop_Variant' pragmas that apply to
the same loop should be grouped in the same sequence of statements.

To aid in writing such invariants, the special attribute `Loop_Entry'
may be used to refer to the value of an expression on entry to the
loop. This attribute can only be used within the expression of a
`Loop_Invariant' pragma. For full details, see documentation of
attribute `Loop_Entry'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Loop_Optimize" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Loop_Optimize (OPTIMIZATION_HINT {, OPTIMIZATION_HINT});

OPTIMIZATION_HINT ::= Ivdep | No_Unroll | Unroll | No_Vector | Vector

This pragma must appear immediately within a loop statement.  It allows
the programmer to specify optimization hints for the enclosing loop.
The hints are not mutually exclusive and can be freely mixed, but not
all combinations will yield a sensible outcome.

There are five supported optimization hints for a loop:

* Ivdep

The programmer asserts that there are no loop-carried dependencies
which would prevent consecutive iterations of the loop from being
executed simultaneously.

* No_Unroll

The loop must not be unrolled.  This is a strong hint: the
compiler will not unroll a loop marked with this hint.

* Unroll

The loop should be unrolled.  This is a weak hint: the compiler
will try to apply unrolling to this loop preferably to other
optimizations, notably vectorization, but there is no guarantee
that the loop will be unrolled.

* No_Vector

The loop must not be vectorized.  This is a strong hint: the
compiler will not vectorize a loop marked with this hint.

* Vector

The loop should be vectorized.  This is a weak hint: the compiler
will try to apply vectorization to this loop preferably to other
optimizations, notably unrolling, but there is no guarantee that
the loop will be vectorized.


These hints do not remove the need to pass the appropriate switches
to the compiler in order to enable the relevant optimizations, that is
to say `-funroll-loops' for unrolling and `-ftree-vectorize' for
vectorization.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Loop_Variant" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Loop_Variant ( LOOP_VARIANT_ITEM {, LOOP_VARIANT_ITEM } );
LOOP_VARIANT_ITEM ::= CHANGE_DIRECTION =&gt; discrete_EXPRESSION
CHANGE_DIRECTION ::= Increases | Decreases

`Loop_Variant' can only appear as one of the items in the sequence of
statements of a loop body, or nested inside block statements that
appear in the sequence of statements of a loop body.  It allows the
specification of quantities which must always decrease or increase in
successive iterations of the loop. In its simplest form, just one
expression is specified, whose value must increase or decrease on each
iteration of the loop.

In a more complex form, multiple arguments can be given which are
intepreted in a nesting lexicographic manner. For example:

pragma Loop_Variant (Increases =&gt; X, Decreases =&gt; Y);

specifies that each time through the loop either X increases, or X stays
the same and Y decreases. A `Loop_Variant' pragma ensures that the loop
is making progress. It can be useful in helping to show informally or
prove formally that the loop always terminates.

`Loop_Variant' is an assertion whose effect can be controlled using
an `Assertion_Policy' with a check name of `Loop_Variant'. The policy
can be `Check' to enable the loop variant check, `Ignore' to ignore the
check (in which case the pragma has no effect on the program), or
`Disable' in which case the pragma is not even checked for correct
syntax.

Multiple `Loop_Invariant' and `Loop_Variant' pragmas that apply to
the same loop should be grouped in the same sequence of statements.

The `Loop_Entry' attribute may be used within the expressions of the
`Loop_Variant' pragma to refer to values on entry to the loop.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Machine_Attribute" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Machine_Attribute (
[Entity         =&gt;] LOCAL_NAME,
[Attribute_Name =&gt;] static_string_EXPRESSION
[, [Info           =&gt;] static_EXPRESSION] );

Machine-dependent attributes can be specified for types and/or
declarations.  This pragma is semantically equivalent to
`__attribute__((ATTRIBUTE_NAME))' (if INFO is not specified) or
`__attribute__((ATTRIBUTE_NAME(INFO)))' in GNU C, where
`ATTRIBUTE_NAME' is recognized by the compiler middle-end or the
`TARGET_ATTRIBUTE_TABLE' machine specific macro.  A string literal for
the optional parameter INFO is transformed into an identifier, which
may make this pragma unusable for some attributes.  *Note Defining
target-specific uses of `__attribute__': (gccint)Target Attributes,
further information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Main" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Main
(MAIN_OPTION [, MAIN_OPTION]);

MAIN_OPTION ::=
[Stack_Size              =&gt;] static_integer_EXPRESSION
| [Task_Stack_Size_Default =&gt;] static_integer_EXPRESSION
| [Time_Slicing_Enabled    =&gt;] static_boolean_EXPRESSION

This pragma is provided for compatibility with OpenVMS VAX Systems.  It
has no effect in GNAT, other than being syntax checked.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Main_Storage" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Main_Storage
(MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]);

MAIN_STORAGE_OPTION ::=
[WORKING_STORAGE =&gt;] static_SIMPLE_EXPRESSION
| [TOP_GUARD       =&gt;] static_SIMPLE_EXPRESSION

This pragma is provided for compatibility with OpenVMS VAX Systems.  It
has no effect in GNAT, other than being syntax checked.  Note that the
pragma also has no effect in DEC Ada 83 for OpenVMS Alpha Systems.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Body" origin = "GNAT RM">
      <DOC>
Syntax:

pragma No_Body;

There are a number of cases in which a package spec does not require a
body, and in fact a body is not permitted. GNAT will not permit the
spec to be compiled if there is a body around. The pragma No_Body
allows you to provide a body file, even in a case where no body is
allowed. The body file must contain only comments and a single No_Body
pragma. This is recognized by the compiler as indicating that no body
is logically present.

This is particularly useful during maintenance when a package is
modified in such a way that a body needed before is no longer needed.
The provision of a dummy body with a No_Body pragma ensures that there
is no interference from earlier versions of the package body.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Elaboration_Code_All" origin = "GNAT RM">
      <DOC>
Syntax:

pragma No_Elaboration_Code_All [(program_unit_NAME)];

This is a program unit pragma (there is also an equivalent aspect of the
same name) that establishes the restriction `No_Elaboration_Code' for
the current unit and any extended main source units (body and subunits.
It also has has the effect of enforcing a transitive application of this
aspect, so that if any unit is implicitly or explicitly WITH'ed by the
current unit, it must also have the No_Elaboration_Code_All aspect set.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Inline" origin = "GNAT RM">
      <DOC>
Syntax:

pragma No_Inline (NAME {, NAME});

This pragma suppresses inlining for the callable entity or the
instances of the generic subprogram designated by NAME, including
inlining that results from the use of pragma `Inline'.  This pragma is
always active, in particular it is not subject to the use of option
`-gnatn' or `-gnatN'.  It is illegal to specify both pragma `No_Inline'
and pragma `Inline_Always' for the same NAME.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Return" origin = "Ada RM">
      <DOC>
Syntax:

pragma No_Return (procedure_LOCAL_NAME {, procedure_LOCAL_NAME});

Each PROCEDURE_LOCAL_NAME argument must refer to one or more procedure
declarations in the current declarative part.  A procedure to which this
pragma is applied may not contain any explicit `return' statements.  In
addition, if the procedure contains any implicit returns from falling
off the end of a statement sequence, then execution of that implicit
return will cause Program_Error to be raised.

One use of this pragma is to identify procedures whose only purpose
is to raise an exception. Another use of this pragma is to suppress
incorrect warnings about missing returns in functions, where the last
statement of a function statement sequence is a call to such a
procedure.

Note that in Ada 2005 mode, this pragma is part of the language. It
is available in all earlier versions of Ada as an implementation-defined
pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Run_Time" origin = "GNAT RM">
      <DOC>
Syntax:

pragma No_Run_Time;

This is an obsolete configuration pragma that historically was used to
set up a runtime library with no object code. It is now used only for
internal testing. The pragma has been superseded by the reconfigurable
runtime capability of `GNAT'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "No_Strict_Aliasing" origin = "GNAT RM">
      <DOC>
Syntax:

pragma No_Strict_Aliasing [([Entity =&gt;] type_LOCAL_NAME)];

TYPE_LOCAL_NAME must refer to an access type declaration in the current
declarative part.  The effect is to inhibit strict aliasing
optimization for the given type.  The form with no arguments is a
configuration pragma which applies to all access types declared in
units to which the pragma applies. For a detailed description of the
strict aliasing optimization, and the situations in which it must be
suppressed, see *note Optimization and Strict Aliasing:
(gnat_ugn)Optimization and Strict Aliasing.

This pragma currently has no effects on access to unconstrained
array types.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Normalize_Scalars" origin = "Ada RM">
      <DOC>
Syntax:

pragma Normalize_Scalars;

This is a language defined pragma which is fully implemented in GNAT.
The effect is to cause all scalar objects that are not otherwise
initialized to be initialized.  The initial values are implementation
dependent and are as follows:

`Standard.Character'
Objects whose root type is Standard.Character are initialized to
Character'Last unless the subtype range excludes NUL (in which case
NUL is used). This choice will always generate an invalid value if
one exists.

`Standard.Wide_Character'
Objects whose root type is Standard.Wide_Character are initialized
to Wide_Character'Last unless the subtype range excludes NUL (in
which case NUL is used). This choice will always generate an
invalid value if one exists.

`Standard.Wide_Wide_Character'
Objects whose root type is Standard.Wide_Wide_Character are
initialized to the invalid value 16#FFFF_FFFF# unless the subtype
range excludes NUL (in which case NUL is used). This choice will
always generate an invalid value if one exists.

`Integer types'
Objects of an integer type are treated differently depending on
whether negative values are present in the subtype. If no negative
values are present, then all one bits is used as the initial value
except in the special case where zero is excluded from the
subtype, in which case all zero bits are used. This choice will
always generate an invalid value if one exists.

For subtypes with negative values present, the largest negative
number is used, except in the unusual case where this largest
negative number is in the subtype, and the largest positive number
is not, in which case the largest positive value is used. This
choice will always generate an invalid value if one exists.

`Floating-Point Types'
Objects of all floating-point types are initialized to all 1-bits.
For standard IEEE format, this corresponds to a NaN (not a number)
which is indeed an invalid value.

`Fixed-Point Types'
Objects of all fixed-point types are treated as described above
for integers, with the rules applying to the underlying integer
value used to represent the fixed-point value.

`Modular types'
Objects of a modular type are initialized to all one bits, except
in the special case where zero is excluded from the subtype, in
which case all zero bits are used. This choice will always
generate an invalid value if one exists.

`Enumeration types'
Objects of an enumeration type are initialized to all one-bits,
i.e. to the value `2 ** typ'Size - 1' unless the subtype excludes
the literal whose Pos value is zero, in which case a code of zero
is used. This choice will always generate an invalid value if one
exists.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Obsolescent" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Obsolescent;

pragma Obsolescent (
[Message =&gt;] static_string_EXPRESSION
[,[Version =&gt;] Ada_05]]);

pragma Obsolescent (
[Entity  =&gt;] NAME
[,[Message =&gt;] static_string_EXPRESSION
[,[Version =&gt;] Ada_05]] );

This pragma can occur immediately following a declaration of an entity,
including the case of a record component. If no Entity argument is
present, then this declaration is the one to which the pragma applies.
If an Entity parameter is present, it must either match the name of the
entity in this declaration, or alternatively, the pragma can
immediately follow an enumeration type declaration, where the Entity
argument names one of the enumeration literals.

This pragma is used to indicate that the named entity is considered
obsolescent and should not be used. Typically this is used when an API
must be modified by eventually removing or modifying existing
subprograms or other entities. The pragma can be used at an
intermediate stage when the entity is still present, but will be
removed later.

The effect of this pragma is to output a warning message on a
reference to an entity thus marked that the subprogram is obsolescent
if the appropriate warning option in the compiler is activated. If the
Message parameter is present, then a second warning message is given
containing this text. In addition, a reference to the entity is
considered to be a violation of pragma Restrictions
(No_Obsolescent_Features).

This pragma can also be used as a program unit pragma for a package,
in which case the entity name is the name of the package, and the
pragma indicates that the entire package is considered obsolescent. In
this case a client `with''ing such a package violates the restriction,
and the `with' statement is flagged with warnings if the warning option
is set.

If the Version parameter is present (which must be exactly the
identifier Ada_05, no other argument is allowed), then the indication
of obsolescence applies only when compiling in Ada 2005 mode. This is
primarily intended for dealing with the situations in the predefined
library where subprograms or packages have become defined as
obsolescent in Ada 2005 (e.g. in Ada.Characters.Handling), but may be
used anywhere.

The following examples show typical uses of this pragma:

package p is
pragma Obsolescent (p, Message =&gt; "use pp instead of p");
end p;

package q is
procedure q2;
pragma Obsolescent ("use q2new instead");

type R is new integer;
pragma Obsolescent
(Entity  =&gt; R,
Message =&gt; "use RR in Ada 2005",
Version =&gt; Ada_05);

type M is record
F1 : Integer;
F2 : Integer;
pragma Obsolescent;
F3 : Integer;
end record;

type E is (a, bc, 'd', quack);
pragma Obsolescent (Entity =&gt; bc)
pragma Obsolescent (Entity =&gt; 'd')

function "+"
(a, b : character) return character;
pragma Obsolescent (Entity =&gt; "+");
end;

Note that, as for all pragmas, if you use a pragma argument identifier,
then all subsequent parameters must also use a pragma argument
identifier.  So if you specify "Entity =&gt;" for the Entity argument, and
a Message argument is present, it must be preceded by "Message =&gt;".
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Optimize" origin = "Ada RM">
      <DOC>
Syntax:

pragma Optimize (identifier);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Optimize_Alignment" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Optimize_Alignment (TIME | SPACE | OFF);

This is a configuration pragma which affects the choice of default
alignments for types and objects where no alignment is explicitly
specified. There is a time/space trade-off in the selection of these
values. Large alignments result in more efficient code, at the expense
of larger data space, since sizes have to be increased to match these
alignments. Smaller alignments save space, but the access code is
slower. The normal choice of default alignments for types and
individual alignment promotions for objects (which is what you get if
you do not use this pragma, or if you use an argument of OFF), tries to
balance these two requirements.

Specifying SPACE causes smaller default alignments to be chosen in
two cases.  First any packed record is given an alignment of 1. Second,
if a size is given for the type, then the alignment is chosen to avoid
increasing this size. For example, consider:

type R is record
X : Integer;
Y : Character;
end record;

for R'Size use 5*8;

In the default mode, this type gets an alignment of 4, so that access
to the Integer field X are efficient. But this means that objects of
the type end up with a size of 8 bytes. This is a valid choice, since
sizes of objects are allowed to be bigger than the size of the type,
but it can waste space if for example fields of type R appear in an
enclosing record. If the above type is compiled in `Optimize_Alignment
(Space)' mode, the alignment is set to 1.

However, there is one case in which SPACE is ignored. If a variable
length record (that is a discriminated record with a component which is
an array whose length depends on a discriminant), has a pragma Pack,
then it is not in general possible to set the alignment of such a
record to one, so the pragma is ignored in this case (with a warning).

Specifying SPACE also disables alignment promotions for standalone
objects, which occur when the compiler increases the alignment of a
specific object without changing the alignment of its type.

Specifying TIME causes larger default alignments to be chosen in the
case of small types with sizes that are not a power of 2. For example,
consider:

type R is record
A : Character;
B : Character;
C : Boolean;
end record;

pragma Pack (R);
for R'Size use 17;

The default alignment for this record is normally 1, but if this type is
compiled in `Optimize_Alignment (Time)' mode, then the alignment is set
to 4, which wastes space for objects of the type, since they are now 4
bytes long, but results in more efficient access when the whole record
is referenced.

As noted above, this is a configuration pragma, and there is a
requirement that all units in a partition be compiled with a consistent
setting of the optimization setting. This would normally be achieved by
use of a configuration pragma file containing the appropriate setting.
The exception to this rule is that units with an explicit configuration
pragma in the same file as the source unit are excluded from the
consistency check, as are all predefined units. The latter are compiled
by default in pragma Optimize_Alignment (Off) mode if no pragma appears
at the start of the file.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ordered" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Ordered (enumeration_first_subtype_LOCAL_NAME);

Most enumeration types are from a conceptual point of view unordered.
For example, consider:

type Color is (Red, Blue, Green, Yellow);

By Ada semantics `Blue &gt; Red' and `Green &gt; Blue', but really these
relations make no sense; the enumeration type merely specifies a set of
possible colors, and the order is unimportant.

For unordered enumeration types, it is generally a good idea if
clients avoid comparisons (other than equality or inequality) and
explicit ranges. (A _client_ is a unit where the type is referenced,
other than the unit where the type is declared, its body, and its
subunits.)  For example, if code buried in some client says:

if Current_Color &lt; Yellow then ...
if Current_Color in Blue .. Green then ...

then the client code is relying on the order, which is undesirable.  It
makes the code hard to read and creates maintenance difficulties if
entries have to be added to the enumeration type. Instead, the code in
the client should list the possibilities, or an appropriate subtype
should be declared in the unit that declares the original enumeration
type. E.g., the following subtype could be declared along with the type
`Color':

subtype RBG is Color range Red .. Green;

and then the client could write:

if Current_Color in RBG then ...
if Current_Color = Blue or Current_Color = Green then ...

However, some enumeration types are legitimately ordered from a
conceptual point of view. For example, if you declare:

type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

then the ordering imposed by the language is reasonable, and clients
can depend on it, writing for example:

if D in Mon .. Fri then ...
if D &lt; Wed then ...

The pragma `Ordered' is provided to mark enumeration types that are
conceptually ordered, alerting the reader that clients may depend on
the ordering. GNAT provides a pragma to mark enumerations as ordered
rather than one to mark them as unordered, since in our experience, the
great majority of enumeration types are conceptually unordered.

The types `Boolean', `Character', `Wide_Character', and
`Wide_Wide_Character' are considered to be ordered types, so each is
declared with a pragma `Ordered' in package `Standard'.

Normally pragma `Ordered' serves only as documentation and a guide
for coding standards, but GNAT provides a warning switch `-gnatw.u' that
requests warnings for inappropriate uses (comparisons and explicit
subranges) for unordered types. If this switch is used, then any
enumeration type not marked with pragma `Ordered' will be considered as
unordered, and will generate warnings for inappropriate uses.

For additional information please refer to the description of the
`-gnatw.u' switch in the GNAT Pro User's Guide.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Overflow_Mode" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Overflow_Mode
(  [General    =&gt;] MODE
[,[Assertions =&gt;] MODE]);

MODE ::= STRICT | MINIMIZED | ELIMINATED

This pragma sets the current overflow mode to the given setting. For
details of the meaning of these modes, please refer to the "Overflow
Check Handling in GNAT" appendix in the GNAT Pro User's Guide. If only
the `General' parameter is present, the given mode applies to all
expressions. If both parameters are present, the `General' mode applies
to expressions outside assertions, and the `Eliminated' mode applies to
expressions within assertions.

The case of the `MODE' parameter is ignored, so `MINIMIZED',
`Minimized' and `minimized' all have the same effect.

The `Overflow_Mode' pragma has the same scoping and placement rules
as pragma `Suppress', so it can occur either as a configuration pragma,
specifying a default for the whole program, or in a declarative scope,
where it applies to the remaining declarations and statements in that
scope.

The pragma `Suppress (Overflow_Check)' suppresses overflow checking,
but does not affect the overflow mode.

The pragma `Unsuppress (Overflow_Check)' unsuppresses (enables)
overflow checking, but does not affect the overflow mode.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Overriding_Renamings" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Overriding_Renamings;

This is a GNAT configuration pragma to simplify porting legacy code
accepted by the Rational Ada compiler. In the presence of this pragma,
a renaming declaration that renames an inherited operation declared in
the same scope is legal if selected notation is used as in:

pragma Overriding_Renamings;

package R is
function F (..);

function F (..) renames R.F;
end R;

even though RM 8.3 (15) stipulates that an overridden operation is
not visible within the declaration of the overriding operation.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pack" origin = "Ada RM">
      <DOC>
Syntax:

pragma Pack;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Page" origin = "Ada RM">
      <DOC>
Syntax:

pragma Page;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Part_Of" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.2.6.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Partition_Elaboration_Policy" origin = "Ada RM">
      <DOC>
Syntax:

pragma Partition_Elaboration_Policy (POLICY_IDENTIFIER);

POLICY_IDENTIFIER ::= Concurrent | Sequential

This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Passive" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Passive [(Semaphore | No)];

Syntax checked, but otherwise ignored by GNAT.  This is recognized for
compatibility with DEC Ada 83 implementations, where it is used within a
task definition to request that a task be made passive.  If the argument
`Semaphore' is present, or the argument is omitted, then DEC Ada 83
treats the pragma as an assertion that the containing task is passive
and that optimization of context switch with this task is permitted and
desired.  If the argument `No' is present, the task must not be
optimized.  GNAT does not attempt to optimize any tasks in this manner
(since protected objects are available in place of passive tasks).

For more information on the subject of passive tasks, see the section
"Passive Task Optimization" in the GNAT Users Guide.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Persistent_BSS" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Persistent_BSS [(LOCAL_NAME)]

This pragma allows selected objects to be placed in the
`.persistent_bss' section. On some targets the linker and loader
provide for special treatment of this section, allowing a program to be
reloaded without affecting the contents of this data (hence the name
persistent).

There are two forms of usage. If an argument is given, it must be the
local name of a library level object, with no explicit initialization
and whose type is potentially persistent. If no argument is given, then
the pragma is a configuration pragma, and applies to all library level
objects with no explicit initialization of potentially persistent types.

A potentially persistent type is a scalar type, or an untagged,
non-discriminated record, all of whose components have no explicit
initialization and are themselves of a potentially persistent type, or
an array, all of whose constraints are static, and whose component type
is potentially persistent.

If this pragma is used on a target where this feature is not
supported, then the pragma will be ignored. See also `pragma
Linker_Section'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Polling" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Polling (ON | OFF);

This pragma controls the generation of polling code.  This is normally
off.  If `pragma Polling (ON)' is used then periodic calls are
generated to the routine `Ada.Exceptions.Poll'.  This routine is a
separate unit in the runtime library, and can be found in file
`a-excpol.adb'.

Pragma `Polling' can appear as a configuration pragma (for example it
can be placed in the `gnat.adc' file) to enable polling globally, or it
can be used in the statement or declaration sequence to control polling
more locally.

A call to the polling routine is generated at the start of every
loop and at the start of every subprogram call.  This guarantees that
the `Poll' routine is called frequently, and places an upper bound
(determined by the complexity of the code) on the period between two
`Poll' calls.

The primary purpose of the polling interface is to enable
asynchronous aborts on targets that cannot otherwise support it (for
example Windows NT), but it may be used for any other purpose requiring
periodic polling.  The standard version is null, and can be replaced by
a user program.  This will require re-compilation of the
`Ada.Exceptions' package that can be found in files `a-except.ads' and
`a-except.adb'.

A standard alternative unit (in file `4wexcpol.adb' in the standard
GNAT distribution) is used to enable the asynchronous abort capability
on targets that do not normally support the capability.  The version of
`Poll' in this file makes a call to the appropriate runtime routine to
test for an abort condition.

Note that polling can also be enabled by use of the `-gnatP' switch.
*Note Switches for gcc: (gnat_ugn)Switches for gcc, for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Post" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Post (Boolean_Expression);

The `Post' pragma is intended to be an exact replacement for the
language-defined `Post' aspect, and shares its restrictions and
semantics.  It must appear either immediately following the
corresponding subprogram declaration (only other pragmas may
intervene), or if there is no separate subprogram declaration, then it
can appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Post_Class" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Post_Class (Boolean_Expression);

The `Post_Class' pragma is intended to be an exact replacement for the
language-defined `Post'Class' aspect, and shares its restrictions and
semantics.  It must appear either immediately following the
corresponding subprogram declaration (only other pragmas may
intervene), or if there is no separate subprogram declaration, then it
can appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Note: This pragma is called `Post_Class' rather than `Post'Class'
because the latter would not be strictly conforming to the allowed
syntax for pragmas. The motivation for provinding pragmas equivalent to
the aspects is to allow a program to be written using the pragmas, and
then compiled if necessary using an Ada compiler that does not
recognize the pragmas or aspects, but is prepared to ignore the
pragmas. The assertion policy that controls this pragma is
`Post'Class', not `Post_Class'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Postcondition" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Postcondition (
[Check   =&gt;] Boolean_Expression
[,[Message =&gt;] String_Expression]);

The `Postcondition' pragma allows specification of automatic
postcondition checks for subprograms. These checks are similar to
assertions, but are automatically inserted just prior to the return
statements of the subprogram with which they are associated (including
implicit returns at the end of procedure bodies and associated
exception handlers).

In addition, the boolean expression which is the condition which
must be true may contain references to function'Result in the case of a
function to refer to the returned value.

`Postcondition' pragmas may appear either immediately following the
(separate) declaration of a subprogram, or at the start of the
declarations of a subprogram body. Only other pragmas may intervene
(that is appear between the subprogram declaration and its
postconditions, or appear before the postcondition in the declaration
sequence in a subprogram body). In the case of a postcondition
appearing after a subprogram declaration, the formal arguments of the
subprogram are visible, and can be referenced in the postcondition
expressions.

The postconditions are collected and automatically tested just
before any return (implicit or explicit) in the subprogram body.  A
postcondition is only recognized if postconditions are active at the
time the pragma is encountered. The compiler switch `gnata' turns on
all postconditions by default, and pragma `Check_Policy' with an
identifier of `Postcondition' can also be used to control whether
postconditions are active.

The general approach is that postconditions are placed in the spec
if they represent functional aspects which make sense to the client.
For example we might have:

function Direction return Integer;
pragma Postcondition
(Direction'Result = +1
or else
Direction'Result = -1);

which serves to document that the result must be +1 or -1, and will
test that this is the case at run time if postcondition checking is
active.

Postconditions within the subprogram body can be used to check that
some internal aspect of the implementation, not visible to the client,
is operating as expected.  For instance if a square root routine keeps
an internal counter of the number of times it is called, then we might
have the following postcondition:

Sqrt_Calls : Natural := 0;

function Sqrt (Arg : Float) return Float is
pragma Postcondition
(Sqrt_Calls = Sqrt_Calls'Old + 1);

end Sqrt

As this example, shows, the use of the `Old' attribute is often useful
in postconditions to refer to the state on entry to the subprogram.

Note that postconditions are only checked on normal returns from the
subprogram. If an abnormal return results from raising an exception,
then the postconditions are not checked.

If a postcondition fails, then the exception
`System.Assertions.Assert_Failure' is raised. If a message argument was
supplied, then the given string will be used as the exception message.
If no message argument was supplied, then the default message has the
form "Postcondition failed at file:line". The exception is raised in
the context of the subprogram body, so it is possible to catch
postcondition failures within the subprogram body itself.

Within a package spec, normal visibility rules in Ada would prevent
forward references within a postcondition pragma to functions defined
later in the same package. This would introduce undesirable ordering
constraints. To avoid this problem, all postcondition pragmas are
analyzed at the end of the package spec, allowing forward references.

The following example shows that this even allows mutually recursive
postconditions as in:

package Parity_Functions is
function Odd  (X : Natural) return Boolean;
pragma Postcondition
(Odd'Result =
(x = 1
or else
(x /= 0 and then Even (X - 1))));

function Even (X : Natural) return Boolean;
pragma Postcondition
(Even'Result =
(x = 0
or else
(x /= 1 and then Odd (X - 1))));

end Parity_Functions;

There are no restrictions on the complexity or form of conditions used
within `Postcondition' pragmas.  The following example shows that it is
even possible to verify performance behavior.

package Sort is

Performance : constant Float;
--  Performance constant set by implementation
--  to match target architecture behavior.

procedure Treesort (Arg : String);
--  Sorts characters of argument using N*logN sort
pragma Postcondition
(Float (Clock - Clock'Old) &lt;=
Float (Arg'Length) *
log (Float (Arg'Length)) *
Performance);
end Sort;

Note: postcondition pragmas associated with subprograms that are marked
as Inline_Always, or those marked as Inline with front-end inlining
(-gnatN option set) are accepted and legality-checked by the compiler,
but are ignored at run-time even if postcondition checking is enabled.

Note that pragma `Postcondition' differs from the language-defined
`Post' aspect (and corresponding `Post' pragma) in allowing multiple
occurrences, allowing occurrences in the body even if there is a
separate spec, and allowing a second string parameter, and the use of
the pragma identifier `Check'. Historically, pragma `Postcondition' was
implemented prior to the development of Ada 2012, and has been retained
in its original form for compatibility purposes.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pre" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Pre (Boolean_Expression);

The `Pre' pragma is intended to be an exact replacement for the
language-defined `Pre' aspect, and shares its restrictions and
semantics.  It must appear either immediately following the
corresponding subprogram declaration (only other pragmas may
intervene), or if there is no separate subprogram declaration, then it
can appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pre_Class" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Pre_Class (Boolean_Expression);

The `Pre_Class' pragma is intended to be an exact replacement for the
language-defined `Pre'Class' aspect, and shares its restrictions and
semantics.  It must appear either immediately following the
corresponding subprogram declaration (only other pragmas may
intervene), or if there is no separate subprogram declaration, then it
can appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Note: This pragma is called `Pre_Class' rather than `Pre'Class'
because the latter would not be strictly conforming to the allowed
syntax for pragmas. The motivation for providing pragmas equivalent to
the aspects is to allow a program to be written using the pragmas, and
then compiled if necessary using an Ada compiler that does not
recognize the pragmas or aspects, but is prepared to ignore the
pragmas. The assertion policy that controls this pragma is `Pre'Class',
not `Pre_Class'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Precondition" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Precondition (
[Check   =&gt;] Boolean_Expression
[,[Message =&gt;] String_Expression]);

The `Precondition' pragma is similar to `Postcondition' except that the
corresponding checks take place immediately upon entry to the
subprogram, and if a precondition fails, the exception is raised in the
context of the caller, and the attribute 'Result cannot be used within
the precondition expression.

Otherwise, the placement and visibility rules are identical to those
described for postconditions. The following is an example of use within
a package spec:

package Math_Functions is

function Sqrt (Arg : Float) return Float;
pragma Precondition (Arg &gt;= 0.0)

end Math_Functions;

`Precondition' pragmas may appear either immediately following the
(separate) declaration of a subprogram, or at the start of the
declarations of a subprogram body. Only other pragmas may intervene
(that is appear between the subprogram declaration and its
postconditions, or appear before the postcondition in the declaration
sequence in a subprogram body).

Note: precondition pragmas associated with subprograms that are
marked as Inline_Always, or those marked as Inline with front-end
inlining (-gnatN option set) are accepted and legality-checked by the
compiler, but are ignored at run-time even if precondition checking is
enabled.

Note that pragma `Precondition' differs from the language-defined
`Pre' aspect (and corresponding `Pre' pragma) in allowing multiple
occurrences, allowing occurrences in the body even if there is a
separate spec, and allowing a second string parameter, and the use of
the pragma identifier `Check'. Historically, pragma `Precondition' was
implemented prior to the development of Ada 2012, and has been retained
in its original form for compatibility purposes.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Predicate" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Predicate
([Entity =&gt;] type_LOCAL_NAME,
[Check  =&gt;] EXPRESSION);

This pragma (available in all versions of Ada in GNAT) encompasses both
the `Static_Predicate' and `Dynamic_Predicate' aspects in Ada 2012. A
predicate is regarded as static if it has an allowed form for
`Static_Predicate' and is otherwise treated as a `Dynamic_Predicate'.
Otherwise, predicates specified by this pragma behave exactly as
described in the Ada 2012 reference manual.  For example, if we have

type R is range 1 .. 10;
subtype S is R;
pragma Predicate (Entity =&gt; S, Check =&gt; S not in 4 .. 6);
subtype Q is R
pragma Predicate (Entity =&gt; Q, Check =&gt; F(Q) or G(Q));

the effect is identical to the following Ada 2012 code:

type R is range 1 .. 10;
subtype S is R with
Static_Predicate =&gt; S not in 4 .. 6;
subtype Q is R with
Dynamic_Predicate =&gt; F(Q) or G(Q);

Note that there is are no pragmas `Dynamic_Predicate' or
`Static_Predicate'. That is because these pragmas would affect legality
and semantics of the program and thus do not have a neutral effect if
ignored.  The motivation behind providing pragmas equivalent to
corresponding aspects is to allow a program to be written using the
pragmas, and then compiled with a compiler that will ignore the
pragmas. That doesn't work in the case of static and dynamic
predicates, since if the corresponding pragmas are ignored, then the
behavior of the program is fundamentally changed (for example a
membership test `A in B' would not take into account a predicate
defined for subtype B). When following this approach, the use of
predicates should be avoided.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Preelaborable_Initialization" origin = "Ada RM">
      <DOC>
Syntax:

pragma Preelaborable_Initialization (DIRECT_NAME);

This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Preelaborate" origin = "Ada RM">
      <DOC>
Syntax:

pragma Preelaborate [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Preelaborate_05" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Preelaborate_05 [(library_unit_NAME)];

This pragma is only available in GNAT mode (`-gnatg' switch set) and is
intended for use in the standard run-time library only. It has no
effect in Ada 83 or Ada 95 mode, but is equivalent to `pragma
Prelaborate' when operating in later Ada versions. This is used to
handle some cases where packages not previously preelaborable became so
in Ada 2005.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Prefix_Exception_Messages" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Prefix_Exception_Messages;

This is an implementation-defined configuration pragma that affects the
behavior of raise statements with a message given as a static string
constant (typically a string literal). In such cases, the string will
be automatically prefixed by the name of the enclosing entity (giving
the package and subprogram containing the raise statement). This helps
to identify where messages are coming from, and this mode is automatic
for the run-time library.

The pragma has no effect if the message is computed with an
expression other than a static string constant, since the assumption in
this case is that the program computes exactly the string it wants. If
you still want the prefixing in this case, you can always call
`GNAT.Source_Info.Enclosing_Entity' and prepend the string manually.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Priority" origin = "Ada RM">
      <DOC>
Syntax:

pragma Priority;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Priority_Specific_Dispatching" origin = "Ada RM">
      <DOC>
Syntax:

pragma Priority_Specific_Dispatching (
POLICY_IDENTIFIER,
first_priority_EXPRESSION,
last_priority_EXPRESSION)

POLICY_IDENTIFIER ::=
EDF_Across_Priorities            |
FIFO_Within_Priorities           |
Non_Preemptive_Within_Priorities |
Round_Robin_Within_Priorities

This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Profile" origin = "Ada RM">
      <DOC>
Syntax:

pragma Profile (Ravenscar | Restricted | Rational);

This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma. This is a
configuration pragma that establishes a set of configiuration pragmas
that depend on the argument. `Ravenscar' is standard in Ada 2005.  The
other two possibilities (`Restricted' or `Rational') are
implementation-defined. The set of configuration pragmas is defined in
the following sections.

* Pragma Profile (Ravenscar) The `Ravenscar' profile is standard in
Ada 2005, but is available in all earlier versions of Ada as an
implementation-defined pragma. This profile establishes the
following set of configuration pragmas:

`Task_Dispatching_Policy (FIFO_Within_Priorities)'
[RM D.2.2] Tasks are dispatched following a preemptive
priority-ordered scheduling policy.

`Locking_Policy (Ceiling_Locking)'
[RM D.3] While tasks and interrupts execute a protected
action, they inherit the ceiling priority of the
corresponding protected object.

`Detect_Blocking'
This pragma forces the detection of potentially blocking
operations within a protected operation, and to raise
Program_Error if that happens.
plus the following set of restrictions:

`Max_Entry_Queue_Length =&gt; 1'
No task can be queued on a protected entry.

`Max_Protected_Entries =&gt; 1'

`Max_Task_Entries =&gt; 0'
No rendezvous statements are allowed.

`No_Abort_Statements'

`No_Dynamic_Attachment'

`No_Dynamic_Priorities'

`No_Implicit_Heap_Allocations'

`No_Local_Protected_Objects'

`No_Local_Timing_Events'

`No_Protected_Type_Allocators'

`No_Relative_Delay'

`No_Requeue_Statements'

`No_Select_Statements'

`No_Specific_Termination_Handlers'

`No_Task_Allocators'

`No_Task_Hierarchy'

`No_Task_Termination'

`Simple_Barriers'
The Ravenscar profile also includes the following restrictions
that specify that there are no semantic dependences on the
corresponding predefined packages:

`No_Dependence =&gt; Ada.Asynchronous_Task_Control'

`No_Dependence =&gt; Ada.Calendar'

`No_Dependence =&gt; Ada.Execution_Time.Group_Budget'

`No_Dependence =&gt; Ada.Execution_Time.Timers'

`No_Dependence =&gt; Ada.Task_Attributes'

`No_Dependence =&gt; System.Multiprocessors.Dispatching_Domains'

This set of configuration pragmas and restrictions correspond to
the definition of the "Ravenscar Profile" for limited tasking,
devised and published by the `International Real-Time Ada
Workshop', 1997, and whose most recent description is available at
`http://www-users.cs.york.ac.uk/~burns/ravenscar.ps'.

The original definition of the profile was revised at subsequent
IRTAW meetings. It has been included in the ISO `Guide for the Use
of the Ada Programming Language in High Integrity Systems', and
has been approved by ISO/IEC/SC22/WG9 for inclusion in the next
revision of the standard. The formal definition given by the Ada
Rapporteur Group (ARG) can be found in two Ada Issues (AI-249 and
AI-305) available at
`http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00249.txt' and
`http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00305.txt'.

The above set is a superset of the restrictions provided by pragma
`Profile (Restricted)', it includes six additional restrictions
(`Simple_Barriers', `No_Select_Statements', `No_Calendar',
`No_Implicit_Heap_Allocations', `No_Relative_Delay' and
`No_Task_Termination').  This means that pragma `Profile
(Ravenscar)', like the pragma `Profile (Restricted)',
automatically causes the use of a simplified, more efficient
version of the tasking run-time system.

* Pragma Profile (Restricted) This profile corresponds to the GNAT
restricted run time. It establishes the following set of
restrictions:

* No_Abort_Statements

* No_Entry_Queue

* No_Task_Hierarchy

* No_Task_Allocators

* No_Dynamic_Priorities

* No_Terminate_Alternatives

* No_Dynamic_Attachment

* No_Protected_Type_Allocators

* No_Local_Protected_Objects

* No_Requeue_Statements

* No_Task_Attributes_Package

* Max_Asynchronous_Select_Nesting =  0

* Max_Task_Entries =  0

* Max_Protected_Entries = 1

* Max_Select_Alternatives = 0

This set of restrictions causes the automatic selection of a
simplified version of the run time that provides improved
performance for the limited set of tasking functionality permitted
by this set of restrictions.

* Pragma Profile (Rational) The Rational profile is intended to
facilitate porting legacy code that compiles with the Rational
APEX compiler, even when the code includes non- conforming Ada
constructs.  The profile enables the following three pragmas:

* pragma Implicit_Packing

* pragma Overriding_Renamings

* pragma Use_VADS_Size
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Profile (Ravenscar)" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Profile (Ravenscar);

A configuration pragma that establishes the following set of
configuration pragmas:

`Task_Dispatching_Policy (FIFO_Within_Priorities)'
[RM D.2.2] Tasks are dispatched following a preemptive
priority-ordered scheduling policy.

`Locking_Policy (Ceiling_Locking)'
[RM D.3] While tasks and interrupts execute a protected action,
they inherit the ceiling priority of the corresponding protected
object.
plus the following set of restrictions:

`Max_Entry_Queue_Length = 1'
Defines the maximum number of calls that are queued on a
(protected) entry.  Note that this restrictions is checked at run
time. Violation of this restriction results in the raising of
Program_Error exception at the point of the call. For the Profile
(Ravenscar) the value of Max_Entry_Queue_Length is always 1 and
hence no task can be queued on a protected entry.

`Max_Protected_Entries = 1'
[RM D.7] Specifies the maximum number of entries per protected
type. The bounds of every entry family of a protected unit shall
be static, or shall be defined by a discriminant of a subtype
whose corresponding bound is static.  For the Profile (Ravenscar)
the value of Max_Protected_Entries is always 1.

`Max_Task_Entries = 0'
[RM D.7] Specifies the maximum number of entries per task.  The
bounds of every entry family of a task unit shall be static, or
shall be defined by a discriminant of a subtype whose
corresponding bound is static.  A value of zero indicates that no
rendezvous are possible.  For the Profile (Ravenscar), the value
of Max_Task_Entries is always 0 (zero).

`No_Abort_Statements'
[RM D.7] There are no abort_statements, and there are no calls to
Task_Identification.Abort_Task.

`No_Asynchronous_Control'
There are no semantic dependences on the package
Asynchronous_Task_Control.

`No_Calendar'
There are no semantic dependencies on the package Ada.Calendar.

`No_Dynamic_Attachment'
There is no call to any of the operations defined in package
Ada.Interrupts (Is_Reserved, Is_Attached, Current_Handler,
Attach_Handler, Exchange_Handler, Detach_Handler, and Reference).

`No_Dynamic_Priorities'
[RM D.7] There are no semantic dependencies on the package
Dynamic_Priorities.

`No_Implicit_Heap_Allocations'
[RM D.7] No constructs are allowed to cause implicit heap
allocation.

`No_Local_Protected_Objects'
Protected objects and access types that designate such objects
shall be declared only at library level.

`No_Local_Timing_Events'
[RM D.7] All objects of type Ada.Timing_Events.Timing_Event are
declared at the library level.

`No_Protected_Type_Allocators'
There are no allocators for protected types or types containing
protected subcomponents.

`No_Relative_Delay'
There are no delay_relative statements.

`No_Requeue_Statements'
Requeue statements are not allowed.

`No_Select_Statements'
There are no select_statements.

`No_Specific_Termination_Handlers'
[RM D.7] There are no calls to
Ada.Task_Termination.Set_Specific_Handler or to
Ada.Task_Termination.Specific_Handler.

`No_Task_Allocators'
[RM D.7] There are no allocators for task types or types
containing task subcomponents.

`No_Task_Attributes_Package'
There are no semantic dependencies on the Ada.Task_Attributes
package.

`No_Task_Hierarchy'
[RM D.7] All (non-environment) tasks depend directly on the
environment task of the partition.

`No_Task_Termination'
Tasks which terminate are erroneous.

`No_Unchecked_Conversion'
There are no semantic dependencies on the Ada.Unchecked_Conversion
package.

`No_Unchecked_Deallocation'
There are no semantic dependencies on the
Ada.Unchecked_Deallocation package.

`Simple_Barriers'
Entry barrier condition expressions shall be either static boolean
expressions or boolean objects which are declared in the protected
type which contains the entry.

This set of configuration pragmas and restrictions correspond to the
definition of the "Ravenscar Profile" for limited tasking, devised and
published by the `International Real-Time Ada Workshop', 1997, and
whose most recent description is available at
`http://www-users.cs.york.ac.uk/~burns/ravenscar.ps'.

The original definition of the profile was revised at subsequent
IRTAW meetings. It has been included in the ISO `Guide for the Use of
the Ada Programming Language in High Integrity Systems', and has been
approved by ISO/IEC/SC22/WG9 for inclusion in the next revision of the
standard. The formal definition given by the Ada Rapporteur Group (ARG)
can be found in two Ada Issues (AI-249 and AI-305) available at
`http://www.ada-auth.org/cgi-bin/cvsweb.cgi/AIs/AI-00249.TXT' and
`http://www.ada-auth.org/cgi-bin/cvsweb.cgi/AIs/AI-00305.TXT'
respectively.

The above set is a superset of the restrictions provided by pragma
`Profile (Restricted)', it includes six additional restrictions
(`Simple_Barriers', `No_Select_Statements', `No_Calendar',
`No_Implicit_Heap_Allocations', `No_Relative_Delay' and
`No_Task_Termination').  This means that pragma `Profile (Ravenscar)',
like the pragma `Profile (Restricted)', automatically causes the use of
a simplified, more efficient version of the tasking run-time system.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Profile (Restricted)" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Profile (Restricted);

A configuration pragma that establishes the following set of
restrictions:

* No_Abort_Statements

* No_Entry_Queue

* No_Task_Hierarchy

* No_Task_Allocators

* No_Dynamic_Priorities

* No_Terminate_Alternatives

* No_Dynamic_Attachment

* No_Protected_Type_Allocators

* No_Local_Protected_Objects

* No_Requeue_Statements

* No_Task_Attributes_Package

* Max_Asynchronous_Select_Nesting =  0

* Max_Task_Entries =  0

* Max_Protected_Entries = 1

* Max_Select_Alternatives = 0

This set of restrictions causes the automatic selection of a simplified
version of the run time that provides improved performance for the
limited set of tasking functionality permitted by this set of
restrictions.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Profile_Warnings" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Profile_Warnings (Ravenscar | Restricted | Rational);

This is an implementation-defined pragma that is similar in effect to
`pragma Profile' except that instead of generating `Restrictions'
pragmas, it generates `Restriction_Warnings' pragmas. The result is that
violations of the profile generate warning messages instead of error
messages.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Propagate_Exceptions" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Propagate_Exceptions;

This pragma is now obsolete and, other than generating a warning if
warnings on obsolescent features are enabled, is ignored.  It is
retained for compatibility purposes. It used to be used in connection
with optimization of a now-obsolete mechanism for implementation of
exceptions.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Provide_Shift_Operators" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Provide_Shift_Operators (integer_first_subtype_LOCAL_NAME);

This pragma can be applied to a first subtype local name that specifies
either an unsigned or signed type. It has the effect of providing the
five shift operators (Shift_Left, Shift_Right, Shift_Right_Arithmetic,
Rotate_Left and Rotate_Right) for the given type. It is similar to
including the function declarations for these five operators, together
with the pragma Import (Intrinsic, ...) statements.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Psect_Object" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Psect_Object (
[Internal =&gt;] LOCAL_NAME,
[, [External =&gt;] EXTERNAL_SYMBOL]
[, [Size     =&gt;] EXTERNAL_SYMBOL]);

EXTERNAL_SYMBOL ::=
IDENTIFIER
| static_string_EXPRESSION

This pragma is identical in effect to pragma `Common_Object'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pure" origin = "Ada RM">
      <DOC>
Syntax:

pragma Pure [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pure_05" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Pure_05 [(library_unit_NAME)];

This pragma is only available in GNAT mode (`-gnatg' switch set) and is
intended for use in the standard run-time library only. It has no
effect in Ada 83 or Ada 95 mode, but is equivalent to `pragma Pure'
when operating in later Ada versions. This is used to handle some cases
where packages not previously pure became so in Ada 2005.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pure_12" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Pure_12 [(library_unit_NAME)];

This pragma is only available in GNAT mode (`-gnatg' switch set) and is
intended for use in the standard run-time library only. It has no
effect in Ada 83, Ada 95, or Ada 2005 modes, but is equivalent to
`pragma Pure' when operating in later Ada versions. This is used to
handle some cases where packages not previously pure became so in Ada
2012.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Pure_Function" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Pure_Function ([Entity =&gt;] function_LOCAL_NAME);

This pragma appears in the same declarative part as a function
declaration (or a set of function declarations if more than one
overloaded declaration exists, in which case the pragma applies to all
entities).  It specifies that the function `Entity' is to be considered
pure for the purposes of code generation.  This means that the compiler
can assume that there are no side effects, and in particular that two
calls with identical arguments produce the same result.  It also means
that the function can be used in an address clause.

Note that, quite deliberately, there are no static checks to try to
ensure that this promise is met, so `Pure_Function' can be used with
functions that are conceptually pure, even if they do modify global
variables.  For example, a square root function that is instrumented to
count the number of times it is called is still conceptually pure, and
can still be optimized, even though it modifies a global variable (the
count).  Memo functions are another example (where a table of previous
calls is kept and consulted to avoid re-computation).

Note also that the normal rules excluding optimization of subprograms
in pure units (when parameter types are descended from System.Address,
or when the full view of a parameter type is limited), do not apply for
the Pure_Function case. If you explicitly specify Pure_Function, the
compiler may optimize away calls with identical arguments, and if that
results in unexpected behavior, the proper action is not to use the
pragma for subprograms that are not (conceptually) pure.

Note: Most functions in a `Pure' package are automatically pure, and
there is no need to use pragma `Pure_Function' for such functions.  One
exception is any function that has at least one formal of type
`System.Address' or a type derived from it.  Such functions are not
considered pure by default, since the compiler assumes that the
`Address' parameter may be functioning as a pointer and that the
referenced data may change even if the address value does not.
Similarly, imported functions are not considered to be pure by default,
since there is no way of checking that they are in fact pure.  The use
of pragma `Pure_Function' for such a function will override these
default assumption, and cause the compiler to treat a designated
subprogram as pure in these cases.

Note: If pragma `Pure_Function' is applied to a renamed function, it
applies to the underlying renamed function.  This can be used to
disambiguate cases of overloading where some but not all functions in a
set of overloaded functions are to be designated as pure.

If pragma `Pure_Function' is applied to a library level function, the
function is also considered pure from an optimization point of view,
but the unit is not a Pure unit in the categorization sense. So for
example, a function thus marked is free to `with' non-pure units.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Queuing_Policy" origin = "Ada RM">
      <DOC>
Syntax:

pragma Queuing_Policy (policy_identifier);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Rational" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Rational;

This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:

pragma Profile (Rational);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Ravenscar" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Ravenscar;

This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:

pragma Profile (Ravenscar);

which is the preferred method of setting the `Ravenscar' profile.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Refined_Depends" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 6.1.5.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Refined_Global" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 6.1.4.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Refined_Post" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.2.7.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Refined_State" origin = "GNAT RM">
      <DOC>
For the description of this pragma, see SPARK 2014 Reference Manual,
section 7.2.2.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Relative_Deadline" origin = "Ada RM">
      <DOC>
Syntax:

pragma Relative_Deadline (time_span_EXPRESSION);

This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.  See Ada 2012
Reference Manual for details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Remote_Access_Type" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Remote_Access_Type ([Entity =&gt;] formal_access_type_LOCAL_NAME);

This pragma appears in the formal part of a generic declaration.  It
specifies an exception to the RM rule from E.2.2(17/2), which forbids
the use of a remote access to class-wide type as actual for a formal
access type.

When this pragma applies to a formal access type `Entity', that type
is treated as a remote access to class-wide type in the generic.  It
must be a formal general access type, and its designated type must be
the class-wide type of a formal tagged limited private type from the
same generic declaration.

In the generic unit, the formal type is subject to all restrictions
pertaining to remote access to class-wide types. At instantiation, the
actual type must be a remote access to class-wide type.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Remote_Call_Interface" origin = "Ada RM">
      <DOC>
Syntax:

pragma Remote_Call_Interface [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Remote_Types" origin = "Ada RM">
      <DOC>
Syntax:

pragma Remote_Types [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Restricted_Run_Time" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Restricted_Run_Time;

This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:

pragma Profile (Restricted);

which is the preferred method of setting the restricted run time
profile.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Restriction_Warnings" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Restriction_Warnings
(restriction_IDENTIFIER {, restriction_IDENTIFIER});

This pragma allows a series of restriction identifiers to be specified
(the list of allowed identifiers is the same as for pragma
`Restrictions'). For each of these identifiers the compiler checks for
violations of the restriction, but generates a warning message rather
than an error message if the restriction is violated.

One use of this is in situations where you want to know about
violations of a restriction, but you want to ignore some of these
violations. Consider this example, where you want to set Ada_95 mode
and enable style checks, but you want to know about any other use of
implementation pragmas:

pragma Restriction_Warnings (No_Implementation_Pragmas);
(Off, "violation of*No_Implementation_Pragmas*");
pragma Ada_95;
pragma Style_Checks ("2bfhkM160");
pragma Warnings (On, "violation of*No_Implementation_Pragmas*");

By including the above lines in a configuration pragmas file, the
Ada_95 and Style_Checks pragmas are accepted without generating a
warning, but any other use of implementation defined pragmas will cause
a warning to be generated.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Restrictions" origin = "Ada RM">
      <DOC>
Syntax:

pragma Restrictions (restriction{, restriction});
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Reviewable" origin = "Ada RM">
      <DOC>
Syntax:

pragma Reviewable;

This pragma is an RM-defined standard pragma, but has no effect on the
program being compiled, or on the code generated for the program.

To obtain the required output specified in RM H.3.1, the compiler
must be run with various special switches as follows:

Where compiler-generated run-time checks remain
The switch `-gnatGL' may be used to list the expanded code in
pseudo-Ada form.  Runtime checks show up in the listing either as
explicit checks or operators marked with {} to indicate a check is
present.

An identification of known exceptions at compile time
If the program is compiled with `-gnatwa', the compiler warning
messages will indicate all cases where the compiler detects that
an exception is certain to occur at run time.

Possible reads of uninitialized variables
The compiler warns of many such cases, but its output is
incomplete.  The CodePeer analysis tool may be used to obtain a
comprehensive list of all possible points at which uninitialized
data may be read.

Where run-time support routines are implicitly invoked
In the output from `-gnatGL', run-time calls are explicitly listed
as calls to the relevant run-time routine.

Object code listing
This may be obtained either by using the `-S' switch, or the
objdump utility.  

Constructs known to be erroneous at compile time
These are identified by warnings issued by the compiler (use
`-gnatwa').  

Stack usage information
Static stack usage data (maximum per-subprogram) can be obtained
via the `-fstack-usage' switch to the compiler.  Dynamic stack
usage data (per task) can be obtained via the `-u' switch to
gnatbind The gnatstack utility can be used to provide additional
information on stack usage.

Object code listing of entire partition
This can be obtained by compiling the partition with `-S', or by
applying objdump to all the object files that are part of the
partition.

A description of the run-time model
The full sources of the run-time are available, and the
documentation of these routines describes how these run-time
routines interface to the underlying operating system facilities.

Control and data-flow information
The CodePeer tool may be used to obtain complete control and
data-flow information, as well as comprehensive messages
identifying possible problems based on this information.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "SPARK_Mode" origin = "GNAT RM">
      <DOC>
Syntax:

pragma SPARK_Mode [(On | Off)] ;

In general a program can have some parts that are in SPARK 2014 (and
follow all the rules in the SPARK Reference Manual), and some parts
that are full Ada 2012.

The SPARK_Mode pragma is used to identify which parts are in SPARK
2014 (by default programs are in full Ada). The SPARK_Mode pragma can
be used in the following places:

* As a configuration pragma, in which case it sets the default mode
for all units compiled with this pragma.

* Immediately following a library-level subprogram spec

* Immediately within a library-level package body

* Immediately following the `private' keyword of a library-level
package spec

* Immediately following the `begin' keyword of a library-level
package body

* Immediately within a library-level subprogram body


Normally a subprogram or package spec/body inherits the current mode
that is active at the point it is declared. But this can be overridden
by pragma within the spec or body as above.

The basic consistency rule is that you can't turn SPARK_Mode back
`On', once you have explicitly (with a pragma) turned if `Off'. So the
following rules apply:

If a subprogram spec has SPARK_Mode `Off', then the body must also have
SPARK_Mode `Off'.

For a package, we have four parts:

* the package public declarations

* the package private part

* the body of the package

* the elaboration code after `begin'

For a package, the rule is that if you explicitly turn SPARK_Mode `Off'
for any part, then all the following parts must have SPARK_Mode `Off'.
Note that this may require repeating a pragma SPARK_Mode (`Off') in the
body. For example, if we have a configuration pragma SPARK_Mode (`On')
that turns the mode on by default everywhere, and one particular
package spec has pragma SPARK_Mode (`Off'), then that pragma will need
to be repeated in the package body.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Share_Generic" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Share_Generic (GNAME {, GNAME});

GNAME ::= generic_unit_NAME | generic_instance_NAME

This pragma is provided for compatibility with Dec Ada 83. It has no
effect in `GNAT' (which does not implement shared generics), other than
to check that the given names are all names of generic units or generic
instances.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Shared" origin = "GNAT RM">
      <DOC>
This pragma is provided for compatibility with Ada 83. The syntax and
semantics are identical to pragma Atomic.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Shared_Passive" origin = "Ada RM">
      <DOC>
Syntax:

pragma Shared_Passive [(library_unit_name)];
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Short_Circuit_And_Or" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Short_Circuit_And_Or;

This configuration pragma causes any occurrence of the AND operator
applied to operands of type Standard.Boolean to be short-circuited
(i.e. the AND operator is treated as if it were AND THEN). Or is
similarly treated as OR ELSE. This may be useful in the context of
certification protocols requiring the use of short-circuited logical
operators. If this configuration pragma occurs locally within the file
being compiled, it applies only to the file being compiled.  There is
no requirement that all units in a partition use this option.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Short_Descriptors" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Short_Descriptors

This pragma is provided for compatibility with other Ada
implementations. It is recognized but ignored by all current versions
of GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Simple_Storage_Pool_Type" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Simple_Storage_Pool_Type (type_LOCAL_NAME);

A type can be established as a "simple storage pool type" by applying
the representation pragma `Simple_Storage_Pool_Type' to the type.  A
type named in the pragma must be a library-level immutably limited
record type or limited tagged type declared immediately within a
package declaration.  The type can also be a limited private type whose
full type is allowed as a simple storage pool type.

For a simple storage pool type SSP, nonabstract primitive subprograms
`Allocate', `Deallocate', and `Storage_Size' can be declared that are
subtype conformant with the following subprogram declarations:

procedure Allocate
(Pool                     : in out SSP;
Storage_Address          : out System.Address;
Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
Alignment                : System.Storage_Elements.Storage_Count);

procedure Deallocate
(Pool : in out SSP;
Storage_Address          : System.Address;
Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
Alignment                : System.Storage_Elements.Storage_Count);

function Storage_Size (Pool : SSP)
return System.Storage_Elements.Storage_Count;

Procedure `Allocate' must be declared, whereas `Deallocate' and
`Storage_Size' are optional. If `Deallocate' is not declared, then
applying an unchecked deallocation has no effect other than to set its
actual parameter to null. If `Storage_Size' is not declared, then the
`Storage_Size' attribute applied to an access type associated with a
pool object of type SSP returns zero. Additional operations can be
declared for a simple storage pool type (such as for supporting a
mark/release storage-management discipline).

An object of a simple storage pool type can be associated with an
access type by specifying the attribute `Simple_Storage_Pool'. For
example:


My_Pool : My_Simple_Storage_Pool_Type;

type Acc is access My_Data_Type;

for Acc'Simple_Storage_Pool use My_Pool;

See attribute `Simple_Storage_Pool' for further details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Source_File_Name" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Source_File_Name (
[Unit_Name   =&gt;] unit_NAME,
Spec_File_Name =&gt;  STRING_LITERAL,
[Index =&gt; INTEGER_LITERAL]);

pragma Source_File_Name (
[Unit_Name   =&gt;] unit_NAME,
Body_File_Name =&gt;  STRING_LITERAL,
[Index =&gt; INTEGER_LITERAL]);

Use this to override the normal naming convention.  It is a
configuration pragma, and so has the usual applicability of
configuration pragmas (i.e. it applies to either an entire partition,
or to all units in a compilation, or to a single unit, depending on how
it is used.  UNIT_NAME is mapped to FILE_NAME_LITERAL.  The identifier
for the second argument is required, and indicates whether this is the
file name for the spec or for the body.

The optional Index argument should be used when a file contains
multiple units, and when you do not want to use `gnatchop' to separate
then into multiple files (which is the recommended procedure to limit
the number of recompilations that are needed when some sources change).
For instance, if the source file `source.ada' contains

package B is

end B;

with B;
procedure A is
begin

end A;

you could use the following configuration pragmas:

pragma Source_File_Name
(B, Spec_File_Name =&gt; "source.ada", Index =&gt; 1);
pragma Source_File_Name
(A, Body_File_Name =&gt; "source.ada", Index =&gt; 2);

Note that the `gnatname' utility can also be used to generate those
configuration pragmas.

Another form of the `Source_File_Name' pragma allows the
specification of patterns defining alternative file naming schemes to
apply to all files.

pragma Source_File_Name
(  [Spec_File_Name  =&gt;] STRING_LITERAL
[,[Casing          =&gt;] CASING_SPEC]
[,[Dot_Replacement =&gt;] STRING_LITERAL]);

pragma Source_File_Name
(  [Body_File_Name  =&gt;] STRING_LITERAL
[,[Casing          =&gt;] CASING_SPEC]
[,[Dot_Replacement =&gt;] STRING_LITERAL]);

pragma Source_File_Name
(  [Subunit_File_Name =&gt;] STRING_LITERAL
[,[Casing            =&gt;] CASING_SPEC]
[,[Dot_Replacement   =&gt;] STRING_LITERAL]);

CASING_SPEC ::= Lowercase | Uppercase | Mixedcase

The first argument is a pattern that contains a single asterisk
indicating the point at which the unit name is to be inserted in the
pattern string to form the file name.  The second argument is optional.
If present it specifies the casing of the unit name in the resulting
file name string.  The default is lower case.  Finally the third
argument allows for systematic replacement of any dots in the unit name
by the specified string literal.

Note that Source_File_Name pragmas should not be used if you are
using project files. The reason for this rule is that the project
manager is not aware of these pragmas, and so other tools that use the
projet file would not be aware of the intended naming conventions. If
you are using project files, file naming is controlled by
Source_File_Name_Project pragmas, which are usually supplied
automatically by the project manager. A pragma Source_File_Name cannot
appear after a *note Pragma Source_File_Name_Project::.

For more details on the use of the `Source_File_Name' pragma, *Note
Using Other File Names: (gnat_ugn)Using Other File Names, and *note
Alternative File Naming Schemes: (gnat_ugn)Alternative File Naming
Schemes.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Source_File_Name_Project" origin = "GNAT RM">
      <DOC>
This pragma has the same syntax and semantics as pragma
Source_File_Name.  It is only allowed as a stand alone configuration
pragma.  It cannot appear after a *note Pragma Source_File_Name::, and
most importantly, once pragma Source_File_Name_Project appears, no
further Source_File_Name pragmas are allowed.

The intention is that Source_File_Name_Project pragmas are always
generated by the Project Manager in a manner consistent with the naming
specified in a project file, and when naming is controlled in this
manner, it is not permissible to attempt to modify this naming scheme
using Source_File_Name or Source_File_Name_Project pragmas (which would
not be known to the project manager).
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Source_Reference" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Source_Reference (INTEGER_LITERAL, STRING_LITERAL);

This pragma must appear as the first line of a source file.
INTEGER_LITERAL is the logical line number of the line following the
pragma line (for use in error messages and debugging information).
STRING_LITERAL is a static string constant that specifies the file name
to be used in error messages and debugging information.  This is most
notably used for the output of `gnatchop' with the `-r' switch, to make
sure that the original unchopped source file is the one referred to.

The second argument must be a string literal, it cannot be a static
string expression other than a string literal.  This is because its
value is needed for error messages issued by all phases of the compiler.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Static_Elaboration_Desired" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Static_Elaboration_Desired;

This pragma is used to indicate that the compiler should attempt to
initialize statically the objects declared in the library unit to which
the pragma applies, when these objects are initialized (explicitly or
implicitly) by an aggregate.  In the absence of this pragma, aggregates
in object declarations are expanded into assignments and loops, even
when the aggregate components are static constants. When the aggregate
is present the compiler builds a static expression that requires no
run-time code, so that the initialized object can be placed in
read-only data space. If the components are not static, or the
aggregate has more that 100 components, the compiler emits a warning
that the pragma cannot be obeyed. (See also the restriction
No_Implicit_Loops, which supports static construction of larger
aggregates with static components that include an others choice.)
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Storage_Size" origin = "Ada RM">
      <DOC>
Syntax:

pragma Storage_Size;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Stream_Convert" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Stream_Convert (
[Entity =&gt;] type_LOCAL_NAME,
[Read   =&gt;] function_NAME,
[Write  =&gt;] function_NAME);

This pragma provides an efficient way of providing user-defined stream
attributes.  Not only is it simpler to use than specifying the
attributes directly, but more importantly, it allows the specification
to be made in such a way that the predefined unit Ada.Streams is not
loaded unless it is actually needed (i.e. unless the stream attributes
are actually used); the use of the Stream_Convert pragma adds no
overhead at all, unless the stream attributes are actually used on the
designated type.

The first argument specifies the type for which stream functions are
provided.  The second parameter provides a function used to read values
of this type.  It must name a function whose argument type may be any
subtype, and whose returned type must be the type given as the first
argument to the pragma.

The meaning of the READ parameter is that if a stream attribute
directly or indirectly specifies reading of the type given as the first
parameter, then a value of the type given as the argument to the Read
function is read from the stream, and then the Read function is used to
convert this to the required target type.

Similarly the WRITE parameter specifies how to treat write attributes
that directly or indirectly apply to the type given as the first
parameter.  It must have an input parameter of the type specified by
the first parameter, and the return type must be the same as the input
type of the Read function.  The effect is to first call the Write
function to convert to the given stream type, and then write the result
type to the stream.

The Read and Write functions must not be overloaded subprograms.  If
necessary renamings can be supplied to meet this requirement.  The
usage of this attribute is best illustrated by a simple example, taken
from the GNAT implementation of package Ada.Strings.Unbounded:

function To_Unbounded (S : String)
return Unbounded_String
renames To_Unbounded_String;

pragma Stream_Convert
(Unbounded_String, To_Unbounded, To_String);

The specifications of the referenced functions, as given in the Ada
Reference Manual are:

function To_Unbounded_String (Source : String)
return Unbounded_String;

function To_String (Source : Unbounded_String)
return String;

The effect is that if the value of an unbounded string is written to a
stream, then the representation of the item in the stream is in the
same format that would be used for `Standard.String'Output', and this
same representation is expected when a value of this type is read from
the stream. Note that the value written always includes the bounds,
even for Unbounded_String'Write, since Unbounded_String is not an array
type.

Note that the `Stream_Convert' pragma is not effective in the case of
a derived type of a non-limited tagged type. If such a type is
specified then the pragma is silently ignored, and the default
implementation of the stream attributes is used instead.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Style_Checks" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Style_Checks (string_LITERAL | ALL_CHECKS |
On | Off [, LOCAL_NAME]);

This pragma is used in conjunction with compiler switches to control the
built in style checking provided by GNAT.  The compiler switches, if
set, provide an initial setting for the switches, and this pragma may
be used to modify these settings, or the settings may be provided
entirely by the use of the pragma.  This pragma can be used anywhere
that a pragma is legal, including use as a configuration pragma
(including use in the `gnat.adc' file).

The form with a string literal specifies which style options are to
be activated.  These are additive, so they apply in addition to any
previously set style check options.  The codes for the options are the
same as those used in the `-gnaty' switch to `gcc' or `gnatmake'.  For
example the following two methods can be used to enable layout checking:

*      pragma Style_Checks ("l");

*      gcc -c -gnatyl ...

The form ALL_CHECKS activates all standard checks (its use is equivalent
to the use of the `gnaty' switch with no options.  *Note GNAT Pro
User's Guide: (gnat_ugn)Top, for details.)

Note: the behavior is slightly different in GNAT mode (`-gnatg'
used).  In this case, ALL_CHECKS implies the standard set of GNAT mode
style check options (i.e. equivalent to -gnatyg).

The forms with `Off' and `On' can be used to temporarily disable
style checks as shown in the following example:

pragma Style_Checks ("k"); -- requires keywords in lower case
pragma Style_Checks (Off); -- turn off style checks
NULL;                      -- this will not generate an error message
pragma Style_Checks (On);  -- turn style checks back on
NULL;                      -- this will generate an error message

Finally the two argument form is allowed only if the first argument is
`On' or `Off'.  The effect is to turn of semantic style checks for the
specified entity, as shown in the following example:

pragma Style_Checks ("r"); -- require consistency of identifier casing
Arg : Integer;
Rf1 : Integer := ARG;      -- incorrect, wrong case
pragma Style_Checks (Off, Arg);
Rf2 : Integer := ARG;      -- OK, no error
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Subtitle" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Subtitle ([Subtitle =&gt;] STRING_LITERAL);

This pragma is recognized for compatibility with other Ada compilers
but is ignored by GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Suppress" origin = "Ada RM">
      <DOC>
Syntax:

pragma Suppress (Identifier [, [On =&gt;] Name]);

This is a standard pragma, and supports all the check names required in
the RM. It is included here because GNAT recognizes some additional
check names that are implementation defined (as permitted by the RM):

* `Alignment_Check' can be used to suppress alignment checks on
addresses used in address clauses. Such checks can also be
suppressed by suppressing range checks, but the specific use of
`Alignment_Check' allows suppression of alignment checks without
suppressing other range checks.

* `Atomic_Synchronization' can be used to suppress the special memory
synchronization instructions that are normally generated for
access to `Atomic' variables to ensure correct synchronization
between tasks that use such variables for synchronization purposes.

* `Duplicated_Tag_Check' Can be used to suppress the check that is
generated for a duplicated tag value when a tagged type is
declared.

* `Predicate_Check' can be used to control whether predicate checks
are active. It is applicable only to predicates for which the
policy is `Check'. Unlike `Assertion_Policy', which determines if
a given predicate is ignored or checked for the whole program, the
use of `Suppress' and `Unsuppress' with this check name allows a
given predicate to be turned on and off at specific points in the
program.

* `Validity_Check' can be used specifically to control validity
checks.  If `Suppress' is used to suppress validity checks, then
no validity checks are performed, including those specified by the
appropriate compiler switch or the `Validity_Checks' pragma.

* Additional check names previously introduced by use of the
`Check_Name' pragma are also allowed.


Note that pragma Suppress gives the compiler permission to omit checks,
but does not require the compiler to omit checks. The compiler will
generate checks if they are essentially free, even when they are
suppressed. In particular, if the compiler can prove that a certain
check will necessarily fail, it will generate code to do an
unconditional "raise", even if checks are suppressed. The compiler
warns in this case.

Of course, run-time checks are omitted whenever the compiler can
prove that they will not fail, whether or not checks are suppressed.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Suppress_All" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Suppress_All;

This pragma can appear anywhere within a unit.  The effect is to apply
`Suppress (All_Checks)' to the unit in which it appears.  This pragma
is implemented for compatibility with DEC Ada 83 usage where it appears
at the end of a unit, and for compatibility with Rational Ada, where it
appears as a program unit pragma.  The use of the standard Ada pragma
`Suppress (All_Checks)' as a normal configuration pragma is the
preferred usage in GNAT.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Suppress_Debug_Info" origin = "GNAT RM">
      <DOC>
Syntax:

Suppress_Debug_Info ([Entity =&gt;] LOCAL_NAME);

This pragma can be used to suppress generation of debug information for
the specified entity. It is intended primarily for use in debugging the
debugger, and navigating around debugger problems.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Suppress_Exception_Locations" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Suppress_Exception_Locations;

In normal mode, a raise statement for an exception by default generates
an exception message giving the file name and line number for the
location of the raise. This is useful for debugging and logging
purposes, but this entails extra space for the strings for the
messages. The configuration pragma `Suppress_Exception_Locations' can
be used to suppress the generation of these strings, with the result
that space is saved, but the exception message for such raises is null.
This configuration pragma may appear in a global configuration pragma
file, or in a specific unit as usual. It is not required that this
pragma be used consistently within a partition, so it is fine to have
some units within a partition compiled with this pragma and others
compiled in normal mode without it.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Suppress_Initialization" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Suppress_Initialization ([Entity =&gt;] variable_or_subtype_Name);

Here variable_or_subtype_Name is the name introduced by a type
declaration or subtype declaration or the name of a variable introduced
by an object declaration.

In the case of a type or subtype this pragma suppresses any implicit
or explicit initialization for all variables of the given type or
subtype, including initialization resulting from the use of pragmas
Normalize_Scalars or Initialize_Scalars.

This is considered a representation item, so it cannot be given after
the type is frozen. It applies to all subsequent object declarations,
and also any allocator that creates objects of the type.

If the pragma is given for the first subtype, then it is considered
to apply to the base type and all its subtypes. If the pragma is given
for other than a first subtype, then it applies only to the given
subtype.  The pragma may not be given after the type is frozen.

Note that this includes eliminating initialization of discriminants
for discriminated types, and tags for tagged types. In these cases, you
will have to use some non-portable mechanism (e.g. address overlays or
unchecked conversion) to achieve required initialization of these
fields before accessing any object of the corresponding type.

For the variable case, implicit initialization for the named variable
is suppressed, just as though its subtype had been given in a pragma
Suppress_Initialization, as described above.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Task_Dispatching_Policy" origin = "Ada RM">
      <DOC>
Syntax:

pragma Task_Dispatching_Policy (policy_identifier);
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Task_Info" origin = "GNAT RM">
      <DOC>
Syntax

pragma Task_Info (EXPRESSION);

This pragma appears within a task definition (like pragma `Priority')
and applies to the task in which it appears.  The argument must be of
type `System.Task_Info.Task_Info_Type'.  The `Task_Info' pragma
provides system dependent control over aspects of tasking
implementation, for example, the ability to map tasks to specific
processors.  For details on the facilities available for the version of
GNAT that you are using, see the documentation in the spec of package
System.Task_Info in the runtime library.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Task_Name" origin = "GNAT RM">
      <DOC>
Syntax

pragma Task_Name (string_EXPRESSION);

This pragma appears within a task definition (like pragma `Priority')
and applies to the task in which it appears.  The argument must be of
type String, and provides a name to be used for the task instance when
the task is created.  Note that this expression is not required to be
static, and in particular, it can contain references to task
discriminants.  This facility can be used to provide different names
for different tasks as they are created, as illustrated in the example
below.

The task name is recorded internally in the run-time structures and
is accessible to tools like the debugger.  In addition the routine
`Ada.Task_Identification.Image' will return this string, with a unique
task address appended.

--  Example of the use of pragma Task_Name

with Ada.Task_Identification;
use Ada.Task_Identification;
with Text_IO; use Text_IO;
procedure t3 is

type Astring is access String;

task type Task_Typ (Name : access String) is
pragma Task_Name (Name.all);
end Task_Typ;

task body Task_Typ is
Nam : constant String := Image (Current_Task);
begin
Put_Line ("--&gt;" &amp; Nam (1 .. 14) &amp; "&lt;--");
end Task_Typ;

type Ptr_Task is access Task_Typ;
Task_Var : Ptr_Task;

begin
Task_Var :=
new Task_Typ (new String'("This is task 1"));
Task_Var :=
new Task_Typ (new String'("This is task 2"));
end;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Task_Storage" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Task_Storage (
[Task_Type =&gt;] LOCAL_NAME,
[Top_Guard =&gt;] static_integer_EXPRESSION);

This pragma specifies the length of the guard area for tasks.  The guard
area is an additional storage area allocated to a task.  A value of zero
means that either no guard area is created or a minimal guard area is
created, depending on the target.  This pragma can appear anywhere a
`Storage_Size' attribute definition clause is allowed for a task type.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Test_Case" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Test_Case (
[Name     =&gt;] static_string_Expression
,[Mode     =&gt;] (Nominal | Robustness)
[, Requires =&gt;  Boolean_Expression]
[, Ensures  =&gt;  Boolean_Expression]);

The `Test_Case' pragma allows defining fine-grain specifications for
use by testing tools.  The compiler checks the validity of the
`Test_Case' pragma, but its presence does not lead to any modification
of the code generated by the compiler.

`Test_Case' pragmas may only appear immediately following the
(separate) declaration of a subprogram in a package declaration, inside
a package spec unit. Only other pragmas may intervene (that is appear
between the subprogram declaration and a test case).

The compiler checks that boolean expressions given in `Requires' and
`Ensures' are valid, where the rules for `Requires' are the same as the
rule for an expression in `Precondition' and the rules for `Ensures'
are the same as the rule for an expression in `Postcondition'. In
particular, attributes `'Old' and `'Result' can only be used within the
`Ensures' expression. The following is an example of use within a
package spec:

package Math_Functions is

function Sqrt (Arg : Float) return Float;
pragma Test_Case (Name     =&gt; "Test 1",
Mode     =&gt; Nominal,
Requires =&gt; Arg &lt; 10000,
Ensures  =&gt; Sqrt'Result &lt; 10);

end Math_Functions;

The meaning of a test case is that there is at least one context where
`Requires' holds such that, if the associated subprogram is executed in
that context, then `Ensures' holds when the subprogram returns.  Mode
`Nominal' indicates that the input context should also satisfy the
precondition of the subprogram, and the output context should also
satisfy its postcondition. Mode `Robustness' indicates that the
precondition and postcondition of the subprogram should be ignored for
this test case.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Thread_Local_Storage" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Thread_Local_Storage ([Entity =&gt;] LOCAL_NAME);

This pragma specifies that the specified entity, which must be a
variable declared in a library level package, is to be marked as
"Thread Local Storage" (`TLS'). On systems supporting this (which
include Solaris, GNU/Linux and VxWorks 6), this causes each thread (and
hence each Ada task) to see a distinct copy of the variable.

The variable may not have default initialization, and if there is an
explicit initialization, it must be either `null' for an access
variable, or a static expression for a scalar variable.  This provides
a low level mechanism similar to that provided by the
`Ada.Task_Attributes' package, but much more efficient and is also
useful in writing interface code that will interact with foreign
threads.

If this pragma is used on a system where `TLS' is not supported,
then an error message will be generated and the program will be
rejected.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Time_Slice" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Time_Slice (static_duration_EXPRESSION);

For implementations of GNAT on operating systems where it is possible
to supply a time slice value, this pragma may be used for this purpose.
It is ignored if it is used in a system that does not allow this
control, or if it appears in other than the main program unit.  Note
that the effect of this pragma is identical to the effect of the DEC
Ada 83 pragma of the same name when operating under OpenVMS systems.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Title" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Title (TITLING_OPTION [, TITLING OPTION]);

TITLING_OPTION ::=
[Title    =&gt;] STRING_LITERAL,
| [Subtitle =&gt;] STRING_LITERAL

Syntax checked but otherwise ignored by GNAT.  This is a listing control
pragma used in DEC Ada 83 implementations to provide a title and/or
subtitle for the program listing.  The program listing generated by GNAT
does not have titles or subtitles.

Unlike other pragmas, the full flexibility of named notation is
allowed for this pragma, i.e. the parameters may be given in any order
if named notation is used, and named and positional notation can be
mixed following the normal rules for procedure calls in Ada.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Type_Invariant" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Type_Invariant
([Entity =&gt;] type_LOCAL_NAME,
[Check  =&gt;] EXPRESSION);

The `Type_Invariant' pragma is intended to be an exact replacement for
the language-defined `Type_Invariant' aspect, and shares its
restrictions and semantics. It differs from the language defined
`Invariant' pragma in that it does not permit a string parameter, and
it is controlled by the assertion identifier `Type_Invariant' rather
than `Invariant'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Type_Invariant_Class" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Type_Invariant_Class
([Entity =&gt;] type_LOCAL_NAME,
[Check  =&gt;] EXPRESSION);

The `Type_Invariant_Class' pragma is intended to be an exact
replacement for the language-defined `Type_Invariant'Class' aspect, and
shares its restrictions and semantics.

Note: This pragma is called `Type_Invariant_Class' rather than
`Type_Invariant'Class' because the latter would not be strictly
conforming to the allowed syntax for pragmas. The motivation for
providing pragmas equivalent to the aspects is to allow a program to be
written using the pragmas, and then compiled if necessary using an Ada
compiler that does not recognize the pragmas or aspects, but is
prepared to ignore the pragmas. The assertion policy that controls this
pragma is `Type_Invariant'Class', not `Type_Invariant_Class'.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unchecked_Union" origin = "Ada RM">
      <DOC>
Syntax:

pragma Unchecked_Union (first_subtype_LOCAL_NAME);

This pragma is used to specify a representation of a record type that is
equivalent to a C union. It was introduced as a GNAT implementation
defined pragma in the GNAT Ada 95 mode. Ada 2005 includes an extended
version of this pragma, making it language defined, and GNAT fully
implements this extended version in all language modes (Ada 83, Ada 95,
and Ada 2005). For full details, consult the Ada 2012 Reference Manual,
section B.3.3.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unevaluated_Use_Of_Old" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unevaluated_Use_Of_Old (Error | Warn | Allow);

This pragma controls the processing of attributes Old and Loop_Entry.
If either of these attributes is used in a potentially unevaluated
expression  (e.g. the then or else parts of an if expression), then
normally this usage is considered illegal if the prefix of the attribute
is other than an entity name. The language requires this behavior for
Old, and GNAT copies the same rule for Loop_Entry.

The reason for this rule is that otherwise, we can have a situation
where we save the Old value, and this results in an exception, even
though we might not evaluate the attribute. Consider this example:

package UnevalOld is
K : Character;
procedure U (A : String; C : Boolean)  -- ERROR
with Post =&gt; (if C then A(1)'Old = K else True);
end;

If procedure U is called with a string with a lower bound of 2, and C
false, then an exception would be raised trying to evaluate A(1) on
entry even though the value would not be actually used.

Although the rule guarantees against this possibility, it is
sometimes too restrictive. For example if we know that the string has a
lower bound of 1, then we will never raise an exception.  The pragma
`Unevaluated_Use_Of_Old' can be used to modify this behavior. If the
argument is `Error' then an error is given (this is the default RM
behavior). If the argument is `Warn' then the usage is allowed as legal
but with a warning that an exception might be raised. If the argument
is `Allow' then the usage is allowed as legal without generating a
warning.

This pragma may appear as a configuration pragma, or in a declarative
part or package specification. In the latter case it applies to uses up
to the end of the corresponding statement sequence or sequence of
package declarations.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unimplemented_Unit" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unimplemented_Unit;

If this pragma occurs in a unit that is processed by the compiler, GNAT
aborts with the message `XXX not implemented', where XXX is the name of
the current compilation unit.  This pragma is intended to allow the
compiler to handle unimplemented library units in a clean manner.

The abort only happens if code is being generated.  Thus you can use
specs of unimplemented packages in syntax or semantic checking mode.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Universal_Aliasing" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Universal_Aliasing [([Entity =&gt;] type_LOCAL_NAME)];

TYPE_LOCAL_NAME must refer to a type declaration in the current
declarative part.  The effect is to inhibit strict type-based aliasing
optimization for the given type.  In other words, the effect is as
though access types designating this type were subject to pragma
No_Strict_Aliasing.  For a detailed description of the strict aliasing
optimization, and the situations in which it must be suppressed, *Note
Optimization and Strict Aliasing: (gnat_ugn)Optimization and Strict
Aliasing.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Universal_Data" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Universal_Data [(library_unit_Name)];

This pragma is supported only for the AAMP target and is ignored for
other targets. The pragma specifies that all library-level objects
(Counter 0 data) associated with the library unit are to be accessed
and updated using universal addressing (24-bit addresses for AAMP5)
rather than the default of 16-bit Data Environment (DENV) addressing.
Use of this pragma will generally result in less efficient code for
references to global data associated with the library unit, but allows
such data to be located anywhere in memory. This pragma is a library
unit pragma, but can also be used as a configuration pragma (including
use in the `gnat.adc' file). The functionality of this pragma is also
available by applying the -univ switch on the compilations of units
where universal addressing of the data is desired.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unmodified" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unmodified (LOCAL_NAME {, LOCAL_NAME});

This pragma signals that the assignable entities (variables, `out'
parameters, `in out' parameters) whose names are listed are
deliberately not assigned in the current source unit. This suppresses
warnings about the entities being referenced but not assigned, and in
addition a warning will be generated if one of these entities is in
fact assigned in the same unit as the pragma (or in the corresponding
body, or one of its subunits).

This is particularly useful for clearly signaling that a particular
parameter is not modified, even though the spec suggests that it might
be.

For the variable case, warnings are never given for unreferenced
variables whose name contains one of the substrings `DISCARD, DUMMY,
IGNORE, JUNK, UNUSED' in any casing. Such names are typically to be
used in cases where such warnings are expected.  Thus it is never
necessary to use `pragma Unmodified' for such variables, though it is
harmless to do so.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unreferenced" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unreferenced (LOCAL_NAME {, LOCAL_NAME});
pragma Unreferenced (library_unit_NAME {, library_unit_NAME});

This pragma signals that the entities whose names are listed are
deliberately not referenced in the current source unit after the
occurrence of the pragma. This suppresses warnings about the entities
being unreferenced, and in addition a warning will be generated if one
of these entities is in fact subsequently referenced in the same unit
as the pragma (or in the corresponding body, or one of its subunits).

This is particularly useful for clearly signaling that a particular
parameter is not referenced in some particular subprogram implementation
and that this is deliberate. It can also be useful in the case of
objects declared only for their initialization or finalization side
effects.

If `LOCAL_NAME' identifies more than one matching homonym in the
current scope, then the entity most recently declared is the one to
which the pragma applies. Note that in the case of accept formals, the
pragma Unreferenced may appear immediately after the keyword `do' which
allows the indication of whether or not accept formals are referenced
or not to be given individually for each accept statement.

The left hand side of an assignment does not count as a reference
for the purpose of this pragma. Thus it is fine to assign to an entity
for which pragma Unreferenced is given.

Note that if a warning is desired for all calls to a given
subprogram, regardless of whether they occur in the same unit as the
subprogram declaration, then this pragma should not be used (calls from
another unit would not be flagged); pragma Obsolescent can be used
instead for this purpose, see *Note Pragma Obsolescent::.

The second form of pragma `Unreferenced' is used within a context
clause. In this case the arguments must be unit names of units
previously mentioned in `with' clauses (similar to the usage of pragma
`Elaborate_All'. The effect is to suppress warnings about unreferenced
units and unreferenced entities within these units.

For the variable case, warnings are never given for unreferenced
variables whose name contains one of the substrings `DISCARD, DUMMY,
IGNORE, JUNK, UNUSED' in any casing. Such names are typically to be
used in cases where such warnings are expected.  Thus it is never
necessary to use `pragma Unreferenced' for such variables, though it is
harmless to do so.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unreferenced_Objects" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unreferenced_Objects (local_subtype_NAME {, local_subtype_NAME});

This pragma signals that for the types or subtypes whose names are
listed, objects which are declared with one of these types or subtypes
may not be referenced, and if no references appear, no warnings are
given.

This is particularly useful for objects which are declared solely
for their initialization and finalization effect. Such variables are
sometimes referred to as RAII variables (Resource Acquisition Is
Initialization). Using this pragma on the relevant type (most typically
a limited controlled type), the compiler will automatically suppress
unwanted warnings about these variables not being referenced.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unreserve_All_Interrupts" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Unreserve_All_Interrupts;

Normally certain interrupts are reserved to the implementation.  Any
attempt to attach an interrupt causes Program_Error to be raised, as
described in RM C.3.2(22).  A typical example is the `SIGINT' interrupt
used in many systems for a `Ctrl-C' interrupt.  Normally this interrupt
is reserved to the implementation, so that `Ctrl-C' can be used to
interrupt execution.

If the pragma `Unreserve_All_Interrupts' appears anywhere in any
unit in a program, then all such interrupts are unreserved.  This
allows the program to handle these interrupts, but disables their
standard functions.  For example, if this pragma is used, then pressing
`Ctrl-C' will not automatically interrupt execution.  However, a
program can then handle the `SIGINT' interrupt as it chooses.

For a full list of the interrupts handled in a specific
implementation, see the source code for the spec of
`Ada.Interrupts.Names' in file `a-intnam.ads'.  This is a target
dependent file that contains the list of interrupts recognized for a
given target.  The documentation in this file also specifies what
interrupts are affected by the use of the `Unreserve_All_Interrupts'
pragma.

For a more general facility for controlling what interrupts can be
handled, see pragma `Interrupt_State', which subsumes the functionality
of the `Unreserve_All_Interrupts' pragma.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Unsuppress" origin = "Ada RM">
      <DOC>
Syntax:

pragma Unsuppress (IDENTIFIER [, [On =&gt;] NAME]);

This pragma undoes the effect of a previous pragma `Suppress'.  If
there is no corresponding pragma `Suppress' in effect, it has no
effect.  The range of the effect is the same as for pragma `Suppress'.
The meaning of the arguments is identical to that used in pragma
`Suppress'.

One important application is to ensure that checks are on in cases
where code depends on the checks for its correct functioning, so that
the code will compile correctly even if the compiler switches are set
to suppress checks. For example, in a program that depends on external
names of tagged types and wants to ensure that the duplicated tag check
occurs even if all run-time checks are suppressed by a compiler switch,
the following configuration pragma will ensure this test is not
suppressed:

pragma Unsuppress (Duplicated_Tag_Check);

This pragma is standard in Ada 2005. It is available in all earlier
versions of Ada as an implementation-defined pragma.

Note that in addition to the checks defined in the Ada RM, GNAT
recogizes a number of implementation-defined check names. See
description of pragma `Suppress' for full details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Use_VADS_Size" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Use_VADS_Size;

This is a configuration pragma.  In a unit to which it applies, any use
of the 'Size attribute is automatically interpreted as a use of the
'VADS_Size attribute.  Note that this may result in incorrect semantic
processing of valid Ada 95 or Ada 2005 programs.  This is intended to
aid in the handling of existing code which depends on the
interpretation of Size as implemented in the VADS compiler.  See
description of the VADS_Size attribute for further details.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Validity_Checks" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Validity_Checks (string_LITERAL | ALL_CHECKS | On | Off);

This pragma is used in conjunction with compiler switches to control the
built-in validity checking provided by GNAT.  The compiler switches, if
set provide an initial setting for the switches, and this pragma may be
used to modify these settings, or the settings may be provided entirely
by the use of the pragma.  This pragma can be used anywhere that a
pragma is legal, including use as a configuration pragma (including use
in the `gnat.adc' file).

The form with a string literal specifies which validity options are
to be activated.  The validity checks are first set to include only the
default reference manual settings, and then a string of letters in the
string specifies the exact set of options required.  The form of this
string is exactly as described for the `-gnatVx' compiler switch (see
the GNAT Pro User's Guide for details).  For example the following two
methods can be used to enable validity checking for mode `in' and `in
out' subprogram parameters:

*      pragma Validity_Checks ("im");

*      gcc -c -gnatVim ...

The form ALL_CHECKS activates all standard checks (its use is equivalent
to the use of the `gnatva' switch.

The forms with `Off' and `On' can be used to temporarily disable
validity checks as shown in the following example:

pragma Validity_Checks ("c"); -- validity checks for copies
pragma Validity_Checks (Off); -- turn off validity checks
A := B;                       -- B will not be validity checked
pragma Validity_Checks (On);  -- turn validity checks back on
A := C;                       -- C will be validity checked
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Volatile" origin = "Ada RM">
      <DOC>
Syntax:

pragma Volatile (LOCAL_NAME);

This pragma is defined by the Ada Reference Manual, and the GNAT
implementation is fully conformant with this definition.  The reason it
is mentioned in this section is that a pragma of the same name was
supplied in some Ada 83 compilers, including DEC Ada 83.  The Ada 95 /
Ada 2005 implementation of pragma Volatile is upwards compatible with
the implementation in DEC Ada 83.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Volatile_Components" origin = "Ada RM">
      <DOC>
Syntax:

pragma Volatile_Components;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Warning_As_Error" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Warning_As_Error (static_string_EXPRESSION);

This configuration pragma allows the programmer to specify a set of
warnings that will be treated as errors. Any warning which matches the
pattern given by the pragma argument will be treated as an error. This
gives much more precise control that -gnatwe which treats all warnings
as errors.

The pattern may contain asterisks, which match zero or more
characters in the message. For example, you can use `pragma
Warning_As_Error ("bits of*unused")' to treat the warning message
`warning: 960 bits of "a" unused' as an error. No other regular
expression notations are permitted. All characters other than asterisk
in these three specific cases are treated as literal characters in the
match.  The match is case insensitive, for example XYZ matches xyz.

Note that the pattern matches if it occurs anywhere within the
warning message string (it is not necessary to put an asterisk at the
start and the end of the message, since this is implied).

Another possibility for the static_string_EXPRESSION which works
whether or not error tags are enabled (`-gnatw.d') is to use the
`-gnatw' tag string, enclosed in brackets, as shown in the example
below, to treat a class of warnings as errors.

The above use of patterns to match the message applies only to
warning messages generated by the front end. This pragma can also be
applied to warnings provided by the back end and mentioned in *note
Pragma Warnings::.  By using a single full `-Wxxx' switch in the
pragma, such warnings can also be treated as errors.

The pragma can appear either in a global configuration pragma file
(e.g. `gnat.adc'), or at the start of a file. Given a global
configuration pragma file containing:

pragma Warning_As_Error ("[-gnatwj]");

which will treat all obsolescent feature warnings as errors, the
following program compiles as shown (compile options here are
`-gnatwa.d -gnatl -gnatj55').

pragma Warning_As_Error ("*never assigned*");
function Warnerr return String is
X : Integer;
|
&gt;&gt;&gt; error: variable "X" is never read and
never assigned [-gnatwv] [warning-as-error]

Y : Integer;
|
&gt;&gt;&gt; warning: variable "Y" is assigned but
never read [-gnatwu]

begin
Y := 0;
return %ABC%;
|
&gt;&gt;&gt; error: use of "%" is an obsolescent
feature (RM J.2(4)), use """ instead
[-gnatwj] [warning-as-error]

end;

lines: No errors, 3 warnings (2 treated as errors)

Note that this pragma does not affect the set of warnings issued in any
way, it merely changes the effect of a matching warning if one is
produced as a result of other warnings options. As shown in this
example, if the pragma results in a warning being treated as an error,
the tag is changed from "warning:" to "error:" and the string
"[warning-as-error]" is appended to the end of the message.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Warnings" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Warnings (On | Off [,REASON]);
pragma Warnings (On | Off, LOCAL_NAME [,REASON]);
pragma Warnings (static_string_EXPRESSION [,REASON]);
pragma Warnings (On | Off, static_string_EXPRESSION [,REASON]);

REASON ::= Reason =&gt; STRING_LITERAL {&amp; STRING_LITERAL}

Note: in Ada 83 mode, a string literal may be used in place of
a static string expression (which does not exist in Ada 83).

Normally warnings are enabled, with the output being controlled by the
command line switch.  Warnings (`Off') turns off generation of warnings
until a Warnings (`On') is encountered or the end of the current unit.
If generation of warnings is turned off using this pragma, then some or
all of the warning messages are suppressed, regardless of the setting
of the command line switches.

The `Reason' parameter may optionally appear as the last argument in
any of the forms of this pragma. It is intended purely for the purposes
of documenting the reason for the `Warnings' pragma.  The compiler will
check that the argument is a static string but otherwise ignore this
argument. Other tools may provide specialized processing for this
string.

The form with a single argument (or two arguments if Reason present),
where the first argument is `ON' or `OFF' may be used as a
configuration pragma.

If the LOCAL_NAME parameter is present, warnings are suppressed for
the specified entity.  This suppression is effective from the point
where it occurs till the end of the extended scope of the variable
(similar to the scope of `Suppress'). This form cannot be used as a
configuration pragma.

In the case where the first argument is other than `ON' or `OFF',
the third form with a single static_string_EXPRESSION argument (and
possible reason) provides more precise control over which warnings are
active. The string is a list of letters specifying which warnings are
to be activated and which deactivated. The code for these letters is
the same as the string used in the command line switch controlling
warnings. For a brief summary, use the gnatmake command with no
arguments, which will generate usage information containing the list of
warnings switches supported. For full details see *note Warning Message
Control: (gnat_ugn)Warning Message Control. This form can also be used
as a configuration pragma.

The warnings controlled by the `-gnatw' switch are generated by the
front end of the compiler. The GCC back end can provide additional
warnings and they are controlled by the `-W' switch. Such warnings can
be identified by the appearance of a string of the form `[-Wxxx]' in the
message which designates the `-Wxxx' switch that controls the message.
The form with a single static_string_EXPRESSION argument also works for
these warnings, but the string must be a single full `-Wxxx' switch in
this case. The above reference lists a few examples of these additional
warnings.

The specified warnings will be in effect until the end of the program
or another pragma Warnings is encountered. The effect of the pragma is
cumulative. Initially the set of warnings is the standard default set
as possibly modified by compiler switches. Then each pragma Warning
modifies this set of warnings as specified. This form of the pragma may
also be used as a configuration pragma.

The fourth form, with an `On|Off' parameter and a string, is used to
control individual messages, based on their text. The string argument
is a pattern that is used to match against the text of individual
warning messages (not including the initial "warning: " tag).

The pattern may contain asterisks, which match zero or more
characters in the message. For example, you can use `pragma Warnings
(Off, "bits of*unused")' to suppress the warning message `warning: 960
bits of "a" unused'. No other regular expression notations are
permitted. All characters other than asterisk in these three specific
cases are treated as literal characters in the match.  The match is
case insensitive, for example XYZ matches xyz.

Note that the pattern matches if it occurs anywhere within the
warning message string (it is not necessary to put an asterisk at the
start and the end of the message, since this is implied).

The above use of patterns to match the message applies only to
warning messages generated by the front end. This form of the pragma
with a string argument can also be used to control warnings provided by
the back end and mentioned above. By using a single full `-Wxxx' switch
in the pragma, such warnings can be turned on and off.

There are two ways to use the pragma in this form. The OFF form can
be used as a configuration pragma. The effect is to suppress all
warnings (if any) that match the pattern string throughout the
compilation (or match the -W switch in the back end case).

The second usage is to suppress a warning locally, and in this case,
two pragmas must appear in sequence:

pragma Warnings (Off, Pattern);
code where given warning is to be suppressed
pragma Warnings (On, Pattern);

In this usage, the pattern string must match in the Off and On pragmas,
and at least one matching warning must be suppressed.

Note: to write a string that will match any warning, use the string
`"***"'. It will not work to use a single asterisk or two asterisks
since this looks like an operator name. This form with three asterisks
is similar in effect to specifying `pragma Warnings (Off)' except that a
matching `pragma Warnings (On, "***")' will be required. This can be
helpful in avoiding forgetting to turn warnings back on.

Note: the debug flag -gnatd.i (`/NOWARNINGS_PRAGMAS' in VMS) can be
used to cause the compiler to entirely ignore all WARNINGS pragmas.
This can be useful in checking whether obsolete pragmas in existing
programs are hiding real problems.

Note: pragma Warnings does not affect the processing of style
messages. See separate entry for pragma Style_Checks for control of
style messages.
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Weak_External" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Weak_External ([Entity =&gt;] LOCAL_NAME);

LOCAL_NAME must refer to an object that is declared at the library
level. This pragma specifies that the given entity should be marked as a
weak symbol for the linker. It is equivalent to `__attribute__((weak))'
in GNU C and causes LOCAL_NAME to be emitted as a weak symbol instead
of a regular symbol, that is to say a symbol that does not have to be
resolved by the linker if used in conjunction with a pragma Import.

When a weak symbol is not resolved by the linker, its address is set
to zero. This is useful in writing interfaces to external modules that
may or may not be linked in the final executable, for example depending
on configuration settings.

If a program references at run time an entity to which this pragma
has been applied, and the corresponding symbol was not resolved at link
time, then the execution of the program is erroneous. It is not
erroneous to take the Address of such an entity, for example to guard
potential references, as shown in the example below.

Some file formats do not support weak symbols so not all target
machines support this pragma.

--  Example of the use of pragma Weak_External

package External_Module is
key : Integer;
pragma Import (C, key);
pragma Weak_External (key);
function Present return boolean;
end External_Module;

with System; use System;
package body External_Module is
function Present return boolean is
begin
return key'Address /= System.Null_Address;
end Present;
end External_Module;
      </DOC>
   </PRAGMA>

   <PRAGMA id = "0" name = "Wide_Character_Encoding" origin = "GNAT RM">
      <DOC>
Syntax:

pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL);

This pragma specifies the wide character encoding to be used in program
source text appearing subsequently. It is a configuration pragma, but
may also be used at any point that a pragma is allowed, and it is
permissible to have more than one such pragma in a file, allowing
multiple encodings to appear within the same file.

The argument can be an identifier or a character literal. In the
identifier case, it is one of `HEX', `UPPER', `SHIFT_JIS', `EUC',
`UTF8', or `BRACKETS'. In the character literal case it is
correspondingly one of the characters `h', `u', `s', `e', `8', or `b'.

Note that when the pragma is used within a file, it affects only the
encoding within that file, and does not affect withed units, specs, or
subunits.
      </DOC>
   </PRAGMA>

   <STANDARD name = "&quot;&amp;&quot;" category = "function"/>

   <STANDARD name = "&quot;&gt;&quot;" category = "function"/>

   <STANDARD name = "&quot;&gt;=&quot;" category = "function"/>

   <STANDARD name = "&quot;&lt;&quot;" category = "function"/>

   <STANDARD name = "&quot;&lt;=&quot;" category = "function"/>

   <STANDARD name = "&quot;*&quot;" category = "function"/>

   <STANDARD name = "&quot;**&quot;" category = "function"/>

   <STANDARD name = "&quot;+&quot;" category = "function"/>

   <STANDARD name = "&quot;-&quot;" category = "function"/>

   <STANDARD name = "&quot;/&quot;" category = "function"/>

   <STANDARD name = "&quot;/=&quot;" category = "function"/>

   <STANDARD name = "&quot;=&quot;" category = "function"/>

   <STANDARD name = "&quot;abs&quot;" category = "function"/>

   <STANDARD name = "&quot;and&quot;" category = "function"/>

   <STANDARD name = "&quot;mod&quot;" category = "function"/>

   <STANDARD name = "&quot;not&quot;" category = "function"/>

   <STANDARD name = "&quot;or&quot;" category = "function"/>

   <STANDARD name = "&quot;rem&quot;" category = "function"/>

   <STANDARD name = "&quot;xor&quot;" category = "function"/>

   <STANDARD name = "ASCII" category = "package">
      <FIELD name = "NUL" doc = "16#00#"/>
      <FIELD name = "SOH" doc = "16#01#"/>
      <FIELD name = "STX" doc = "16#02#"/>
      <FIELD name = "ETX" doc = "16#03#"/>
      <FIELD name = "EOT" doc = "16#04#"/>
      <FIELD name = "ENQ" doc = "16#05#"/>
      <FIELD name = "ACK" doc = "16#06#"/>
      <FIELD name = "BEL" doc = "16#07#"/>
      <FIELD name = "BS" doc = "16#08#"/>
      <FIELD name = "HT" doc = "16#09#"/>
      <FIELD name = "LF" doc = "16#0A#"/>
      <FIELD name = "VT" doc = "16#0B#"/>
      <FIELD name = "FF" doc = "16#0C#"/>
      <FIELD name = "CR" doc = "16#0D#"/>
      <FIELD name = "SO" doc = "16#0E#"/>
      <FIELD name = "SI" doc = "16#0F#"/>
      <FIELD name = "DLE" doc = "16#10#"/>
      <FIELD name = "DC1" doc = "16#11#"/>
      <FIELD name = "DC2" doc = "16#12#"/>
      <FIELD name = "DC3" doc = "16#13#"/>
      <FIELD name = "DC4" doc = "16#14#"/>
      <FIELD name = "NAK" doc = "16#15#"/>
      <FIELD name = "SYN" doc = "16#16#"/>
      <FIELD name = "ETB" doc = "16#17#"/>
      <FIELD name = "CAN" doc = "16#18#"/>
      <FIELD name = "EM" doc = "16#19#"/>
      <FIELD name = "SUB" doc = "16#1A#"/>
      <FIELD name = "ESC" doc = "16#1B#"/>
      <FIELD name = "FS" doc = "16#1C#"/>
      <FIELD name = "GS" doc = "16#1D#"/>
      <FIELD name = "RS" doc = "16#1E#"/>
      <FIELD name = "US" doc = "16#1F#"/>
      <FIELD name = "Exclam" doc = "16#21#"/>
      <FIELD name = "Quotation" doc = "16#22#"/>
      <FIELD name = "Sharp" doc = "16#23#"/>
      <FIELD name = "Dollar" doc = "16#24#"/>
      <FIELD name = "Percent" doc = "16#25#"/>
      <FIELD name = "Ampersand" doc = "16#26#"/>
      <FIELD name = "Colon" doc = "16#3A#"/>
      <FIELD name = "Semicolon" doc = "16#3B#"/>
      <FIELD name = "Query" doc = "16#3F#"/>
      <FIELD name = "At_Sign" doc = "16#40#"/>
      <FIELD name = "L_Bracket" doc = "16#5B#"/>
      <FIELD name = "Back_Slash" doc = "16#5C#"/>
      <FIELD name = "R_Bracket" doc = "16#5D#"/>
      <FIELD name = "Circumflex" doc = "16#5E#"/>
      <FIELD name = "Underline" doc = "16#5F#"/>
      <FIELD name = "Grave" doc = "16#60#"/>
      <FIELD name = "LC_A" doc = "16#61#"/>
      <FIELD name = "LC_B" doc = "16#62#"/>
      <FIELD name = "LC_C" doc = "16#63#"/>
      <FIELD name = "LC_D" doc = "16#64#"/>
      <FIELD name = "LC_E" doc = "16#65#"/>
      <FIELD name = "LC_F" doc = "16#66#"/>
      <FIELD name = "LC_G" doc = "16#67#"/>
      <FIELD name = "LC_H" doc = "16#68#"/>
      <FIELD name = "LC_I" doc = "16#69#"/>
      <FIELD name = "LC_J" doc = "16#6A#"/>
      <FIELD name = "LC_K" doc = "16#6B#"/>
      <FIELD name = "LC_L" doc = "16#6C#"/>
      <FIELD name = "LC_M" doc = "16#6D#"/>
      <FIELD name = "LC_N" doc = "16#6E#"/>
      <FIELD name = "LC_O" doc = "16#6F#"/>
      <FIELD name = "LC_P" doc = "16#70#"/>
      <FIELD name = "LC_Q" doc = "16#71#"/>
      <FIELD name = "LC_R" doc = "16#72#"/>
      <FIELD name = "LC_S" doc = "16#73#"/>
      <FIELD name = "LC_T" doc = "16#74#"/>
      <FIELD name = "LC_U" doc = "16#75#"/>
      <FIELD name = "LC_V" doc = "16#76#"/>
      <FIELD name = "LC_W" doc = "16#77#"/>
      <FIELD name = "LC_X" doc = "16#78#"/>
      <FIELD name = "LC_Y" doc = "16#79#"/>
      <FIELD name = "LC_Z" doc = "16#7A#"/>
      <FIELD name = "L_BRACE" doc = "16#7B#"/>
      <FIELD name = "BA" doc = "16#7C#"/>
      <FIELD name = "R_BRACE" doc = "16#7D#"/>
      <FIELD name = "TILDE" doc = "16#7E#"/>
      <FIELD name = "DEL" doc = "16#7F#"/>
   </STANDARD>

   <STANDARD name = "Boolean" category = "type"/>

   <STANDARD name = "Character" category = "type"/>

   <STANDARD name = "Constraint_Error" category = "variable"/>

   <STANDARD name = "Duration" category = "type"/>

   <STANDARD name = "False" category = "variable"/>

   <STANDARD name = "Float" category = "type"/>

   <STANDARD name = "Integer" category = "type"/>

   <STANDARD name = "Long_Float" category = "type"/>

   <STANDARD name = "Long_Integer" category = "type"/>

   <STANDARD name = "Long_Long_Float" category = "type"/>

   <STANDARD name = "Long_Long_Integer" category = "type"/>

   <STANDARD name = "Natural" category = "type"/>

   <STANDARD name = "Numeric_Error" category = "variable"/>

   <STANDARD name = "Positive" category = "type"/>

   <STANDARD name = "Program_Error" category = "variable"/>

   <STANDARD name = "Short_Float" category = "type"/>

   <STANDARD name = "Short_Integer" category = "type"/>

   <STANDARD name = "Short_Short_Integer" category = "type"/>

   <STANDARD name = "Storage_Error" category = "variable"/>

   <STANDARD name = "String" category = "type"/>

   <STANDARD name = "Tasking_Error" category = "variable"/>

   <STANDARD name = "True" category = "variable"/>

   <STANDARD name = "Wide_Character" category = "type"/>

   <STANDARD name = "Wide_String" category = "type"/>

   <STANDARD name = "Wide_Wide_Character" category = "type"/>

   <STANDARD name = "Wide_Wide_String" category = "type"/>
</PREDEFINED_ADA>