#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Lex/Lexer.h"
-#include "llvm/Support/raw_ostream.h"
using namespace clang::ast_matchers;
void TwineLocalCheck::check(const MatchFinder::MatchResult &Result) {
const VarDecl *VD = Result.Nodes.getNodeAs<VarDecl>("variable");
auto Diag = diag(VD->getLocation(),
- "twine variables are prone to use after free bugs");
+ "twine variables are prone to use-after-free bugs");
// If this VarDecl has an initializer try to fix it.
if (VD->hasInit()) {
TEMPORARY_FILE=$3.cpp
grep -Ev "// *[A-Z-]+:" ${INPUT_FILE} > ${TEMPORARY_FILE}
-clang-tidy ${TEMPORARY_FILE} -fix --checks="-*,${CHECK_TO_RUN}" -- --std=c++11
+clang-tidy ${TEMPORARY_FILE} -fix --checks="-*,${CHECK_TO_RUN}" -- --std=c++11 > ${TEMPORARY_FILE}.msg 2>&1
FileCheck -input-file=${TEMPORARY_FILE} ${INPUT_FILE} -strict-whitespace
+not grep CHECK-MESSAGES ${INPUT_FILE} || FileCheck -input-file=${TEMPORARY_FILE}.msg ${INPUT_FILE} -check-prefix=CHECK-MESSAGES
-// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
-// RUN: clang-tidy %t.cpp -checks='-*,llvm-twine-local' -fix -- > %t.msg 2>&1
-// RUN: FileCheck -input-file=%t.cpp %s
-// RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s
+// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s llvm-twine-local %t
+// REQUIRES: shell
namespace llvm {
class Twine {
void foo(const Twine &x);
static Twine Moo = Twine("bark") + "bah";
-// CHECK-MASSAGES: twine variables are prone to use after free bugs
+// CHECK-MASSAGES: twine variables are prone to use-after-free bugs
// CHECK-MESSAGES: note: FIX-IT applied suggested code changes
// CHECK: static std::string Moo = (Twine("bark") + "bah").str();
int main() {
const Twine t = Twine("a") + "b" + Twine(42);
-// CHECK-MASSAGES: twine variables are prone to use after free bugs
+// CHECK-MASSAGES: twine variables are prone to use-after-free bugs
// CHECK-MESSAGES: note: FIX-IT applied suggested code changes
// CHECK: std::string t = (Twine("a") + "b" + Twine(42)).str();
foo(Twine("a") + "b");
Twine Prefix = false ? "__INT_FAST" : "__UINT_FAST";
-// CHECK-MASSAGES: twine variables are prone to use after free bugs
+// CHECK-MASSAGES: twine variables are prone to use-after-free bugs
// CHECK-MESSAGES: note: FIX-IT applied suggested code changes
// CHECK: const char * Prefix = false ? "__INT_FAST" : "__UINT_FAST";
}