# To run clang-tidy from CMake, build ClickHouse with -DENABLE_CLANG_TIDY=1. To show all warnings, it is
# recommended to pass "-k0" to Ninja.

# Enable all checks + disable selected checks. Feel free to remove disabled checks from below list if
# a) the new check is not controversial (this includes many checks in readability-* and google-*) or
# b) too noisy (checks with > 100 new warnings are considered noisy, this includes e.g. cppcoreguidelines-*).

HeaderFilterRegex: '^.*/(base|src|programs|utils)/.*(h|hpp)$'

Checks: [
  '*',

  '-abseil-*',

  '-altera-*',

  '-android-*',

  '-bugprone-assignment-in-if-condition',
  '-bugprone-branch-clone',
  '-bugprone-easily-swappable-parameters',
  '-bugprone-exception-escape',
  '-bugprone-forward-declaration-namespace',
  '-bugprone-implicit-widening-of-multiplication-result',
  '-bugprone-multi-level-implicit-pointer-conversion',
  '-bugprone-narrowing-conversions',
  '-bugprone-not-null-terminated-result',
  '-bugprone-reserved-identifier', # useful but too slow, TODO retry when https://reviews.llvm.org/rG1c282052624f9d0bd273bde0b47b30c96699c6c7 is merged
  '-bugprone-unchecked-optional-access',
  '-bugprone-crtp-constructor-accessibility',
  '-bugprone-suspicious-stringview-data-usage',

  '-cert-dcl16-c',
  '-cert-dcl37-c',
  '-cert-dcl51-cpp',
  '-cert-err58-cpp',
  '-cert-msc32-c',
  '-cert-msc51-cpp',
  '-cert-oop54-cpp',
  '-cert-oop57-cpp',
  '-cert-err33-c', # Misreports on clang-19: it warns about all functions containing 'remove' in the name, not only about the standard library.

  '-clang-analyzer-optin.performance.Padding',

  '-clang-analyzer-unix.Malloc',

  '-cppcoreguidelines-*', # impractical in a codebase as large as ClickHouse, also slow

  '-darwin-*',

  '-fuchsia-*',

  '-google-build-using-namespace',
  '-google-readability-braces-around-statements',
  '-google-readability-casting',
  '-google-readability-function-size',
  '-google-readability-namespace-comments',
  '-google-readability-todo',

  '-hicpp-avoid-c-arrays',
  '-hicpp-avoid-goto',
  '-hicpp-braces-around-statements',
  '-hicpp-explicit-conversions',
  '-hicpp-function-size',
  '-hicpp-member-init',
  '-hicpp-move-const-arg',
  '-hicpp-multiway-paths-covered',
  '-hicpp-named-parameter',
  '-hicpp-no-array-decay',
  '-hicpp-no-assembler',
  '-hicpp-no-malloc',
  '-hicpp-signed-bitwise',
  '-hicpp-special-member-functions',
  '-hicpp-uppercase-literal-suffix',
  '-hicpp-use-auto',
  '-hicpp-use-emplace',
  '-hicpp-vararg',

  '-linuxkernel-*',

  '-llvm-*',

  '-llvmlibc-*',

  '-openmp-*',

  '-misc-const-correctness',
  '-misc-include-cleaner', # useful but far too many occurrences
  '-misc-no-recursion',
  '-misc-non-private-member-variables-in-classes',
  '-misc-confusable-identifiers', # useful but slooo
  '-misc-use-anonymous-namespace',

  '-modernize-avoid-c-arrays',
  '-modernize-concat-nested-namespaces',
  '-modernize-macro-to-enum',
  '-modernize-pass-by-value',
  '-modernize-return-braced-init-list',
  '-modernize-use-auto',
  '-modernize-use-constraints', # This is a good check, but clang-tidy crashes, see https://github.com/llvm/llvm-project/issues/91872
  '-modernize-use-default-member-init',
  '-modernize-use-emplace',
  '-modernize-use-nodiscard',
  '-modernize-use-trailing-return-type',
  '-modernize-use-designated-initializers',

  '-performance-enum-size',
  '-performance-inefficient-string-concatenation',
  '-performance-no-int-to-ptr',
  '-performance-avoid-endl',
  '-performance-unnecessary-value-param',

  '-portability-simd-intrinsics',

  '-readability-avoid-nested-conditional-operator',
  '-readability-avoid-unconditional-preprocessor-if',
  '-readability-braces-around-statements',
  '-readability-convert-member-functions-to-static',
  '-readability-else-after-return',
  '-readability-function-cognitive-complexity',
  '-readability-function-size',
  '-readability-identifier-length',
  '-readability-identifier-naming', # useful but too slow
  '-readability-implicit-bool-conversion',
  '-readability-isolate-declaration',
  '-readability-magic-numbers',
  '-readability-named-parameter',
  '-readability-redundant-declaration',
  '-readability-redundant-inline-specifier', # useful but incompatible with __attribute((always_inline))__ (aka. ALWAYS_INLINE, base/base/defines.h).
        # ALWAYS_INLINE only has an effect if combined with `inline`: https://godbolt.org/z/Eefd74qdM
  '-readability-redundant-member-init', # Useful but triggers another problem. Imagine a struct S with multiple String members. Structs are often instantiated via designated
        # initializer S s{.s1 = [...], .s2 = [...], [...]}. In this case, compiler warning `missing-field-initializers` requires to specify all members which are not in-struct
        # initialized (example: s1 in struct S { String s1; String s2{};}; is not in-struct initialized, therefore it must be specified at instantiation time). As explicitly
        # specifying all members is tedious for large structs, `missing-field-initializers` makes programmers initialize as many members as possible in-struct. Clang-tidy
        # warning `readability-redundant-member-init` does the opposite thing, both are not compatible with each other.
  '-readability-simplify-boolean-expr',
  '-readability-suspicious-call-argument',
  '-readability-uppercase-literal-suffix',
  '-readability-use-anyofallof',

  '-zircon-*'
]

WarningsAsErrors: '*'

ExtraArgs:
# clang-tidy 17 started to complain (for unknown reasons) that various pragmas are unknown ("clang-diagnostic-unknown-pragmas").
# This is technically a compiler error, not a clang-tidy error. We could litter the code base with more pragmas that suppress
# this error but it is better to pass the following flag to the compiler:
- '-Wno-unknown-pragmas'
- '-Wno-unused-command-line-argument' # similar issue

CheckOptions:
  readability-identifier-naming.ClassCase: CamelCase
  readability-identifier-naming.EnumCase: CamelCase
  readability-identifier-naming.LocalVariableCase: lower_case
  readability-identifier-naming.StaticConstantCase: aNy_CasE
  readability-identifier-naming.MemberCase: lower_case
  readability-identifier-naming.PrivateMemberPrefix: ''
  readability-identifier-naming.ProtectedMemberPrefix: ''
  readability-identifier-naming.PublicMemberCase: lower_case
  readability-identifier-naming.MethodCase: camelBack
  readability-identifier-naming.PrivateMethodPrefix: ''
  readability-identifier-naming.ProtectedMethodPrefix: ''
  readability-identifier-naming.ParameterPackCase: lower_case
  readability-identifier-naming.StructCase: CamelCase
  readability-identifier-naming.TemplateTemplateParameterCase: CamelCase
  readability-identifier-naming.TemplateParameterCase: lower_case
  readability-identifier-naming.TypeTemplateParameterCase: CamelCase
  readability-identifier-naming.TypedefCase: CamelCase
  readability-identifier-naming.UnionCase: CamelCase
  modernize-loop-convert.UseCxx20ReverseRanges: false
  performance-move-const-arg.CheckTriviallyCopyableMove: false
  # Workaround clang-tidy bug: https://github.com/llvm/llvm-project/issues/46097
  readability-identifier-naming.TypeTemplateParameterIgnoredRegexp: expr-type
  cppcoreguidelines-avoid-do-while.IgnoreMacros: true