1 // RUN: clang-tidy %s -checks='-*,hicpp-signed-bitwise' -- -std=c++11 2 // FIXME: Make the test work in all language modes. 3 4 #include "hicpp-signed-bitwise-standard-types.h" 5 pure_bitmask_types()6void pure_bitmask_types() { 7 // std::locale::category 8 int SResult = 0; 9 std::locale::category C = std::locale::category::ctype; 10 11 SResult = std::locale::category::none | std::locale::category::collate; 12 SResult|= std::locale::category::collate; 13 SResult = std::locale::category::ctype & std::locale::category::monetary; 14 SResult&= std::locale::category::monetary; 15 SResult = std::locale::category::numeric ^ std::locale::category::time; 16 SResult^= std::locale::category::time; 17 SResult = std::locale::category::messages | std::locale::category::all; 18 19 SResult = std::locale::category::all & C; 20 SResult&= std::locale::category::all; 21 SResult = std::locale::category::all | C; 22 SResult|= std::locale::category::all; 23 SResult = std::locale::category::all ^ C; 24 SResult^= std::locale::category::all; 25 26 // std::ctype_base::mask 27 std::ctype_base::mask M = std::ctype_base::mask::punct; 28 29 SResult = std::ctype_base::mask::space | std::ctype_base::mask::print; 30 SResult = std::ctype_base::mask::cntrl & std::ctype_base::mask::upper; 31 SResult = std::ctype_base::mask::lower ^ std::ctype_base::mask::alpha; 32 SResult|= std::ctype_base::mask::digit | std::ctype_base::mask::punct; 33 SResult&= std::ctype_base::mask::xdigit & std::ctype_base::mask::alnum; 34 SResult^= std::ctype_base::mask::alnum ^ std::ctype_base::mask::graph; 35 36 SResult&= std::ctype_base::mask::space & M; 37 SResult|= std::ctype_base::mask::space | M; 38 SResult^= std::ctype_base::mask::space ^ M; 39 40 // std::ios_base::fmtflags 41 std::ios_base::fmtflags F = std::ios_base::fmtflags::floatfield; 42 43 SResult = std::ios_base::fmtflags::dec | std::ios_base::fmtflags::oct; 44 SResult = std::ios_base::fmtflags::hex & std::ios_base::fmtflags::basefield; 45 SResult = std::ios_base::fmtflags::left ^ std::ios_base::fmtflags::right; 46 SResult|= std::ios_base::fmtflags::internal | std::ios_base::fmtflags::adjustfield; 47 SResult&= std::ios_base::fmtflags::scientific & std::ios_base::fmtflags::fixed; 48 SResult^= std::ios_base::fmtflags::floatfield ^ std::ios_base::fmtflags::boolalpha; 49 SResult = std::ios_base::fmtflags::showbase | std::ios_base::fmtflags::showpoint; 50 SResult = std::ios_base::fmtflags::showpos & std::ios_base::fmtflags::skipws; 51 SResult = std::ios_base::fmtflags::unitbuf ^ std::ios_base::fmtflags::uppercase; 52 53 SResult|= std::ios_base::fmtflags::unitbuf | F; 54 SResult&= std::ios_base::fmtflags::unitbuf & F; 55 SResult^= std::ios_base::fmtflags::unitbuf ^ F; 56 57 // std::ios_base::iostate 58 std::ios_base::iostate S = std::ios_base::iostate::goodbit; 59 60 SResult^= std::ios_base::iostate::goodbit | std::ios_base::iostate::badbit; 61 SResult|= std::ios_base::iostate::failbit & std::ios_base::iostate::eofbit; 62 SResult&= std::ios_base::iostate::failbit ^ std::ios_base::iostate::eofbit; 63 64 SResult = std::ios_base::iostate::goodbit | S; 65 SResult = std::ios_base::iostate::goodbit & S; 66 SResult = std::ios_base::iostate::goodbit ^ S; 67 68 // std::ios_base::openmode 69 std::ios_base::openmode B = std::ios_base::openmode::binary; 70 71 SResult = std::ios_base::openmode::app | std::ios_base::openmode::binary; 72 SResult = std::ios_base::openmode::in & std::ios_base::openmode::out; 73 SResult = std::ios_base::openmode::trunc ^ std::ios_base::openmode::ate; 74 75 SResult&= std::ios_base::openmode::trunc | B; 76 SResult^= std::ios_base::openmode::trunc & B; 77 SResult|= std::ios_base::openmode::trunc ^ B; 78 } 79 still_forbidden()80void still_forbidden() { 81 // std::locale::category 82 unsigned int UResult = 0u; 83 int SResult = 0; 84 85 SResult = std::ctype_base::mask::print ^ 8u; 86 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 87 SResult = std::ctype_base::mask::cntrl | 8; 88 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 89 SResult = std::ctype_base::mask::upper & 8; 90 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 91 SResult = std::ctype_base::mask::lower ^ -8; 92 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 93 94 // Staying within the allowed standard types is ok for bitwise assignment 95 // operations. 96 std::ctype_base::mask var = std::ctype_base::mask::print; 97 SResult<<= std::ctype_base::mask::upper; 98 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 99 SResult>>= std::ctype_base::mask::upper; 100 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 101 SResult &= std::ctype_base::mask::upper; 102 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 103 SResult |= std::ctype_base::mask::upper; 104 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 105 SResult ^= std::ctype_base::mask::upper; 106 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 107 108 UResult = std::locale::category::collate << 1u; 109 UResult = std::locale::category::ctype << 1; 110 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 111 UResult = std::locale::category::monetary >> 1u; 112 UResult = std::locale::category::numeric >> 1; 113 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 114 115 UResult = ~std::locale::category::messages; 116 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 117 SResult = ~std::locale::category::all; 118 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 119 120 // std::ctype_base::mask 121 UResult = std::ctype_base::mask::space | 8; 122 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 123 UResult = std::ctype_base::mask::print & 8u; 124 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 125 UResult = std::ctype_base::mask::cntrl ^ -8; 126 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 127 128 UResult = std::ctype_base::mask::upper << 1; 129 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 130 UResult = std::ctype_base::mask::lower << 1u; 131 UResult = std::ctype_base::mask::alpha >> 1u; 132 UResult = std::ctype_base::mask::digit >> 1u; 133 134 UResult = ~std::ctype_base::mask::punct; 135 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 136 SResult = ~std::ctype_base::mask::xdigit; 137 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 138 139 // std::ios_base::fmtflags 140 UResult = std::ios_base::fmtflags::dec | 1; 141 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 142 UResult = std::ios_base::fmtflags::oct & 1u; 143 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 144 UResult = std::ios_base::fmtflags::hex ^ -1; 145 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 146 147 UResult = std::ios_base::fmtflags::basefield >> 1; 148 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 149 UResult = std::ios_base::fmtflags::left >> 1u; 150 UResult = std::ios_base::fmtflags::right << 1; 151 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 152 UResult = std::ios_base::fmtflags::internal << 1u; 153 154 UResult = ~std::ios_base::fmtflags::adjustfield; 155 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 156 SResult = ~std::ios_base::fmtflags::scientific; 157 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 158 159 // std::ios_base::iostate 160 UResult = std::ios_base::iostate::goodbit | 8; 161 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 162 UResult = std::ios_base::iostate::badbit & 8u; 163 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 164 UResult = std::ios_base::iostate::failbit ^ -8; 165 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 166 167 UResult = std::ios_base::iostate::eofbit << 1; 168 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 169 UResult = std::ios_base::iostate::goodbit << 1u; 170 UResult = std::ios_base::iostate::badbit >> 1; 171 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 172 UResult = std::ios_base::iostate::failbit >> 1u; 173 174 UResult = ~std::ios_base::iostate::eofbit; 175 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 176 SResult = ~std::ios_base::iostate::goodbit; 177 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 178 179 // std::ios_base::openmode 180 UResult = std::ios_base::app | 8; 181 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 182 UResult = std::ios_base::binary & 8u; 183 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 184 UResult = std::ios_base::in ^ -8; 185 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 186 187 UResult = std::ios_base::out >> 1; 188 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 189 UResult = std::ios_base::trunc >> 1u; 190 UResult = std::ios_base::ate << 1; 191 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator 192 UResult = std::ios_base::ate << 1u; 193 194 UResult = ~std::ios_base::openmode::app; 195 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 196 SResult = ~std::ios_base::openmode::binary; 197 // CHECK-MESSAGES: [[@LINE-1]]:13: warning: use of a signed integer operand with a unary bitwise operator 198 } 199