brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · d750800 Raw
192 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-spuriously-wake-up-functions %t -- --2#define NULL 03 4namespace std {5using intmax_t = int;6 7template <intmax_t N, intmax_t D = 1>8class ratio {9public:10  static constexpr intmax_t num = 0;11  static constexpr intmax_t den = 0;12  typedef ratio<num, den> type;13};14typedef ratio<1, 1000> milli;15namespace chrono {16 17template <class Rep, class Period = ratio<1>>18class duration {19public:20  using rep = Rep;21  using period = Period;22 23public:24  constexpr duration() = default;25  template <class Rep2>26  constexpr explicit duration(const Rep2 &r);27  template <class Rep2, class Period2>28  constexpr duration(const duration<Rep2, Period2> &d);29  ~duration() = default;30  duration(const duration &) = default;31};32 33template <class Clock, class Duration = typename Clock::duration>34class time_point {35public:36  using clock = Clock;37  using duration = Duration;38 39public:40  constexpr time_point();41  constexpr explicit time_point(const duration &d);42  template <class Duration2>43  constexpr time_point(const time_point<clock, Duration2> &t);44};45 46using milliseconds = duration<int, milli>;47 48class system_clock {49public:50  typedef milliseconds duration;51  typedef duration::rep rep;52  typedef duration::period period;53  typedef chrono::time_point<system_clock> time_point;54 55  static time_point now() noexcept;56};57} // namespace chrono58 59class mutex;60template <class Mutex>61class unique_lock {62public:63  typedef Mutex mutex_type;64 65  unique_lock() noexcept;66  explicit unique_lock(mutex_type &m);67};68 69class mutex {70public:71  constexpr mutex() noexcept;72  ~mutex();73  mutex(const mutex &) = delete;74  mutex &operator=(const mutex &) = delete;75};76 77enum class cv_status {78  no_timeout,79  timeout80};81 82class condition_variable {83public:84  condition_variable();85  ~condition_variable();86  condition_variable(const condition_variable &) = delete;87 88  void wait(unique_lock<mutex> &lock);89  template <class Predicate>90  void wait(unique_lock<mutex> &lock, Predicate pred);91  template <class Clock, class Duration>92  cv_status wait_until(unique_lock<mutex> &lock,93                       const chrono::time_point<Clock, Duration> &abs_time){ return cv_status::no_timeout; };94  template <class Clock, class Duration, class Predicate>95  bool wait_until(unique_lock<mutex> &lock,96                  const chrono::time_point<Clock, Duration> &abs_time,97                  Predicate pred){ return false; };98  template <class Rep, class Period>99  cv_status wait_for(unique_lock<mutex> &lock,100                     const chrono::duration<Rep, Period> &rel_time){ return cv_status::no_timeout; };101  template <class Rep, class Period, class Predicate>102  bool wait_for(unique_lock<mutex> &lock,103                const chrono::duration<Rep, Period> &rel_time,104                Predicate pred){ return false; };105};106 107} // namespace std108 109struct Node1 {110  void *Node1;111  struct Node1 *next;112};113 114static Node1 list;115static std::mutex m;116static std::condition_variable condition;117 118void consume_list_element(std::condition_variable &condition) {119  std::unique_lock<std::mutex> lk(m);120 121  if (list.next == nullptr) {122    condition.wait(lk);123    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: 'wait' should be placed inside a while statement or used with a conditional parameter [bugprone-spuriously-wake-up-functions]124  }125 126  while (list.next == nullptr) {127    condition.wait(lk);128  }129 130  do {131    condition.wait(lk);132  } while (list.next == nullptr);133 134  for (;; list.next == nullptr) {135    condition.wait(lk);136  }137 138  if (list.next == nullptr) {139    while (list.next == nullptr) {140      condition.wait(lk);141    }142  }143 144  if (list.next == nullptr) {145    do {146      condition.wait(lk);147    } while (list.next == nullptr);148  }149 150  if (list.next == nullptr) {151    for (;; list.next == nullptr) {152      condition.wait(lk);153    }154  }155  using durtype = std::chrono::duration<int, std::milli>;156  durtype dur = std::chrono::duration<int, std::milli>();157  if (list.next == nullptr) {158    condition.wait_for(lk, dur);159    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: 'wait_for' should be placed inside a while statement or used with a conditional parameter [bugprone-spuriously-wake-up-functions]160  }161  if (list.next == nullptr) {162    condition.wait_for(lk, dur, [] { return 1; });163  }164  while (list.next == nullptr) {165    condition.wait_for(lk, dur);166  }167  do {168    condition.wait_for(lk, dur);169  } while (list.next == nullptr);170  for (;; list.next == nullptr) {171    condition.wait_for(lk, dur);172  }173 174  auto now = std::chrono::system_clock::now();175  if (list.next == nullptr) {176    condition.wait_until(lk, now);177    // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: 'wait_until' should be placed inside a while statement or used with a conditional parameter [bugprone-spuriously-wake-up-functions]178  }179  if (list.next == nullptr) {180    condition.wait_until(lk, now, [] { return 1; });181  }182  while (list.next == nullptr) {183    condition.wait_until(lk, now);184  }185  do {186    condition.wait_until(lk, now);187  } while (list.next == nullptr);188  for (;; list.next == nullptr) {189    condition.wait_until(lk, now);190  }191}192