#!/bin/sh # # Run clang-tidy in fix mode and verify fixes, messages or both. # Usage: # check_clang_tidy.sh \ # [optional clang-tidy arguments] # # Example: # // RUN: $(dirname %s)/check_clang_tidy.sh %s llvm-include-order %t -- -isystem $(dirname %s)/Inputs/Headers # // REQUIRES: shell INPUT_FILE=$1 CHECK_TO_RUN=$2 TEMPORARY_FILE=$3.cpp # Feed the rest arguments to clang-tidy. shift 3 if [ "$#" -eq 0 ] ; then # Default to -- --std=c++11 set - -- --std=c++11 fi set -o errexit if ! grep -q 'CHECK-FIXES\|CHECK-MESSAGES' "${INPUT_FILE}"; then echo "FAIL: Neither CHECK-FIXES nor CHECK-MESSAGES found in the input" exit 1 fi # Remove the contents of the CHECK lines to avoid CHECKs matching on themselves. # We need to keep the comments to preserve line numbers while avoiding empty # lines which could potentially trigger formatting-related checks. sed 's#// *CHECK-[A-Z-]*:.*#//#' "${INPUT_FILE}" > "${TEMPORARY_FILE}" clang-tidy "${TEMPORARY_FILE}" -fix --checks="-*,${CHECK_TO_RUN}" "$@" \ > "${TEMPORARY_FILE}.msg" 2>&1 if grep -q 'CHECK-FIXES' "${INPUT_FILE}"; then FileCheck -input-file="${TEMPORARY_FILE}" "${INPUT_FILE}" \ -check-prefix=CHECK-FIXES -strict-whitespace fi if grep -q 'CHECK-MESSAGES' "${INPUT_FILE}"; then FileCheck -input-file="${TEMPORARY_FILE}.msg" "${INPUT_FILE}" \ -check-prefix=CHECK-MESSAGES -implicit-check-not='{{warning|error}}:' fi