1*4d7e907cSAndroid Build Coastguard Worker/* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Workerpackage [email protected]; 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Workerinterface IExpression { 20*4d7e907cSAndroid Build Coastguard Worker enum UInt64LiteralTypeGuessing : uint64_t { 21*4d7e907cSAndroid Build Coastguard Worker noSuffixDec1 = 0, 22*4d7e907cSAndroid Build Coastguard Worker noSuffixDec2 = 1, 23*4d7e907cSAndroid Build Coastguard Worker noSuffixDec3 = -1, 24*4d7e907cSAndroid Build Coastguard Worker noSuffixDec4 = ~0, 25*4d7e907cSAndroid Build Coastguard Worker noSuffixDec5 = 2147483647, 26*4d7e907cSAndroid Build Coastguard Worker noSuffixDec6 = -2147483648, 27*4d7e907cSAndroid Build Coastguard Worker noSuffixDec7 = 2147483648, 28*4d7e907cSAndroid Build Coastguard Worker noSuffixDec8 = -2147483649, 29*4d7e907cSAndroid Build Coastguard Worker noSuffixDec9 = ~(-1), 30*4d7e907cSAndroid Build Coastguard Worker noSuffixHex1 = 0x7fffffff, 31*4d7e907cSAndroid Build Coastguard Worker noSuffixHex2 = 0x80000000, 32*4d7e907cSAndroid Build Coastguard Worker noSuffixHex3 = 0xffffffff, 33*4d7e907cSAndroid Build Coastguard Worker longHex1 = 0xffffffffl, 34*4d7e907cSAndroid Build Coastguard Worker longHex2 = 0Xfffffffff, 35*4d7e907cSAndroid Build Coastguard Worker longHex3 = 0x7fffffffffffffff, 36*4d7e907cSAndroid Build Coastguard Worker longHex4 = 0x8000000000000000, 37*4d7e907cSAndroid Build Coastguard Worker longHex5 = 0xFFFFFFFFFFFFFFFF, 38*4d7e907cSAndroid Build Coastguard Worker }; 39*4d7e907cSAndroid Build Coastguard Worker 40*4d7e907cSAndroid Build Coastguard Worker enum SuffixedLiteralTypeGuessing : int32_t { 41*4d7e907cSAndroid Build Coastguard Worker // Should be all true / ones. 42*4d7e907cSAndroid Build Coastguard Worker // dec literals are either int32_t or int64_t 43*4d7e907cSAndroid Build Coastguard Worker decInt32_1 = (~(-1)) == 0, 44*4d7e907cSAndroid Build Coastguard Worker decInt32_2 = -(1 << 31) == (1 << 31), 45*4d7e907cSAndroid Build Coastguard Worker decInt64_1 = (~(-1l)) == 0, 46*4d7e907cSAndroid Build Coastguard Worker decInt64_2 = (~4294967295) != 0, 47*4d7e907cSAndroid Build Coastguard Worker decInt64_3 = (~4294967295l) != 0, 48*4d7e907cSAndroid Build Coastguard Worker decInt64_4 = -(1l << 63) == (1l << 63), 49*4d7e907cSAndroid Build Coastguard Worker // hex literals could be (u)int32_t or (u)int64_t 50*4d7e907cSAndroid Build Coastguard Worker // 0x7fffffff is int32_t, hence can be negated 51*4d7e907cSAndroid Build Coastguard Worker hexInt32_1 = -0x7fffffff < 0, 52*4d7e907cSAndroid Build Coastguard Worker // 0x80000000 is uint32_t; if it were int32_t then -(int32_t)0x80000000 == (int32_t)0x80000000 > 0 53*4d7e907cSAndroid Build Coastguard Worker hexUInt32_1 = -0x80000000 > 0, 54*4d7e907cSAndroid Build Coastguard Worker // 0xFFFFFFFF is uint32_t, not int64_t; if it were int64_t then ~(int64_t)0xFFFFFFFF != 0 55*4d7e907cSAndroid Build Coastguard Worker hexUInt32_2 = ~0xFFFFFFFF == 0, 56*4d7e907cSAndroid Build Coastguard Worker // 0x7FFFFFFFFFFFFFFF is int64_t, hence can be negated 57*4d7e907cSAndroid Build Coastguard Worker hexInt64_1 = -0x7FFFFFFFFFFFFFFF < 0, 58*4d7e907cSAndroid Build Coastguard Worker // 0x8000000000000000 is uint64_t 59*4d7e907cSAndroid Build Coastguard Worker hexUInt64_1 = -0x8000000000000000 > 0, 60*4d7e907cSAndroid Build Coastguard Worker }; 61*4d7e907cSAndroid Build Coastguard Worker 62*4d7e907cSAndroid Build Coastguard Worker enum Int64LiteralTypeGuessing : int64_t { 63*4d7e907cSAndroid Build Coastguard Worker // both treated int32_t, sum = (int64_t)(int32_t)0x80000000 = (int64_t)(-2147483648) 64*4d7e907cSAndroid Build Coastguard Worker noSuffixDec11 = 1 + 0x7fffffff, 65*4d7e907cSAndroid Build Coastguard Worker // 0x80000000 is uint32_t, sum = (int64_t)(uint32_t)0x7fffffff = (int64_t)(2147483647) 66*4d7e907cSAndroid Build Coastguard Worker noSuffixDec12 = 0x80000000 - 1, 67*4d7e907cSAndroid Build Coastguard Worker }; 68*4d7e907cSAndroid Build Coastguard Worker 69*4d7e907cSAndroid Build Coastguard Worker enum Int32BitShifting : int32_t { 70*4d7e907cSAndroid Build Coastguard Worker // Shifting for more than 31 bits are undefined. Not tested. 71*4d7e907cSAndroid Build Coastguard Worker int32BitShift1 = 1 << 31, 72*4d7e907cSAndroid Build Coastguard Worker }; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker enum UInt32BitShifting : uint32_t { 75*4d7e907cSAndroid Build Coastguard Worker uint32BitShift1 = 1 << 31, 76*4d7e907cSAndroid Build Coastguard Worker }; 77*4d7e907cSAndroid Build Coastguard Worker 78*4d7e907cSAndroid Build Coastguard Worker enum Int64BitShifting : int64_t { 79*4d7e907cSAndroid Build Coastguard Worker int64BitShift1 = 1l << 63, 80*4d7e907cSAndroid Build Coastguard Worker }; 81*4d7e907cSAndroid Build Coastguard Worker 82*4d7e907cSAndroid Build Coastguard Worker enum UInt64BitShifting : uint64_t { 83*4d7e907cSAndroid Build Coastguard Worker uint64BitShift1 = 1l << 63, 84*4d7e907cSAndroid Build Coastguard Worker }; 85*4d7e907cSAndroid Build Coastguard Worker 86*4d7e907cSAndroid Build Coastguard Worker enum Precedence : int32_t { 87*4d7e907cSAndroid Build Coastguard Worker literal = 4, 88*4d7e907cSAndroid Build Coastguard Worker neg = -4, 89*4d7e907cSAndroid Build Coastguard Worker literalL = -4L, 90*4d7e907cSAndroid Build Coastguard Worker hex = 0xffffffff, 91*4d7e907cSAndroid Build Coastguard Worker hexLong = 0xffffffffl, 92*4d7e907cSAndroid Build Coastguard Worker hexLong2 = 0xfffffffff, 93*4d7e907cSAndroid Build Coastguard Worker simpleArithmetic = 4 + 1, 94*4d7e907cSAndroid Build Coastguard Worker simpleArithmetic2 = 2 + 3 - 4, 95*4d7e907cSAndroid Build Coastguard Worker simpleArithmetic3 = 2 - 3 + 4, 96*4d7e907cSAndroid Build Coastguard Worker simpleBoolExpr = 1 == 4, 97*4d7e907cSAndroid Build Coastguard Worker simpleLogical = 1 && 1, 98*4d7e907cSAndroid Build Coastguard Worker simpleLogical2 = 1 || 1 && 0, // && higher than || 99*4d7e907cSAndroid Build Coastguard Worker simpleComp = 1 < 2, 100*4d7e907cSAndroid Build Coastguard Worker boolExpr1 = !((3 != 4 || (2 < 3 <= 3 > 4)) >= 0), 101*4d7e907cSAndroid Build Coastguard Worker boolExpr = 1 == 7 && !((3 != 4 || (2 < 3 <= 3 > 4)) >= 0), 102*4d7e907cSAndroid Build Coastguard Worker simpleBitShift = 1 << 2, 103*4d7e907cSAndroid Build Coastguard Worker simpleBitShift2 = 4 >> 1, 104*4d7e907cSAndroid Build Coastguard Worker simpleBitShiftNeg = 4 << -1, 105*4d7e907cSAndroid Build Coastguard Worker simpleArithmeticRightShift = 1 << 31 >> 31, 106*4d7e907cSAndroid Build Coastguard Worker simpleBitExpr = 1 | 16 >> 2, 107*4d7e907cSAndroid Build Coastguard Worker simpleBitExpr2 = 0x0f ^ 0x33 & 0x99, // & higher than ^ 108*4d7e907cSAndroid Build Coastguard Worker bitExpr = ~42 & (1 << 3 | 16 >> 2) ^ 7, 109*4d7e907cSAndroid Build Coastguard Worker arithmeticExpr = 2 + 3 - 4 * -7 / (10 % 3), 110*4d7e907cSAndroid Build Coastguard Worker messyExpr = 2 + (-3&4 / 7), 111*4d7e907cSAndroid Build Coastguard Worker paranExpr = (((((1 + 1))))), 112*4d7e907cSAndroid Build Coastguard Worker ternary = 1?2:3, 113*4d7e907cSAndroid Build Coastguard Worker ternary2 = 1&&2?3:4, 114*4d7e907cSAndroid Build Coastguard Worker complicatedTernary2 = 1 - 1 && 2 + 3 || 5 ? 7 * 8 : -3, 115*4d7e907cSAndroid Build Coastguard Worker }; 116*4d7e907cSAndroid Build Coastguard Worker 117*4d7e907cSAndroid Build Coastguard Worker enum OperatorSanityCheck : int32_t { 118*4d7e907cSAndroid Build Coastguard Worker // Should be all true / ones. 119*4d7e907cSAndroid Build Coastguard Worker plus = (1 + 2) == 3, 120*4d7e907cSAndroid Build Coastguard Worker minus = (8 - 9) == -1, 121*4d7e907cSAndroid Build Coastguard Worker product = (9 * 9) == 81, 122*4d7e907cSAndroid Build Coastguard Worker division = (29 / 3) == 9, 123*4d7e907cSAndroid Build Coastguard Worker mod = (29 % 3) == 2, 124*4d7e907cSAndroid Build Coastguard Worker bit_or = (0xC0010000 | 0xF00D) == (0xC001F00D), 125*4d7e907cSAndroid Build Coastguard Worker bit_or2 = (10 | 6) == 14, 126*4d7e907cSAndroid Build Coastguard Worker bit_and = (10 & 6) == 2, 127*4d7e907cSAndroid Build Coastguard Worker bit_xor = (10 ^ 6) == 12, 128*4d7e907cSAndroid Build Coastguard Worker lt1 = 6 < 10, 129*4d7e907cSAndroid Build Coastguard Worker lt2 = (10 < 10) == 0, 130*4d7e907cSAndroid Build Coastguard Worker gt1 = (6 > 10) == 0, 131*4d7e907cSAndroid Build Coastguard Worker gt2 = (10 > 10) == 0, 132*4d7e907cSAndroid Build Coastguard Worker gte1 = 19 >= 10, 133*4d7e907cSAndroid Build Coastguard Worker gte2 = 10 >= 10, 134*4d7e907cSAndroid Build Coastguard Worker lte1 = 5 <= 10, 135*4d7e907cSAndroid Build Coastguard Worker lte2 = (19 <= 10) == 0, 136*4d7e907cSAndroid Build Coastguard Worker ne1 = 19 != 10, 137*4d7e907cSAndroid Build Coastguard Worker ne2 = (10 != 10) == 0, 138*4d7e907cSAndroid Build Coastguard Worker lshift = (22 << 1) == 44, 139*4d7e907cSAndroid Build Coastguard Worker rshift = (11 >> 1) == 5, 140*4d7e907cSAndroid Build Coastguard Worker logor1 = (1 || 0) == 1, 141*4d7e907cSAndroid Build Coastguard Worker logor2 = (1 || 1) == 1, 142*4d7e907cSAndroid Build Coastguard Worker logor3 = (0 || 0) == 0, 143*4d7e907cSAndroid Build Coastguard Worker logor4 = (0 || 1) == 1, 144*4d7e907cSAndroid Build Coastguard Worker logand1 = (1 && 0) == 0, 145*4d7e907cSAndroid Build Coastguard Worker logand2 = (1 && 1) == 1, 146*4d7e907cSAndroid Build Coastguard Worker logand3 = (0 && 0) == 0, 147*4d7e907cSAndroid Build Coastguard Worker logand4 = (0 && 1) == 0, 148*4d7e907cSAndroid Build Coastguard Worker }; 149*4d7e907cSAndroid Build Coastguard Worker 150*4d7e907cSAndroid Build Coastguard Worker // Tests for enum tags 151*4d7e907cSAndroid Build Coastguard Worker enum NoElements : uint32_t {}; 152*4d7e907cSAndroid Build Coastguard Worker enum OneElement : uint32_t {A}; 153*4d7e907cSAndroid Build Coastguard Worker enum TwoElement : uint32_t {A,B}; 154*4d7e907cSAndroid Build Coastguard Worker enum TwoCollidingElements : uint32_t {A=1,B=1}; 155*4d7e907cSAndroid Build Coastguard Worker enum ThreeFromInheritance : TwoElement {C}; 156*4d7e907cSAndroid Build Coastguard Worker enum ThreeFromDoubleInheritance : ThreeFromInheritance {}; 157*4d7e907cSAndroid Build Coastguard Worker enum ThreeCollidingFromInheritance : TwoCollidingElements {C}; 158*4d7e907cSAndroid Build Coastguard Worker 159*4d7e907cSAndroid Build Coastguard Worker enum EnumTagTest : uint32_t { 160*4d7e907cSAndroid Build Coastguard Worker a = NoElements#len == 0, 161*4d7e907cSAndroid Build Coastguard Worker b = OneElement#len == 1, 162*4d7e907cSAndroid Build Coastguard Worker c = TwoElement#len == 2, 163*4d7e907cSAndroid Build Coastguard Worker d = TwoCollidingElements#len == 2, 164*4d7e907cSAndroid Build Coastguard Worker e = ThreeFromInheritance#len == 3, 165*4d7e907cSAndroid Build Coastguard Worker f = ThreeFromDoubleInheritance#len == 3, 166*4d7e907cSAndroid Build Coastguard Worker g = ThreeCollidingFromInheritance#len == 3, 167*4d7e907cSAndroid Build Coastguard Worker 168*4d7e907cSAndroid Build Coastguard Worker // fine to reference current enum as well 169*4d7e907cSAndroid Build Coastguard Worker h = EnumTagTest#len == 8, 170*4d7e907cSAndroid Build Coastguard Worker }; 171*4d7e907cSAndroid Build Coastguard Worker 172*4d7e907cSAndroid Build Coastguard Worker enum Grayscale : int8_t { 173*4d7e907cSAndroid Build Coastguard Worker WHITE = 126, 174*4d7e907cSAndroid Build Coastguard Worker GRAY, // 127 175*4d7e907cSAndroid Build Coastguard Worker DARK_GRAY, // -128 176*4d7e907cSAndroid Build Coastguard Worker BLACK // -127 177*4d7e907cSAndroid Build Coastguard Worker }; 178*4d7e907cSAndroid Build Coastguard Worker 179*4d7e907cSAndroid Build Coastguard Worker enum Color : Grayscale { 180*4d7e907cSAndroid Build Coastguard Worker RED, // -126 181*4d7e907cSAndroid Build Coastguard Worker RUBY = 0, 182*4d7e907cSAndroid Build Coastguard Worker GREEN, // 1 183*4d7e907cSAndroid Build Coastguard Worker BLUE = 5, 184*4d7e907cSAndroid Build Coastguard Worker CYAN, // 6 185*4d7e907cSAndroid Build Coastguard Worker ORANGE, // 7 186*4d7e907cSAndroid Build Coastguard Worker ROSE = WHITE, 187*4d7e907cSAndroid Build Coastguard Worker }; 188*4d7e907cSAndroid Build Coastguard Worker 189*4d7e907cSAndroid Build Coastguard Worker enum Foo1 : int8_t {}; 190*4d7e907cSAndroid Build Coastguard Worker enum Foo2 : Foo1 {}; 191*4d7e907cSAndroid Build Coastguard Worker enum Foo3 : Foo2 { 192*4d7e907cSAndroid Build Coastguard Worker BAR1, // 0 193*4d7e907cSAndroid Build Coastguard Worker BAR2 = 10, 194*4d7e907cSAndroid Build Coastguard Worker }; 195*4d7e907cSAndroid Build Coastguard Worker enum Foo4 : Foo3 { 196*4d7e907cSAndroid Build Coastguard Worker BAR3, // 11 197*4d7e907cSAndroid Build Coastguard Worker BAR4 = BAR2 + BAR3 // 21 198*4d7e907cSAndroid Build Coastguard Worker }; 199*4d7e907cSAndroid Build Coastguard Worker 200*4d7e907cSAndroid Build Coastguard Worker enum Number : uint8_t { 201*4d7e907cSAndroid Build Coastguard Worker MAX = 255, 202*4d7e907cSAndroid Build Coastguard Worker MAX_PLUS_1, // 0 203*4d7e907cSAndroid Build Coastguard Worker MAX_PLUS_2 // 1 204*4d7e907cSAndroid Build Coastguard Worker }; 205*4d7e907cSAndroid Build Coastguard Worker 206*4d7e907cSAndroid Build Coastguard Worker enum Constants : int32_t { 207*4d7e907cSAndroid Build Coastguard Worker CONST_FOO, 208*4d7e907cSAndroid Build Coastguard Worker CONST_BAR = 70, 209*4d7e907cSAndroid Build Coastguard Worker MAX_ARRAY_SIZE = 20, 210*4d7e907cSAndroid Build Coastguard Worker MAX_ARRAY_SIZE2, 211*4d7e907cSAndroid Build Coastguard Worker MAX_ARRAY_SIZE3 = MAX_ARRAY_SIZE + MAX_ARRAY_SIZE, 212*4d7e907cSAndroid Build Coastguard Worker MY_INT32_MAX_MINUS_1 = 0x7FFFFFFE, 213*4d7e907cSAndroid Build Coastguard Worker MY_INT32_MAX, // 0x7FFFFFFF 214*4d7e907cSAndroid Build Coastguard Worker MY_INT32_MIN, // 0x80000000 215*4d7e907cSAndroid Build Coastguard Worker MY_INT32_MIN_PLUS_1, // 0x80000001 216*4d7e907cSAndroid Build Coastguard Worker }; 217*4d7e907cSAndroid Build Coastguard Worker 218*4d7e907cSAndroid Build Coastguard Worker foo1(int32_t[Constants:CONST_FOO + 1] array); 219*4d7e907cSAndroid Build Coastguard Worker foo2(int32_t[5 + 8] array); 220*4d7e907cSAndroid Build Coastguard Worker foo3(int32_t[Constants:MAX_ARRAY_SIZE] array); 221*4d7e907cSAndroid Build Coastguard Worker}; 222