# Style or vendor rule sets that do not fit a header-only library:
#   altera-*, fuchsia-*, llvmlibc-*, android-cloexec-fopen, boost-use-ranges, llvm-header-guard,
#   llvm-include-order, llvm-prefer-static-over-anonymous-namespace, llvm-use-ranges,
#   misc-use-anonymous-namespace, google-runtime-float, google-runtime-int, hicpp-signed-bitwise,
#   bugprone-signed-bitwise, hicpp-explicit-conversions, google-explicit-constructor,
#   cppcoreguidelines-explicit-constructor, misc-explicit-constructor (implicit conversions are the
#   API), readability-trailing-comma,
#   hicpp-avoid-goto / cppcoreguidelines-avoid-goto, hicpp-no-array-decay,
#   hicpp-uppercase-literal-suffix, readability-uppercase-literal-suffix, modernize-use-trailing-return-type.
# Constructs the library needs on purpose (the library supports C++11 and legacy compilers):
#   cppcoreguidelines-macro-usage, cppcoreguidelines-avoid-do-while (macros),
#   cppcoreguidelines-pro-bounds-*, cppcoreguidelines-pro-type-reinterpret-cast,
#   cppcoreguidelines-pro-type-union-access (parsers, serializers, basic_json's value union),
#   cppcoreguidelines-avoid-const-or-ref-data-members, cppcoreguidelines-rvalue-reference-param-not-moved,
#   cppcoreguidelines-avoid-non-const-global-variables, misc-non-private-member-variables-in-classes,
#   misc-no-recursion (value walks are recursive, bounded by detail::recursion_depth_limit()),
#   modernize-type-traits, modernize-use-constraints, modernize-use-ranges, modernize-use-std-numbers,
#   modernize-use-designated-initializers, modernize-use-nodiscard, modernize-concat-nested-namespaces,
#   readability-redundant-typename, readability-redundant-parentheses,
#   readability-redundant-access-specifiers, readability-simplify-boolean-expr,
#   readability-use-concise-preprocessor-directives, modernize-use-string-view,
#   modernize-use-integer-sign-comparison (needs std::cmp_less; the flagged
#   static_cast<std::size_t>(end - pos) < n comparisons are deliberate)
#   (all need a newer standard or compiler than C++11, or would change macro-generated or
#   deliberately explicit code).
# Too noisy to be useful (numeric parsing/formatting code, doctest, tests):
#   bugprone-easily-swappable-parameters, cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers,
#   readability-identifier-length, readability-function-cognitive-complexity, performance-enum-size,
#   concurrency-mt-unsafe, misc-confusable-identifiers, misc-include-cleaner (run on its own for
#   the consumer headers in cmake/ci.cmake).
# portability-avoid-pragma-once: kept disabled on purpose. #pragma once is accepted
# by every supported compiler, and tools/amalgamate/amalgamate.py strips it from
# single_include, so there is nothing left to fix here.

Checks: '*,

         -altera-id-dependent-backward-branch,
         -altera-struct-pack-align,
         -altera-unroll-loops,
         -android-cloexec-fopen,
         -boost-use-ranges,
         -bugprone-easily-swappable-parameters,
         -bugprone-signed-bitwise,
         -concurrency-mt-unsafe,
         -cppcoreguidelines-avoid-const-or-ref-data-members,
         -cppcoreguidelines-avoid-do-while,
         -cppcoreguidelines-avoid-goto,
         -cppcoreguidelines-avoid-magic-numbers,
         -cppcoreguidelines-avoid-non-const-global-variables,
         -cppcoreguidelines-explicit-constructor,
         -cppcoreguidelines-macro-usage,
         -cppcoreguidelines-pro-bounds-avoid-unchecked-container-access,
         -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
         -cppcoreguidelines-pro-bounds-constant-array-index,
         -cppcoreguidelines-pro-bounds-pointer-arithmetic,
         -cppcoreguidelines-pro-type-reinterpret-cast,
         -cppcoreguidelines-pro-type-union-access,
         -cppcoreguidelines-rvalue-reference-param-not-moved,
         -fuchsia-default-arguments-calls,
         -fuchsia-default-arguments-declarations,
         -fuchsia-overloaded-operator,
         -google-explicit-constructor,
         -google-runtime-float,
         -google-runtime-int,
         -hicpp-avoid-goto,
         -hicpp-explicit-conversions,
         -hicpp-no-array-decay,
         -hicpp-signed-bitwise,
         -hicpp-uppercase-literal-suffix,
         -llvm-header-guard,
         -llvm-include-order,
         -llvm-prefer-static-over-anonymous-namespace,
         -llvm-use-ranges,
         -llvmlibc-*,
         -misc-use-anonymous-namespace,
         -misc-confusable-identifiers,
         -misc-explicit-constructor,
         -misc-include-cleaner,
         -misc-no-recursion,
         -misc-non-private-member-variables-in-classes,
         -modernize-concat-nested-namespaces,
         -modernize-type-traits,
         -modernize-use-constraints,
         -modernize-use-designated-initializers,
         -modernize-use-integer-sign-comparison,
         -modernize-use-nodiscard,
         -modernize-use-ranges,
         -modernize-use-string-view,
         -modernize-use-std-numbers,
         -modernize-use-trailing-return-type,
         -performance-enum-size,
         -portability-avoid-pragma-once,
         -readability-function-cognitive-complexity,
         -readability-identifier-length,
         -readability-magic-numbers,
         -readability-redundant-access-specifiers,
         -readability-redundant-parentheses,
         -readability-redundant-typename,
         -readability-simplify-boolean-expr,
         -readability-trailing-comma,
         -readability-uppercase-literal-suffix,
         -readability-use-concise-preprocessor-directives'

CheckOptions:
  - key: hicpp-special-member-functions.AllowSoleDefaultDtor
    value: 1
  # clang-tidy 22.1 extended this check to classes and enums; the test files
  # define many such helper types at namespace scope, which is harmless
  - key: misc-use-internal-linkage.AnalyzeTypes
    value: false

WarningsAsErrors: '*'

HeaderFilterRegex: '.*hpp$'
