1! RUN: %S/test_folding.sh %s %t %flang_fc1
2! REQUIRES: shell
3! Test numeric model inquiry intrinsics
4
5module m
6
7  integer, parameter :: &
8    bs1 = bit_size(0_1), &
9    bs2 = bit_size(0_2), &
10    bs4 = bit_size(0_4), &
11    bs8 = bit_size(0_8), &
12    bs16 = bit_size(0_16)
13  logical, parameter :: test_bit_size_1 = bs1 == 8
14  logical, parameter :: test_bit_size_2 = bs2 == 16
15  logical, parameter :: test_bit_size_4 = bs4 == 32
16  logical, parameter :: test_bit_size_8 = bs8 == 64
17  logical, parameter :: test_bit_size_16 = bs16 == 128
18
19  real(2), parameter :: &
20    eps2 = epsilon(0._2), zeps2 = real(z'1000', kind=2), deps2 = 4.8828125e-4_2
21  real(3), parameter :: &
22    eps3 = epsilon(0._3), zeps3 = real(z'3b80', kind=3), deps3 = 3.90625e-3_3
23  real(4), parameter :: &
24    eps4 = epsilon(0._4), zeps4 = real(z'33800000', kind=4), &
25    deps4 = 5.9604644775390625e-8_4
26  real(8), parameter :: &
27    eps8 = epsilon(0._8), zeps8 = real(z'3ca0000000000000', kind=8), &
28    deps8 = 1.1102230246251565404236316680908203125e-16_8
29  real(10), parameter :: &
30    eps10 = epsilon(0._10), zeps10 = real(z'3fbf8000000000000000', kind=10), &
31    deps10 = 5.42101086242752217003726400434970855712890625e-20_10
32  real(16), parameter :: &
33    eps16 = epsilon(0._16), &
34    zeps16 = real(z'3f8e0000000000000000000000000000', kind=16), &
35    deps16 = 9.629649721936179265279889712924636592690508241076940976199693977832794189453125e-35_16
36  logical, parameter :: test_eps2 = eps2 == zeps2 .and. eps2 == deps2
37  logical, parameter :: test_eps3 = eps3 == zeps3 .and. eps3 == deps3
38  logical, parameter :: test_eps4 = eps4 == zeps4 .and. eps4 == deps4
39  logical, parameter :: test_eps8 = eps8 == zeps8 .and. eps8 == deps8
40  logical, parameter :: test_eps10 = eps10 == zeps10 .and. eps10 == deps10
41  logical, parameter :: test_eps16 = eps16 == zeps16 .and. eps16 == deps16
42
43  integer(1), parameter :: &
44    ihuge1 = huge(0_1), zihuge1 = int(z'7f', kind=1), dihuge1 = 127_1
45  integer(2), parameter :: &
46    ihuge2 = huge(0_2), zihuge2 = int(z'7fff', kind=2), dihuge2 = 32767_2
47  integer(4), parameter :: &
48    ihuge4 = huge(0_4), zihuge4 = int(z'7fffffff', kind=4), &
49    dihuge4 = 2147483647_4
50  integer(8), parameter :: &
51    ihuge8 = huge(0_8), zihuge8 = int(z'7fffffffffffffff', kind=8), &
52    dihuge8 = 9223372036854775807_8
53  integer(16), parameter :: &
54    ihuge16 = huge(0_16), &
55    zihuge16 = int(z'7fffffffffffffffffffffffffffffff', kind=16), &
56    dihuge16 = 170141183460469231731687303715884105727_16
57  logical, parameter :: test_ihuge1 = ihuge1 == zihuge1 .and. ihuge1 == dihuge1
58  logical, parameter :: test_ihuge2 = ihuge2 == zihuge2 .and. ihuge2 == dihuge2
59  logical, parameter :: test_ihuge4 = ihuge4 == zihuge4 .and. ihuge4 == dihuge4
60  logical, parameter :: test_ihuge8 = ihuge8 == zihuge8 .and. ihuge8 == dihuge8
61  logical, parameter :: test_ihuge16 = ihuge16 == zihuge16 .and. ihuge16 == dihuge16
62
63  real(2), parameter :: &
64    ahuge2 = huge(0._2), zahuge2 = real(z'7bff', kind=2), dahuge2 = 6.5504e4_2
65  real(3), parameter :: &
66    ahuge3 = huge(0._3), zahuge3 = real(z'7f7f', kind=3), &
67    dahuge3 = 3.3895313892515354759047080037148786688e38_3
68  real(4), parameter :: &
69    ahuge4 = huge(0._4), zahuge4 = real(z'7f7fffff', kind=4), &
70    dahuge4 = 3.4028234663852885981170418348451692544e38_4
71  real(8), parameter :: &
72    ahuge8 = huge(0._8), zahuge8 = real(z'7fefffffffffffff', kind=8), &
73    dahuge8 = 1.7976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817&
74               &1540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868&
75               &5084551339423045832369032229481658085593321233482747978262041447231687381771809192998812504040261841&
76               &24858368e308_8
77  real(10), parameter :: &
78    ahuge10 = huge(0._10), zahuge10 = real(z'7ffeffffffffffffffff', kind=10), &
79    dahuge10 = 1.1897314953572317650212638530309702051690633222946242004403237338917370055229707226164102903365288828&
80                &5354569780749557731442744315367028843419812557385374367867359320070697326320191591828296152436552951&
81                &0646791086614311790632169778838896134786560600399148753433211454911160088679845154866512852340149773&
82                &0376000091254793939662231513836224178385427439178381387178058894875405751682263476592355769748051137&
83                &2564902088485522249479139937758502601177354918009979622602685950855888360815984690023564513234659447&
84                &6384939859276456284579661772930407806609229102715046085388087959327781622986827547830768080040150694&
85                &9423034117289577771003357140105597752421240573470073862516601108283791196230084692772009651535002084&
86                &7447079244384854591288672300061908512647211195136146752763351956292759795725027800298079590419313960&
87                &3021470997035276467445530922022679656280991498232083329641241038509239184734786121921697210543484287&
88                &0483534081130425730022164213489173471742348007148807510020643905172342476560047217680964861079949434&
89                &1570347632064355862420744350442438056613601760883747816538902780957697597728686007148702828795556714&
90                &1404632615832623602762896316173978484254486860609948270867968048078702511858930838546584223040908805&
91                &9962945945862019037660484467909260022254105307759010657606713472001258464069570302571389609837579989&
92                &2695455305236856075868317922311363951946885088077187210470520395758748001314313144425494391994017575&
93                &3169339392366881856189129931729104252921236835159922322050998001677102784035360140829296398115122877&
94                &7681357060457893435354516965395612540488464471697868932116710872290880827783505182288576460622187397&
95                &0285165508372099234948333443522898475123275372663606621390228126470623407535207172405866507951821730&
96                &3463782631353393706774901950197841690441824738063162828586857741432581165364040218402724913393320949&
97                &2194984224427304270198730445366203502623869578046820036014472919971230955300572061418669748528468561&
98                &8651483271597448120312194675168637934309618961510733006555242148519520176285859509105183947250286387&
99                &1632494167613804996319791441870254302706758495192008837915169401581740046711477877201459644461175204&
100                &0594535047647218079757611117208462736392796003396704700376133745095531841500737964126050479232516613&
101                &5484129188421134082301547330475406707281876350361733290800595189632520707167390454777712968226520622&
102                &5651439919376804400292380903112437912614776255964694221981375146967079446870358004392507659451618379&
103                &8118593920495440361149153107822510726914869798092409467721427270124043771874092167566136349389004512&
104                &3235166814608932240069799317601780533819184998193300841098599393876029260139091141452600372028487213&
105                &2411955424282101831204216104467404621635336900583664606591156298764745525068145003932941404131495400&
106                &6776029510059622530228230036314738246810596484424413248645731374375950964161680480241293518762046681&
107                &3563687753281467553879887177183651289394719533506188500326760735438867336800207438784965701457609034&
108                &9857571243045102038730494854256702479339322809110526041538528994849203991091946129912491633289917998&
109                &0943803378795220931314669461497059396641523759492858909604899161219449899863848370224866722491489246&
110                &7841020618336462741696957630763248023558797524525373703543388296086275342774001633343405508353704850&
111                &7374544819754722228975281083020898682633020285259923084168054539687911418297629988964576482765287504&
112                &5628549242651652177507995162596692291149777889623566709566271384820181913483216879958636526376209782&
113                &8507009933729439678463987902491451422274252700636394232799848397673998715441855420156224415492665301&
114                &4515504685489258620276085761837129763358761215382565129633538141663949516556000264159186554850057052&
115                &6114319529199188079545223946496276356301785808966922264062353828985358675959906470083856871238103295&
116                &9192649484625076899225841930548076362021508902214922052806984201835084058693849381549890944546197789&
117                &3029113576516775406232278298314033473276603952231603422824717528181818844304880921321933550869873395&
118                &8612760736708666523755556758031714901084773200964243187800700087973460329062789435537435644488519071&
119                &9161645514115576193939969076741515640282654366402676009508752394550734155613586793306603174472092444&
120                &6513532366647649735400851967040771103640538150073486891798364049570606189535005089840913826869535090&
121                &0667833244725787121966044152849248400418509328119089636341757398971665960007594878006191640948543387&
122                &5852065711654107226099628815012314437794400874930194474433078438899570184271000480830501217712356062&
123                &2895076269042856800047718893158089358515593863176652948089031267747029662545110861548958395087796755&
124                &4641379448959605279752098748138397625785921057562844017593493241621483395653501891968113890918437957&
125                &3470326940634289008780584694035245347939808067427323629788710086717580253156130235606487870925986528&
126                &8416350972529537091114317204887747405539054009425375424119317944175137064689643861517718849867010341&
127                &5325423859110896247108853858086888377772586485641459342621210866475884892600317623459607695088491496&
128                &6244415660441955208681198977024e4932_10
129  real(16), parameter :: &
130    ahuge16 = huge(0._16), zahuge16 = real(z'7ffeffffffffffffffffffffffffffff', kind=16), &
131    dahuge16 = 1.1897314953572317650857593266280070161964690526416940455296988842121635797553123923249740128484620735&
132                &2590203356474912685975526543357380446267269875194526149085346195872502126284586579940540449357468156&
133                &6096686172574953791792292256220777095858112702436475442537092608935138247345677279593806773692330094&
134                &6157461197257841728898925219399207576542048645656733564522472781522888677006389355954564966995114417&
135                &5290960687851325094831139688610052683309212868397475219226638679188087369434307734815556410166997113&
136                &8512786874753496996549221727686770196551512812712488289469952298031867469924683981576664562667786719&
137                &0614996396303416570983054252372208766646300878087672561828032202122199248523759030495209113959109189&
138                &2120527349676858811903011159301878936803923201167140417584510885470696521560577711351625740481881769&
139                &5075025715299705916714352103671782759119316034498392169720631800164034124698918142227577300459309880&
140                &4547151796062998955075830758511951858579711731676769660579988993526318854177162953020146688023840758&
141                &4603622660648014297759540713505037980864913015716402406031178690879637251033587351277479527574859541&
142                &7572920936651398752709055215663939505589207804914540432978557623565645991208599669097180808881920063&
143                &7227714312184890119222096790535459636284173260024397328029395243137866685140273814343210366365711716&
144                &7042358647275956123197079396783927914728272019537706060212263845788320480934171752680963925353944773&
145                &0280863675704796054050525162959099932535265586464682793821550087166946662209865086040990507131145474&
146                &2674110428395423227629949387596131127438371928396826762575553883728144908453957471281620658715882191&
147                &0888724011665136196205080002917629993882608241754751673226993047313326125892184551681523545535431045&
148                &8114528303607394526100730578774092094736822286015459361126642549541799645333882549670764145955017051&
149                &3308000612538651401801532119293614565003435147928902055320217600618822326157365533772949809740595905&
150                &2018796145979938674151302850593441045360348019238334932111517181105100410859283099181138255290906487&
151                &3029533418691087118107895004426881765865961841419267486232005929789956207494587649901662172318722999&
152                &4845123258260870315619363836897406865052797752967893316136838227985970406516005241290251498948731531&
153                &9694209505667084746692764481259650670012944357951247923062137397808873125708979962290218382410541293&
154                &0483065603459863120371744282301377070153823878609951218937542956964157950988060608985782910656238116&
155                &1422035741047574518281708048752574462041283485138290827317223641893804935883389476643706232798207558&
156                &3164620541748839306283820178954721954319445090211369992596537690819279215212221282457887933650687528&
157                &8617303469517112245451315447164280392523574962804175375927948971096983905242318797695347043690474223&
158                &8132665056397611644388442665313646268512196339944341540985621273959361844218214442734315345078601616&
159                &1428702272098406156966033337278824103713153807737748015267058325792053556997331818811268567331899796&
160                &7497786786001251403873023920127717626858627038170562807276699687356274072773403132694104831615879354&
161                &3958115858251128378415632227616233344591881315378823557324830300859768903829697344762145934281912127&
162                &1714133304757786755221851743106484876037319629031012446614508707837714052853304868420427879959665251&
163                &4009368964527494988719996088230065668196236298805733689960371306226158464997243490564472254071897564&
164                &1441285398399860960455632647712855850663041779957201017448443871583297673755604162078008788300720724&
165                &1390865785566723954636935777578134428819598917631335685641784543423281488674422674670706697975557712&
166                &1788798468777700116472954103621810567107869855646414713502627836321256957407217461738363552424248762&
167                &4364780853518109957492932381740813319050481446127009055414257022203025376114948242287653245779337785&
168                &1981877869734028258091278067497905893806255685600107605770598216668682475603756961576049761981948205&
169                &2758118532729333127733603742149847001463931981340719681330844408263017545241644293372483217234561694&
170                &2639378557592944486629790954192274518015884259778696940266014279196551684158959230431151917518727133&
171                &4609575263460825447598815416225495259785319903964588374219923638761039583094807436598839770784963225&
172                &2080920941206268114832425403540515474312327876180802357701527842702008781378306569508588571830140611&
173                &0980426830095308627974030153554643774062498539644810004022317716657008936075218040845236685686491032&
174                &5886266629337247244143556352059546170104239050079561583450594483732665254246744436486149918427509748&
175                &5253621979537504128523848241127715641240965261646703516395599407360083455079665191393229410544185167&
176                &9990997876554244625589008743884056491694537267393122602348155432978423086460721901479480729284567258&
177                &3503954612118213364077776992584180757905173583882311275962271406750966991364528828189455892561297242&
178                &5252452248453502562347348900936766966136332741088135837550717443838484760651019872222926016920811114&
179                &6169371432077434885046020127763642567468723152059526010722289706864609324352227544963417635351891055&
180                &48847634608972381760403137363968e4932_16
181  logical, parameter :: test_ahuge2 = ahuge2 == zahuge2 .and. ahuge2 == dahuge2
182  logical, parameter :: test_ahuge3 = ahuge3 == zahuge3 .and. ahuge3 == dahuge3
183  logical, parameter :: test_ahuge4 = ahuge4 == zahuge4 .and. ahuge4 == dahuge4
184  logical, parameter :: test_ahuge8 = ahuge8 == zahuge8 .and. ahuge8 == dahuge8
185  logical, parameter :: test_ahuge10 = ahuge10 == zahuge10 .and. ahuge10 == dahuge10
186  logical, parameter :: test_ahuge16 = ahuge16 == zahuge16 .and. ahuge16 == dahuge16
187
188  real(2), parameter :: tiny2 = tiny(0._2), ztiny2 = real(z'0400', kind=2)
189  real(3), parameter :: tiny3 = tiny(0._3), ztiny3 = real(z'0080', kind=3)
190  real(4), parameter :: tiny4 = tiny(0._4), ztiny4 = real(z'00800000', kind=4)
191  real(8), parameter :: tiny8 = tiny(0._8), ztiny8 = real(z'0010000000000000', kind=8)
192  real(10), parameter :: tiny10 = tiny(0._10), ztiny10 = real(z'00018000000000000000', kind=10)
193  real(16), parameter :: tiny16 = tiny(0._16), ztiny16 = real(z'00010000000000000000000000000000', kind=16)
194  logical, parameter :: test_tiny2 = tiny2 == ztiny2
195  logical, parameter :: test_tiny3 = tiny3 == ztiny3
196  logical, parameter :: test_tiny4 = tiny4 == ztiny4
197  logical, parameter :: test_tiny8 = tiny8 == ztiny8
198  logical, parameter :: test_tiny10 = tiny10 == ztiny10
199  logical, parameter :: test_tiny16 = tiny16 == ztiny16
200
201  integer, parameter :: &
202    max2 = maxexponent(0._2), &
203    max3 = maxexponent(0._3), &
204    max4 = maxexponent(0._4), &
205    max8 = maxexponent(0._8), &
206    max10 = maxexponent(0._10), &
207    max16 = maxexponent(0._16)
208  logical, parameter :: test_max2 = max2 == 15
209  logical, parameter :: test_max3 = max3 == 127
210  logical, parameter :: test_max4 = max4 == 127
211  logical, parameter :: test_max8 = max8 == 1023
212  logical, parameter :: test_max10 = max10 == 16383
213  logical, parameter :: test_max16 = max16 == 16383
214
215  integer, parameter :: &
216    min2 = minexponent(0._2), &
217    min3 = minexponent(0._3), &
218    min4 = minexponent(0._4), &
219    min8 = minexponent(0._8), &
220    min10 = minexponent(0._10), &
221    min16 = minexponent(0._16)
222  logical, parameter :: test_min2 = min2 == -14
223  logical, parameter :: test_min3 = min3 == -126
224  logical, parameter :: test_min4 = min4 == -126
225  logical, parameter :: test_min8 = min8 == -1022
226  logical, parameter :: test_min10 = min10 == -16382
227  logical, parameter :: test_min16 = min16 == -16382
228
229  integer, parameter :: &
230    irange1 = range(0_1), &
231    irange2 = range(0_2), &
232    irange4 = range(0_4), &
233    irange8 = range(0_8), &
234    irange16 = range(0_16)
235  logical, parameter :: test_irange1 = irange1 == 2
236  logical, parameter :: test_irange2 = irange2 == 4
237  logical, parameter :: test_irange4 = irange4 == 9
238  logical, parameter :: test_irange8 = irange8 == 18
239  logical, parameter :: test_irange16 = irange16 == 38
240
241  integer, parameter :: &
242    arange2 = range(0._2), zrange2 = range((0._2,0._2)), &
243    arange3 = range(0._3), zrange3 = range((0._3, 0._3)), &
244    arange4 = range(0._4), zrange4 = range((0._4, 0._4)), &
245    arange8 = range(0._8), zrange8 = range((0._8, 0._8)), &
246    arange10 = range(0._10), zrange10 = range((0._10, 0._10)), &
247    arange16 = range(0._16), zrange16 = range((0._16, 0._16))
248  logical, parameter :: test_arange2 = arange2 == 4 .and. zrange2 == 4
249  logical, parameter :: test_arange3 = arange3 == 37 .and. zrange3 == 37
250  logical, parameter :: test_zrange4 = arange4 == 37 .and. zrange4 == 37
251  logical, parameter :: test_zrange8 = arange8 == 307 .and. zrange8 == 307
252  logical, parameter :: test_zrange10 = arange10 == 4931 .and. zrange10 == 4931
253  logical, parameter :: test_zrange16 = arange16 == 4931 .and. zrange16 == 4931
254
255end module
256