diff options
| -rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h | 4 | ||||
| -rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 19 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp | 39 | 
4 files changed, 15 insertions, 57 deletions
| diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index 1ed975f..b5ed003 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -432,10 +432,6 @@ public:    /// 'getMessageForX()' methods to construct a specific message.    virtual std::string getMessage(const ExplodedNode *N); -  /// Prints the ordinal form of the given integer, -  /// only valid for ValNo : ValNo > 0. -  void printOrdinal(unsigned ValNo, llvm::raw_svector_ostream &Out); -    /// Produces the message of the following form:    ///   'Msg via Nth parameter'    virtual std::string getMessageForArg(const Expr *ArgE, unsigned ArgIndex); diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 8065b2d..893eed0 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -15,6 +15,7 @@  #include "clang/Basic/IdentifierTable.h"  #include "clang/Basic/PartialDiagnostic.h"  #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Support/CrashRecoveryContext.h"  #include <cctype> @@ -515,23 +516,7 @@ static void HandleOrdinalModifier(unsigned ValNo,    // We could use text forms for the first N ordinals, but the numeric    // forms are actually nicer in diagnostics because they stand out. -  Out << ValNo; - -  // It is critically important that we do this perfectly for -  // user-written sequences with over 100 elements. -  switch (ValNo % 100) { -  case 11: -  case 12: -  case 13: -    Out << "th"; return; -  default: -    switch (ValNo % 10) { -    case 1: Out << "st"; return; -    case 2: Out << "nd"; return; -    case 3: Out << "rd"; return; -    default: Out << "th"; return; -    } -  } +  Out << ValNo << llvm::getOrdinalSuffix(ValNo);  } diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 3a27d55..4245b5f 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -26,6 +26,7 @@  #include "llvm/ADT/ImmutableMap.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h"  #include <climits>  using namespace clang; @@ -317,13 +318,14 @@ private:          : StackHintGeneratorForSymbol(S, M) {}        virtual std::string getMessageForArg(const Expr *ArgE, unsigned ArgIndex) { +        // Printed parameters start at 1, not 0. +        ++ArgIndex; +          SmallString<200> buf;          llvm::raw_svector_ostream os(buf); -        os << "Reallocation of "; -        // Printed parameters start at 1, not 0. -        printOrdinal(++ArgIndex, os); -        os << " parameter failed"; +        os << "Reallocation of " << ArgIndex << llvm::getOrdinalSuffix(ArgIndex) +           << " parameter failed";          return os.str();        } diff --git a/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index 98a343b..d37ac4a 100644 --- a/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -21,6 +21,7 @@  #include "clang/AST/ParentMap.h"  #include "clang/AST/StmtCXX.h"  #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h"  using namespace clang;  using namespace ento; @@ -947,42 +948,16 @@ std::string StackHintGeneratorForSymbol::getMessage(const ExplodedNode *N){    return getMessageForSymbolNotFound();  } -/// TODO: This is copied from clang diagnostics. Maybe we could just move it to -/// some common place. (Same as HandleOrdinalModifier.) -void StackHintGeneratorForSymbol::printOrdinal(unsigned ValNo, -                                               llvm::raw_svector_ostream &Out) { -  assert(ValNo != 0 && "ValNo must be strictly positive!"); - -  // We could use text forms for the first N ordinals, but the numeric -  // forms are actually nicer in diagnostics because they stand out. -  Out << ValNo; - -  // It is critically important that we do this perfectly for -  // user-written sequences with over 100 elements. -  switch (ValNo % 100) { -  case 11: -  case 12: -  case 13: -    Out << "th"; return; -  default: -    switch (ValNo % 10) { -    case 1: Out << "st"; return; -    case 2: Out << "nd"; return; -    case 3: Out << "rd"; return; -    default: Out << "th"; return; -    } -  } -} -  std::string StackHintGeneratorForSymbol::getMessageForArg(const Expr *ArgE, -                                                        unsigned ArgIndex) { +                                                          unsigned ArgIndex) { +  // Printed parameters start at 1, not 0. +  ++ArgIndex; +    SmallString<200> buf;    llvm::raw_svector_ostream os(buf); -  os << Msg << " via "; -  // Printed parameters start at 1, not 0. -  printOrdinal(++ArgIndex, os); -  os << " parameter"; +  os << Msg << " via " << ArgIndex << llvm::getOrdinalSuffix(ArgIndex) +     << " parameter";    return os.str();  } | 
