brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.8 KiB · 740bf20 Raw
234 lines · cpp
1// RUN: %check_clang_tidy %s readability-magic-numbers %t \2// RUN: -config='{CheckOptions: \3// RUN:  {readability-magic-numbers.IgnoredIntegerValues: "0;1;2;10;100;", \4// RUN:   readability-magic-numbers.IgnoredFloatingPointValues: "3.14;2.71828;9.81;10000.0;101.0;0x1.2p3", \5// RUN:   readability-magic-numbers.IgnoreBitFieldsWidths: false, \6// RUN:   readability-magic-numbers.IgnorePowersOf2IntegerValues: true, \7// RUN:   readability-magic-numbers.IgnoreTypeAliases: false}}' \8// RUN: --9 10template <typename T, int V>11struct ValueBucket {12  T value[V];13};14 15int BadGlobalInt = 5;16// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: 5 is a magic number; consider replacing it with a named constant [readability-magic-numbers]17 18int IntSquarer(int param) {19  return param * param;20}21 22void BuggyFunction() {23  int BadLocalInt = 6;24  // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 6 is a magic number; consider replacing it with a named constant [readability-magic-numbers]25 26  (void)IntSquarer(7);27  // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: 7 is a magic number; consider replacing it with a named constant [readability-magic-numbers]28 29  int LocalArray[15];30  // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: 15 is a magic number; consider replacing it with a named constant [readability-magic-numbers]31 32  for (int ii = 0; ii < 22; ++ii)33  // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 22 is a magic number; consider replacing it with a named constant [readability-magic-numbers]34  {35    LocalArray[ii] = 3 * ii;36    // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]37  }38 39  ValueBucket<int, 66> Bucket;40  // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: 66 is a magic number; consider replacing it with a named constant [readability-magic-numbers]41}42 43class TwoIntContainer {44public:45  TwoIntContainer(int val) : anotherMember(val * val), yetAnotherMember(6), anotherConstant(val + val) {}46  // CHECK-MESSAGES: :[[@LINE-1]]:73: warning: 6 is a magic number; consider replacing it with a named constant [readability-magic-numbers]47 48  int getValue() const;49 50private:51  int oneMember = 9;52  // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: 9 is a magic number; consider replacing it with a named constant [readability-magic-numbers]53 54  int anotherMember;55 56  int yetAnotherMember;57 58  const int oneConstant = 2;59 60  const int anotherConstant;61};62 63int ValueArray[] = {3, 5, 0, 0, 0};64// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]65// CHECK-MESSAGES: :[[@LINE-2]]:24: warning: 5 is a magic number; consider replacing it with a named constant [readability-magic-numbers]66 67float FloatPiVariable = 3.1415926535f;68// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 3.1415926535f is a magic number; consider replacing it with a named constant [readability-magic-numbers]69double DoublePiVariable = 6.283185307;70// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: 6.283185307 is a magic number; consider replacing it with a named constant [readability-magic-numbers]71 72float SomeFloats[] = {0.5, 0x1.2p4};73// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 0.5 is a magic number; consider replacing it with a named constant [readability-magic-numbers]74// CHECK-MESSAGES: :[[@LINE-2]]:28: warning: 0x1.2p4 is a magic number; consider replacing it with a named constant [readability-magic-numbers]75 76int getAnswer() {77  if (ValueArray[0] < ValueArray[1])78    return ValueArray[1];79 80  return -3; // FILENOTFOUND81  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]82}83 84struct HardwareGateway {85   unsigned int Some: 5;86   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 5 is a magic number; consider replacing it with a named constant [readability-magic-numbers]87   unsigned int Bits: 7;88   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 7 is a magic number; consider replacing it with a named constant [readability-magic-numbers]89   unsigned int: 6;90   // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: 6 is a magic number; consider replacing it with a named constant [readability-magic-numbers]91   unsigned int Flag: 1; // no warning since this is suppressed by IgnoredIntegerValues rule92   unsigned int: 0;      // no warning since this is suppressed by IgnoredIntegerValues rule93   unsigned int Rest: 13;94   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 13 is a magic number; consider replacing it with a named constant [readability-magic-numbers]95   //96   unsigned int Another[3];97   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 3 is a magic number; consider replacing it with a named constant [readability-magic-numbers]98};99 100using NumberInTypeAlias = ValueBucket<int, 25>;101// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: 25 is a magic number; consider replacing it with a named constant [readability-magic-numbers]102typedef ValueBucket<char, 243> NumberInTypedef;103// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: 243 is a magic number; consider replacing it with a named constant [readability-magic-numbers]104 105/*106 * Clean code107 */108 109#define INT_MACRO 5110 111const int GoodGlobalIntConstant = 42;112 113constexpr int AlsoGoodGlobalIntConstant = 42;114 115int InitializedByMacro = INT_MACRO;116 117void SolidFunction() {118  const int GoodLocalIntConstant = 43;119 120  (void)IntSquarer(GoodLocalIntConstant);121 122  int LocalArray[INT_MACRO];123 124  ValueBucket<int, INT_MACRO> Bucket;125}126 127const int ConstValueArray[] = {7, 9};128 129const int ConstValueArray2D[2][2] = {{7, 9}, {13, 15}};130 131/*132 * no warnings for ignored values (specified in the configuration above)133 */134int GrandfatheredIntegerValues[] = {0, 1, 2, 10, 100, -1, -10, -100, 65536};135 136float GrandfatheredFloatValues[] = {3.14f, 3.14, 2.71828, 2.71828f, -1.01E2, 1E4, 0x1.2p3};137 138/*139 * no warnings for enums140 */141enum Smorgasbord {142  STARTER,143  ALPHA = 3,144  BETA = 1 << 5,145};146 147const float FloatPiConstant = 3.1415926535f;148const double DoublePiConstant = 6.283185307;149 150const float Angles[] = {45.0f, 90.0f, 135.0f};151 152double DoubleZeroIsAccepted = 0.0;153float FloatZeroIsAccepted = 0.0f;154 155namespace geometry {156 157template <typename T>158struct Point {159  T x;160  T y;161 162  explicit Point(T xval, T yval) noexcept : x{xval}, y{yval} {163  }164};165 166template <typename T>167struct Dimension {168  T x;169  T y;170 171  explicit Dimension(T xval, T yval) noexcept : x{xval}, y{yval} {172  }173};174 175template <typename T>176struct Rectangle {177  Point<T> origin;178  Dimension<T> size;179  T rotation; // angle of rotation around origin180 181  Rectangle(Point<T> origin_, Dimension<T> size_, T rotation_ = 0) noexcept : origin{origin_}, size{size_}, rotation{rotation_} {182  }183 184  bool contains(Point<T> point) const;185};186 187} // namespace geometry188 189const geometry::Rectangle<double> mandelbrotCanvas{geometry::Point<double>{-2.5, -1}, geometry::Dimension<double>{3.5, 2}};190 191// Simulate the macro magic in Google Test internal headers.192class AssertionHelper {193public:194  AssertionHelper(const char *Message, int LineNumber) : Message(Message), LineNumber(LineNumber) {}195 196private:197  const char *Message;198  int LineNumber;199};200 201#define ASSERTION_HELPER_AT(M, L) AssertionHelper(M, L)202 203#define ASSERTION_HELPER(M) ASSERTION_HELPER_AT(M, __LINE__)204 205void FunctionWithCompilerDefinedSymbol(void) {206  ASSERTION_HELPER("here and now");207}208 209// Prove that integer literals introduced by the compiler are accepted silently.210extern int ConsumeString(const char *Input);211 212const char *SomeStrings[] = {"alpha", "beta", "gamma"};213 214int TestCheckerOverreach() {215  int Total = 0;216 217  for (const auto *Str : SomeStrings) {218    Total += ConsumeString(Str);219  }220 221  return Total;222}223 224// Prove that using enumerations values don't produce warnings.225enum class Letter : unsigned {226    A, B, C, D, E, F, G, H, I, J227};228 229template<Letter x> struct holder  { Letter letter = x;  };230template<Letter x> struct wrapper { using h_type = holder<x>;  };231 232template struct wrapper<Letter::A>;233template struct wrapper<Letter::J>;234