Files
carbon-lang/.clang-tidy
T
Dana Jansens 4081848d65 Disable new clang-tidy rules with google- prefixed aliases (#7778)
Some `google-` prefixed rules have been renamed to rules without the
prefix. The `google-` prefix still remains as an alias to these new
rules. Since we turn on the `google-` prefix rules and use those in
NOLINT expressions, disable the new aliased names. Otherwise we have to
put both names in NOLINT expressions.
2026-09-12 09:35:03 +00:00

206 lines
8.7 KiB
YAML

# 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<SemIR::NameRef>()) {
# 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