# Part of the Carbon Language project, under the Apache License v2.0 with LLVM # Exceptions. See /LICENSE for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception --- # Get colors when outputting through `bazel build --config=clang-tidy`. UseColor: true # This is necessary for `--config=clang-tidy` to catch errors. WarningsAsErrors: '*' Checks: # We turn on all of a few categories by default. - '-*' - 'bugprone-*' - 'google-*' - 'misc-*' - 'modernize-*' - 'performance-*' - 'readability-*' # Disabled due to the implied style choices. - '-misc-const-correctness' - '-misc-include-cleaner' - '-misc-use-anonymous-namespace' - '-modernize-deprecated-headers' - '-modernize-return-braced-init-list' - '-modernize-use-default-member-init' - '-modernize-use-integer-sign-comparison' - '-modernize-use-emplace' - '-readability-avoid-nested-conditional-operator' - '-readability-convert-member-functions-to-static' - '-readability-else-after-return' - '-readability-identifier-length' - '-readability-implicit-bool-conversion' - '-readability-make-member-function-const' - '-readability-math-missing-parentheses' - '-readability-static-definition-in-anonymous-namespace' - '-readability-trailing-comma' - '-readability-use-anyofallof' # These are copies of older google- prefixed rules that have been moved # out of that prefix, but the google- prefix names still exist as aliases to # these. We enable the google- prefix rules and use those in our NOLINT # expressions, so we disable the newer aliased rules. # # Alias for google-explicit-constructor. - '-misc-explicit-constructor' # Alias for google-readability-casting. - '-modernize-avoid-c-style-cast' # Warns when we have multiple empty cases in switches, which we do for comment # reasons. - '-bugprone-branch-clone' # We use CRTP inheritence widely and across distant areas of the codebase, # which makes maintaining friend lists for the constructors frustrating. - '-bugprone-crtp-constructor-accessibility' # We shadow methods with CRTP, instead of using virtual, such as for Print(). - '-bugprone-derived-method-shadowing-base-method' # Frequently warns on multiple parameters of the same type. - '-bugprone-easily-swappable-parameters' # Finds issues like out-of-memory in main(). We don't use exceptions, so it's # unlikely to find real issues. - '-bugprone-exception-escape' # We have File class types in different namespaces and we forward declare it, # but don't find this to be problematic. - '-bugprone-forward-declaration-namespace' # Doesn't respect `[[clang::enum_extensibility(open)]]`. - '-bugprone-invalid-enum-default-initialization' # Has false positives in places such as using an argument to declare a name, # which cannot have parentheses. For our limited use of macros, this is a # common conflict. - '-bugprone-macro-parentheses' # Conflicts with integer type C++ style. - '-bugprone-narrowing-conversions' # We return const references from value stores. - '-bugprone-return-const-ref-from-parameter' # Complains about reasonable code like `1 << 20` and would push us away from # our integer type C++ style rules. - '-bugprone-signed-bitwise' # Has false positives for `enum_base.h`. Clang's built-in switch warnings # cover most of our risk of bugs here. - '-bugprone-switch-missing-default-case' # In clang-tidy 16, has false positives on code like: # while (auto name_ref = insts().Get(inst_id).TryAs()) { # inst_id = name_ref->value_id; # ^ unchecked access to optional value # } - '-bugprone-unchecked-optional-access' # Overlaps with `readability-function-size`. - '-google-readability-function-size' # Suggests usernames on TODOs, which we don't want. - '-google-readability-todo' # Extremely slow. TODO: Re-enable once # https://github.com/llvm/llvm-project/issues/128797 is fixed. - '-misc-confusable-identifiers' # We use multiple inheritence without virtual extensively. - '-misc-multiple-inheritance' # Overlaps with `-Wno-missing-prototypes`. - '-misc-use-internal-linkage' # Suggests `std::array`, which we could migrate to, but conflicts with the # status quo. - '-modernize-avoid-c-arrays' # Warns on creation of SemIR typed insts, for which we do not currently want # to use designated initialization. - '-modernize-use-designated-initializers' # Only fixes const methods, not non-const, which yields distracting results on # accessors. - '-modernize-use-nodiscard' # We aren't using the ranges library due to performance concerns. - '-modernize-use-ranges' # Low value compared to the engineering cost. - '-performance-enum-size' # Duplicates `modernize-pass-by-value`. - '-performance-unnecessary-value-param' # Warns on enums which use the `LastValue = Value` pattern if all the other # discriminants aren't given an explicit value. - '-readability-enum-initial-value' # Warns too frequently. - '-readability-function-cognitive-complexity' # Allows naming styles we don't use, and has errors on our use of `_1`, `_2` # to have multiple unnamed vars in a destructuring declaration. - '-readability-identifier-naming' # Warns on use of CARBON_KIND() and can't use NOLINT effectively inside a # macro. - '-readability-inconsistent-ifelse-braces' # Warns in reasonably documented situations. - '-readability-magic-numbers' # Warns on `= {}` which is also used to indicate which fields do not need to # be explicitly initialized in aggregate initialization. - '-readability-redundant-member-init' # We generally do want to collapse if statements, and ask for it in review. # But this check ignores when ifs are nested to place comments above/below # the nested if block. And when the outer if block is also initializing a # variable. There are more than a handful of cases where we want to do this, # especially working with LLVM apis like dyn_cast. - '-readability-redundant-nested-if' # Broken, wants to remove parens from `*(p + 1)` and `("Foo" + s).str()`. # TODO: Re-enable once https://github.com/llvm/llvm-project/issues/192435 and # related bugs are fixed. - '-readability-redundant-parentheses' # Warns when callers use similar names as different parameters. - '-readability-suspicious-call-argument' # Low value check, and it's a stylistic choice to use `#if defined(...)` when # paired with `#elif defined(...)`. - '-readability-use-concise-preprocessor-directives' CheckOptions: # Don't warn on structs; done by ignoring when there are only public members. - key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic value: true # CamelCase names. - key: readability-identifier-naming.ClassCase value: CamelCase - key: readability-identifier-naming.ClassConstantCase value: CamelCase - key: readability-identifier-naming.ConstexprVariableCase value: CamelCase - key: readability-identifier-naming.NamespaceCase value: CamelCase # Headers re-open LLVM and Clang namespaces to forward-declare their types, # which is much cheaper to compile than including their headers. - key: readability-identifier-naming.NamespaceIgnoredRegexp value: '^(clang|llvm)$' - key: readability-identifier-naming.StructCase value: CamelCase - key: readability-identifier-naming.TemplateParameterCase value: CamelCase - key: readability-identifier-naming.TypeAliasCase value: CamelCase - key: readability-identifier-naming.TypedefCase value: CamelCase - key: readability-identifier-naming.UnionCase value: CamelCase # lower_case names. - key: readability-identifier-naming.ClassMemberCase value: lower_case - key: readability-identifier-naming.ParameterCase value: lower_case - key: readability-identifier-naming.VariableCase value: lower_case # TODO: This is for explorer's use of LLVM casting support, so we should be # able to remove it once explorer is deleted. - key: readability-identifier-naming.MethodIgnoredRegexp value: '^classof$' # This erroneously fires in C++20 mode with LLVM 16 clang-tidy, due to: # https://github.com/llvm/llvm-project/issues/46097 - key: readability-identifier-naming.TemplateParameterIgnoredRegexp value: '^expr-type$' # Don't require writing a return type on lambdas. - key: modernize-use-trailing-return-type.TransformLambdas value: none # Use lines rather than statements to measure function size, because # for readability purposes we care about the code as written, before # preprocessing. - key: readability-function-size.StatementThreshold value: none - key: readability-function-size.LineThreshold # Chose 800 to match the default for StatementThreshold. value: 800