brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.7 KiB · e8588db Raw
224 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.llvm.Conventions \2// RUN:   -std=c++14 -verify  %s3 4#include "Inputs/system-header-simulator-cxx.h"5 6//===----------------------------------------------------------------------===//7// Forward declarations for StringRef tests.8//===----------------------------------------------------------------------===//9 10using size_type = size_t;11 12namespace std {13 14template <class T>15struct numeric_limits { const static bool is_signed; };16 17} // end of namespace std18 19namespace llvm {20 21template <class T>22struct iterator_range;23 24template <class Func>25struct function_ref;26 27struct hash_code;28 29template <class T>30struct SmallVectorImpl;31 32struct APInt;33 34class StringRef {35public:36  static const size_t npos = ~size_t(0);37  using iterator = const char *;38  using const_iterator = const char *;39  using size_type = size_t;40 41  /*implicit*/ StringRef() = default;42  StringRef(std::nullptr_t) = delete;43  /*implicit*/ StringRef(const char *Str);44  /*implicit*/ constexpr StringRef(const char *data, size_t length);45  /*implicit*/ StringRef(const std::string &Str);46 47  static StringRef withNullAsEmpty(const char *data);48  iterator begin() const;49  iterator end() const;50  const unsigned char *bytes_begin() const;51  const unsigned char *bytes_end() const;52  iterator_range<const unsigned char *> bytes() const;53  const char *data() const;54  bool empty() const;55  size_t size() const;56  char front() const;57  char back() const;58  template <typename Allocator>59  StringRef copy(Allocator &A) const;60  bool equals(StringRef RHS) const;61  bool equals_lower(StringRef RHS) const;62  int compare(StringRef RHS) const;63  int compare_lower(StringRef RHS) const;64  int compare_numeric(StringRef RHS) const;65  unsigned edit_distance(StringRef Other, bool AllowReplacements = true,66                         unsigned MaxEditDistance = 0) const;67  std::string str() const;68  char operator[](size_t Index) const;69  template <typename T>70  typename std::enable_if<std::is_same<T, std::string>::value,71                          StringRef>::type &72  operator=(T &&Str) = delete;73  operator std::string() const;74  bool startswith(StringRef Prefix) const;75  bool startswith_lower(StringRef Prefix) const;76  bool endswith(StringRef Suffix) const;77  bool endswith_lower(StringRef Suffix) const;78  size_t find(char C, size_t From = 0) const;79  size_t find_lower(char C, size_t From = 0) const;80  size_t find_if(function_ref<bool(char)> F, size_t From = 0) const;81  size_t find_if_not(function_ref<bool(char)> F, size_t From = 0) const;82  size_t find(StringRef Str, size_t From = 0) const;83  size_t find_lower(StringRef Str, size_t From = 0) const;84  size_t rfind(char C, size_t From = npos) const;85  size_t rfind_lower(char C, size_t From = npos) const;86  size_t rfind(StringRef Str) const;87  size_t rfind_lower(StringRef Str) const;88  size_t find_first_of(char C, size_t From = 0) const;89  size_t find_first_of(StringRef Chars, size_t From = 0) const;90  size_t find_first_not_of(char C, size_t From = 0) const;91  size_t find_first_not_of(StringRef Chars, size_t From = 0) const;92  size_t find_last_of(char C, size_t From = npos) const;93  size_t find_last_of(StringRef Chars, size_t From = npos) const;94  size_t find_last_not_of(char C, size_t From = npos) const;95  size_t find_last_not_of(StringRef Chars, size_t From = npos) const;96  bool contains(StringRef Other) const;97  bool contains(char C) const;98  bool contains_lower(StringRef Other) const;99  bool contains_lower(char C) const;100  size_t count(char C) const;101  size_t count(StringRef Str) const;102  template <typename T>103  typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type104  getAsInteger(unsigned Radix, T &Result) const;105  template <typename T>106  typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type107  getAsInteger(unsigned Radix, T &Result) const;108  template <typename T>109  typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type110  consumeInteger(unsigned Radix, T &Result);111  template <typename T>112  typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type113  consumeInteger(unsigned Radix, T &Result);114  bool getAsInteger(unsigned Radix, APInt &Result) const;115  bool getAsDouble(double &Result, bool AllowInexact = true) const;116  std::string lower() const;117  std::string upper() const;118  StringRef substr(size_t Start, size_t N = npos) const;119  StringRef take_front(size_t N = 1) const;120  StringRef take_back(size_t N = 1) const;121  StringRef take_while(function_ref<bool(char)> F) const;122  StringRef take_until(function_ref<bool(char)> F) const;123  StringRef drop_front(size_t N = 1) const;124  StringRef drop_back(size_t N = 1) const;125  StringRef drop_while(function_ref<bool(char)> F) const;126  StringRef drop_until(function_ref<bool(char)> F) const;127  bool consume_front(StringRef Prefix);128  bool consume_back(StringRef Suffix);129  StringRef slice(size_t Start, size_t End) const;130  std::pair<StringRef, StringRef> split(char Separator) const;131  std::pair<StringRef, StringRef> split(StringRef Separator) const;132  std::pair<StringRef, StringRef> rsplit(StringRef Separator) const;133  void split(SmallVectorImpl<StringRef> &A,134             StringRef Separator, int MaxSplit = -1,135             bool KeepEmpty = true) const;136  void split(SmallVectorImpl<StringRef> &A, char Separator, int MaxSplit = -1,137             bool KeepEmpty = true) const;138  std::pair<StringRef, StringRef> rsplit(char Separator) const;139  StringRef ltrim(char Char) const;140  StringRef ltrim(StringRef Chars = " \t\n\v\f\r") const;141  StringRef rtrim(char Char) const;142  StringRef rtrim(StringRef Chars = " \t\n\v\f\r") const;143  StringRef trim(char Char) const;144  StringRef trim(StringRef Chars = " \t\n\v\f\r") const;145};146 147inline bool operator==(StringRef LHS, StringRef RHS);148inline bool operator!=(StringRef LHS, StringRef RHS);149inline bool operator<(StringRef LHS, StringRef RHS);150inline bool operator<=(StringRef LHS, StringRef RHS);151inline bool operator>(StringRef LHS, StringRef RHS);152inline bool operator>=(StringRef LHS, StringRef RHS);153inline std::string &operator+=(std::string &buffer, StringRef string);154hash_code hash_value(StringRef S);155 156} // end of namespace llvm157 158//===----------------------------------------------------------------------===//159// Tests for StringRef.160//===----------------------------------------------------------------------===//161 162void temporarayStringToStringRefAssignmentTest() {163  // TODO: Emit a warning.164  llvm::StringRef Ref = std::string("Yimmy yummy test.");165}166 167void assigningStringToStringRefWithLongerLifetimeTest() {168  llvm::StringRef Ref;169  {170    // TODO: Emit a warning.171    std::string TmpStr("This is a fine string.");172    Ref = TmpStr;173  }174}175 176std::string getTemporaryString() {177  return "One two three.";178}179 180void assigningTempStringFromFunctionToStringRefTest() {181  // TODO: Emit a warning.182  llvm::StringRef Ref = getTemporaryString();183}184 185//===----------------------------------------------------------------------===//186// Forward declaration for Clang AST nodes.187//===----------------------------------------------------------------------===//188 189namespace llvm {190 191template <class T, int Size>192struct SmallVector {};193 194} // end of namespace llvm195 196namespace clang {197 198struct Type;199struct Decl;200struct Stmt;201struct Attr;202 203} // end of namespace clang204 205//===----------------------------------------------------------------------===//206// Tests for Clang AST nodes.207//===----------------------------------------------------------------------===//208 209namespace clang {210 211struct Type {212  std::string str; // expected-warning{{AST class 'Type' has a field 'str' that allocates heap memory (type std::string)}}213};214 215} // end of namespace clang216 217namespace clang {218 219struct Decl {220  llvm::SmallVector<int, 5> Vec; // expected-warning{{AST class 'Decl' has a field 'Vec' that allocates heap memory (type llvm::SmallVector<int, 5>)}}221};222 223} // end of namespace clang224