From 5b95fa08900f0bb4a371996b78ec632b6aaf1b6e Mon Sep 17 00:00:00 2001 From: Neal Gafter Date: Fri, 20 Sep 2019 10:25:26 -0700 Subject: [PATCH] Test constant folding of shift operators. (#38729) --- .../Test/Semantic/Semantics/ConstantTests.cs | 318 ++++++++++++++++++ 1 file changed, 318 insertions(+) diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs index ebeba17751dc4..95b987f3b5a0f 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/ConstantTests.cs @@ -2443,6 +2443,324 @@ void M() Assert.Equal(expected, actual); } + [Fact] + public void TestUnspecifiedShifts() + { + var source = +@"class C +{ + void M() + { + _ = 1487023104 == (-40490869 << 1176494346); + _ = 3405660160U == (385007504U << 1176494346); + _ = -5519616229445825536L == (2480596744084445603L << 1176494346); + _ = 12553477852066636800UL == (1183195158831237785UL << 1176494346); + _ = -39542 == (-40490869 >> 1176494346); + _ = 375983U == (385007504U >> 1176494346); + _ = 2422457757894966L == (2480596744084445603L >> 1176494346); + _ = 1155464022296130UL == (1183195158831237785UL >> 1176494346); + _ = 1026730496 == (1142856021 << 52258473); + _ = 3405730304U == (4167401385U << 52258473); + _ = 949749347979886592L == (-99642203025533160L << 52258473); + _ = 3870362293631975424UL == (5277240384921721637UL << 52258473); + _ = 2232140 == (1142856021 >> 52258473); + _ = 8139455U == (4167401385U >> 52258473); + _ = -45313L == (-99642203025533160L >> 52258473); + _ = 2399811UL == (5277240384921721637UL >> 52258473); + _ = 2146190848 == (1765799459 << -847584439); + _ = 746002432U == (1956002700U << -847584439); + _ = 8330086530681716224L == (-2649861279148095905L << -847584439); + _ = 11021680305799133184UL == (4633212737774651836UL << -847584439); + _ = 3448827 == (1765799459 >> -847584439); + _ = 3820317U == (1956002700U >> -847584439); + _ = -5175510310836125L == (-2649861279148095905L >> -847584439); + _ = 9049243628466116UL == (4633212737774651836UL >> -847584439); + _ = -147839246 == (-73919623 << -261666143); + _ = 434667096U == (2364817196U << -261666143); + _ = 5379847945883484160L == (8600028236070815642L << -261666143); + _ = 18250411927379378176UL == (9754066888939486842UL << -261666143); + _ = -36959812 == (-73919623 >> -261666143); + _ = 1182408598U == (2364817196U >> -261666143); + _ = 1001175054L == (8600028236070815642L >> -261666143); + _ = 1135522835UL == (9754066888939486842UL >> -261666143); + _ = -642990336 == (-575448706 << 1251164583); + _ = 101734912U == (2651594932U << 1251164583); + _ = -2477956711135051776L == (4397665286211975439L << 1251164583); + _ = 17177975275221155840UL == (3677188853080049883UL << 1251164583); + _ = -4495694 == (-575448706 >> 1251164583); + _ = 20715585U == (2651594932U >> 1251164583); + _ = 7999306L == (4397665286211975439L >> 1251164583); + _ = 6688767UL == (3677188853080049883UL >> 1251164583); + _ = -2147483648 == (1680903167 << -1931469441); + _ = 2147483648U == (1696031835U << -1931469441); + _ = 0L == (-5154426740587151092L << -1931469441); + _ = 9223372036854775808UL == (11340274989429123451UL << -1931469441); + _ = 0 == (1680903167 >> -1931469441); + _ = 0U == (1696031835U >> -1931469441); + _ = -1L == (-5154426740587151092L >> -1931469441); + _ = 1UL == (11340274989429123451UL >> -1931469441); + _ = -1073741824 == (466088311 << 664633406); + _ = 0U == (3367565272U << 664633406); + _ = 0L == (-9002257244105090536L << 664633406); + _ = 13835058055282163712UL == (16369162113479203207UL << 664633406); + _ = 0 == (466088311 >> 664633406); + _ = 3U == (3367565272U >> 664633406); + _ = -2L == (-9002257244105090536L >> 664633406); + _ = 3UL == (16369162113479203207UL >> 664633406); + _ = 1016170002 == (508085001 << 84049121); + _ = 3845222538U == (1922611269U << 84049121); + _ = -3053627404204376064L == (1789288808291740423L << 84049121); + _ = 9069021830043402240UL == (3140594490787352999UL << 84049121); + _ = 254042500 == (508085001 >> 84049121); + _ = 961305634U == (1922611269U >> 84049121); + _ = 208300632L == (1789288808291740423L >> 84049121); + _ = 365613318UL == (3140594490787352999UL >> 84049121); + _ = 1610612736 == (1704288204 << -639239173); + _ = 3758096384U == (2570458748U << -639239173); + _ = -1152921504606846976L == (7131876568822188702L << -639239173); + _ = 9799832789158199296UL == (5759179746966546129UL << -639239173); + _ = 12 == (1704288204 >> -639239173); + _ = 19U == (2570458748U >> -639239173); + _ = 12L == (7131876568822188702L >> -639239173); + _ = 9UL == (5759179746966546129UL >> -639239173); + _ = 1493172224 == (-177594791 << 232270776); + _ = 671088640U == (3656907048U << 232270776); + _ = 144115188075855872L == (5226244767915300354L << 232270776); + _ = 17005592192950992896UL == (16201604657234886124UL << 232270776); + _ = -11 == (-177594791 >> 232270776); + _ = 217U == (3656907048U >> 232270776); + _ = 72L == (5226244767915300354L >> 232270776); + _ = 224UL == (16201604657234886124UL >> 232270776); + } +}"; + var actual = ParseAndGetConstantFoldingSteps(source); + var expected = +@"1487023104 == (-40490869 << 1176494346) --> True +-40490869 << 1176494346 --> 1487023104 +-40490869 --> -40490869 +3405660160U == (385007504U << 1176494346) --> True +385007504U << 1176494346 --> 3405660160 +-5519616229445825536L == (2480596744084445603L << 1176494346) --> True +-5519616229445825536L --> -5519616229445825536 +2480596744084445603L << 1176494346 --> -5519616229445825536 +12553477852066636800UL == (1183195158831237785UL << 1176494346) --> True +1183195158831237785UL << 1176494346 --> 12553477852066636800 +-39542 == (-40490869 >> 1176494346) --> True +-39542 --> -39542 +-40490869 >> 1176494346 --> -39542 +-40490869 --> -40490869 +375983U == (385007504U >> 1176494346) --> True +385007504U >> 1176494346 --> 375983 +2422457757894966L == (2480596744084445603L >> 1176494346) --> True +2480596744084445603L >> 1176494346 --> 2422457757894966 +1155464022296130UL == (1183195158831237785UL >> 1176494346) --> True +1183195158831237785UL >> 1176494346 --> 1155464022296130 +1026730496 == (1142856021 << 52258473) --> True +1142856021 << 52258473 --> 1026730496 +3405730304U == (4167401385U << 52258473) --> True +4167401385U << 52258473 --> 3405730304 +949749347979886592L == (-99642203025533160L << 52258473) --> True +-99642203025533160L << 52258473 --> 949749347979886592 +-99642203025533160L --> -99642203025533160 +3870362293631975424UL == (5277240384921721637UL << 52258473) --> True +5277240384921721637UL << 52258473 --> 3870362293631975424 +2232140 == (1142856021 >> 52258473) --> True +1142856021 >> 52258473 --> 2232140 +8139455U == (4167401385U >> 52258473) --> True +4167401385U >> 52258473 --> 8139455 +-45313L == (-99642203025533160L >> 52258473) --> True +-45313L --> -45313 +-99642203025533160L >> 52258473 --> -45313 +-99642203025533160L --> -99642203025533160 +2399811UL == (5277240384921721637UL >> 52258473) --> True +5277240384921721637UL >> 52258473 --> 2399811 +2146190848 == (1765799459 << -847584439) --> True +1765799459 << -847584439 --> 2146190848 +-847584439 --> -847584439 +746002432U == (1956002700U << -847584439) --> True +1956002700U << -847584439 --> 746002432 +-847584439 --> -847584439 +8330086530681716224L == (-2649861279148095905L << -847584439) --> True +-2649861279148095905L << -847584439 --> 8330086530681716224 +-2649861279148095905L --> -2649861279148095905 +-847584439 --> -847584439 +11021680305799133184UL == (4633212737774651836UL << -847584439) --> True +4633212737774651836UL << -847584439 --> 11021680305799133184 +-847584439 --> -847584439 +3448827 == (1765799459 >> -847584439) --> True +1765799459 >> -847584439 --> 3448827 +-847584439 --> -847584439 +3820317U == (1956002700U >> -847584439) --> True +1956002700U >> -847584439 --> 3820317 +-847584439 --> -847584439 +-5175510310836125L == (-2649861279148095905L >> -847584439) --> True +-5175510310836125L --> -5175510310836125 +-2649861279148095905L >> -847584439 --> -5175510310836125 +-2649861279148095905L --> -2649861279148095905 +-847584439 --> -847584439 +9049243628466116UL == (4633212737774651836UL >> -847584439) --> True +4633212737774651836UL >> -847584439 --> 9049243628466116 +-847584439 --> -847584439 +-147839246 == (-73919623 << -261666143) --> True +-147839246 --> -147839246 +-73919623 << -261666143 --> -147839246 +-73919623 --> -73919623 +-261666143 --> -261666143 +434667096U == (2364817196U << -261666143) --> True +2364817196U << -261666143 --> 434667096 +-261666143 --> -261666143 +5379847945883484160L == (8600028236070815642L << -261666143) --> True +8600028236070815642L << -261666143 --> 5379847945883484160 +-261666143 --> -261666143 +18250411927379378176UL == (9754066888939486842UL << -261666143) --> True +9754066888939486842UL << -261666143 --> 18250411927379378176 +-261666143 --> -261666143 +-36959812 == (-73919623 >> -261666143) --> True +-36959812 --> -36959812 +-73919623 >> -261666143 --> -36959812 +-73919623 --> -73919623 +-261666143 --> -261666143 +1182408598U == (2364817196U >> -261666143) --> True +2364817196U >> -261666143 --> 1182408598 +-261666143 --> -261666143 +1001175054L == (8600028236070815642L >> -261666143) --> True +8600028236070815642L >> -261666143 --> 1001175054 +-261666143 --> -261666143 +1135522835UL == (9754066888939486842UL >> -261666143) --> True +9754066888939486842UL >> -261666143 --> 1135522835 +-261666143 --> -261666143 +-642990336 == (-575448706 << 1251164583) --> True +-642990336 --> -642990336 +-575448706 << 1251164583 --> -642990336 +-575448706 --> -575448706 +101734912U == (2651594932U << 1251164583) --> True +2651594932U << 1251164583 --> 101734912 +-2477956711135051776L == (4397665286211975439L << 1251164583) --> True +-2477956711135051776L --> -2477956711135051776 +4397665286211975439L << 1251164583 --> -2477956711135051776 +17177975275221155840UL == (3677188853080049883UL << 1251164583) --> True +3677188853080049883UL << 1251164583 --> 17177975275221155840 +-4495694 == (-575448706 >> 1251164583) --> True +-4495694 --> -4495694 +-575448706 >> 1251164583 --> -4495694 +-575448706 --> -575448706 +20715585U == (2651594932U >> 1251164583) --> True +2651594932U >> 1251164583 --> 20715585 +7999306L == (4397665286211975439L >> 1251164583) --> True +4397665286211975439L >> 1251164583 --> 7999306 +6688767UL == (3677188853080049883UL >> 1251164583) --> True +3677188853080049883UL >> 1251164583 --> 6688767 +-2147483648 == (1680903167 << -1931469441) --> True +1680903167 << -1931469441 --> -2147483648 +-1931469441 --> -1931469441 +2147483648U == (1696031835U << -1931469441) --> True +1696031835U << -1931469441 --> 2147483648 +-1931469441 --> -1931469441 +0L == (-5154426740587151092L << -1931469441) --> True +-5154426740587151092L << -1931469441 --> 0 +-5154426740587151092L --> -5154426740587151092 +-1931469441 --> -1931469441 +9223372036854775808UL == (11340274989429123451UL << -1931469441) --> True +11340274989429123451UL << -1931469441 --> 9223372036854775808 +-1931469441 --> -1931469441 +0 == (1680903167 >> -1931469441) --> True +1680903167 >> -1931469441 --> 0 +-1931469441 --> -1931469441 +0U == (1696031835U >> -1931469441) --> True +1696031835U >> -1931469441 --> 0 +-1931469441 --> -1931469441 +-1L == (-5154426740587151092L >> -1931469441) --> True +-1L --> -1 +-5154426740587151092L >> -1931469441 --> -1 +-5154426740587151092L --> -5154426740587151092 +-1931469441 --> -1931469441 +1UL == (11340274989429123451UL >> -1931469441) --> True +11340274989429123451UL >> -1931469441 --> 1 +-1931469441 --> -1931469441 +-1073741824 == (466088311 << 664633406) --> True +-1073741824 --> -1073741824 +466088311 << 664633406 --> -1073741824 +0U == (3367565272U << 664633406) --> True +3367565272U << 664633406 --> 0 +0L == (-9002257244105090536L << 664633406) --> True +-9002257244105090536L << 664633406 --> 0 +-9002257244105090536L --> -9002257244105090536 +13835058055282163712UL == (16369162113479203207UL << 664633406) --> True +16369162113479203207UL << 664633406 --> 13835058055282163712 +0 == (466088311 >> 664633406) --> True +466088311 >> 664633406 --> 0 +3U == (3367565272U >> 664633406) --> True +3367565272U >> 664633406 --> 3 +-2L == (-9002257244105090536L >> 664633406) --> True +-2L --> -2 +-9002257244105090536L >> 664633406 --> -2 +-9002257244105090536L --> -9002257244105090536 +3UL == (16369162113479203207UL >> 664633406) --> True +16369162113479203207UL >> 664633406 --> 3 +1016170002 == (508085001 << 84049121) --> True +508085001 << 84049121 --> 1016170002 +3845222538U == (1922611269U << 84049121) --> True +1922611269U << 84049121 --> 3845222538 +-3053627404204376064L == (1789288808291740423L << 84049121) --> True +-3053627404204376064L --> -3053627404204376064 +1789288808291740423L << 84049121 --> -3053627404204376064 +9069021830043402240UL == (3140594490787352999UL << 84049121) --> True +3140594490787352999UL << 84049121 --> 9069021830043402240 +254042500 == (508085001 >> 84049121) --> True +508085001 >> 84049121 --> 254042500 +961305634U == (1922611269U >> 84049121) --> True +1922611269U >> 84049121 --> 961305634 +208300632L == (1789288808291740423L >> 84049121) --> True +1789288808291740423L >> 84049121 --> 208300632 +365613318UL == (3140594490787352999UL >> 84049121) --> True +3140594490787352999UL >> 84049121 --> 365613318 +1610612736 == (1704288204 << -639239173) --> True +1704288204 << -639239173 --> 1610612736 +-639239173 --> -639239173 +3758096384U == (2570458748U << -639239173) --> True +2570458748U << -639239173 --> 3758096384 +-639239173 --> -639239173 +-1152921504606846976L == (7131876568822188702L << -639239173) --> True +-1152921504606846976L --> -1152921504606846976 +7131876568822188702L << -639239173 --> -1152921504606846976 +-639239173 --> -639239173 +9799832789158199296UL == (5759179746966546129UL << -639239173) --> True +5759179746966546129UL << -639239173 --> 9799832789158199296 +-639239173 --> -639239173 +12 == (1704288204 >> -639239173) --> True +1704288204 >> -639239173 --> 12 +-639239173 --> -639239173 +19U == (2570458748U >> -639239173) --> True +2570458748U >> -639239173 --> 19 +-639239173 --> -639239173 +12L == (7131876568822188702L >> -639239173) --> True +7131876568822188702L >> -639239173 --> 12 +-639239173 --> -639239173 +9UL == (5759179746966546129UL >> -639239173) --> True +5759179746966546129UL >> -639239173 --> 9 +-639239173 --> -639239173 +1493172224 == (-177594791 << 232270776) --> True +-177594791 << 232270776 --> 1493172224 +-177594791 --> -177594791 +671088640U == (3656907048U << 232270776) --> True +3656907048U << 232270776 --> 671088640 +144115188075855872L == (5226244767915300354L << 232270776) --> True +5226244767915300354L << 232270776 --> 144115188075855872 +17005592192950992896UL == (16201604657234886124UL << 232270776) --> True +16201604657234886124UL << 232270776 --> 17005592192950992896 +-11 == (-177594791 >> 232270776) --> True +-11 --> -11 +-177594791 >> 232270776 --> -11 +-177594791 --> -177594791 +217U == (3656907048U >> 232270776) --> True +3656907048U >> 232270776 --> 217 +72L == (5226244767915300354L >> 232270776) --> True +5226244767915300354L >> 232270776 --> 72 +224UL == (16201604657234886124UL >> 232270776) --> True +16201604657234886124UL >> 232270776 --> 224"; + Assert.Equal(expected, actual); + } + // Constant fields should be bound in the declaration phase. [Fact] public void TestConstantEvalAtDeclarationPhase()