blob: 21fbb552ada7e37bbed8a1343e180a942ddac34c [file] [log] [blame] [view]
# C++ Style Changes
*The following policy was approved by Chrome ATLs.*
## Purpose
Style decisions should lead to a better product: a safer codebase, more
productive engineers, fewer bugs. Decisions should promote these outcomes, not
pursue merely theoretical benefit. Decisions or policies (including this one)
found to be detrimental to them can and will be revisited.
## Scope
C++ style decisions include anything in the
[Chromium C++ style guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++.md)
or
[C++ allowed features doc](https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++-features.md),
as well as meaningful changes to the
[Google C++ style guide](https://google.github.io/styleguide/cppguide.html) to
the degree cxx@ becomes aware of them. Not included are minor shifts in
clang-format behavior from roll to roll (e.g. due to bugfixes). In practice, the
majority of the decisions here are around allowing or banning newer C++
features, or dealing with significant stylistic shifts like allowing mutable
reference parameters.
Changes with large functional impact (e.g. banning pointer arithmetic) are not
just style questions but have technical concerns and migration plans that must
be discussed elsewhere, e.g. with ATLs. This policy doesn't grant cxx@ (or any
other group) the right to impose unbounded technical cost.
## Authority
C++ style decisions for Chromium are made by rough consensus of the
[cxx@](mailto:cxx@chromium.org) mailing list. Unanimity is not necessary, but if
clear consensus is not reachable, decisions should be escalated to the
[Chrome ATLs](mailto:chrome-atls@google.com).
cxx@ is a moderated list, but only for the purpose of avoiding spam; all
Chromium contributors are welcome to join and opine regardless of perceived C++
expertise. Discussions take place here, not on the general chromium-dev@ list,
to limit visibility to those who express interest.
List members are encouraged to opine (even with simple "I agree" comments) to
make consensus (or lack thereof) clear. If a proposal has few objections but
also few assents, its value looks questionable. If possible, strive for at least
three "LGTM"-type comments on proposals (in addition to waiting for sufficient
time for objections to surface) before declaring an issue to have achieved
consensus.
If possible, any postmortem that includes fallout from a style change should
include contributions from the folks who proposed/approved/authored that change.
Since cxx@ members are fellow developers, be gracious around violations of the
policies here or elsewhere; in most cases, the right first step to addressing
them is to raise a thread on cxx@ describing the problem. The
[community@](mailto:community@chromium.org) mailing list and ATLs are good
alternate contacts or escalation points for personal or technical issues,
respectively.
## Relationship to Google Style
As the
[Chromium C++ style guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++.md)
states, Chromium style is based on Google style, so in the absence of explicit
guidance otherwise, Google style rules apply.
However, such exceptions do exist, and cxx@ may change and add to them. Common
justifications to diverge from Google's (internally-focused) guidance include:
* Different build environment (greater emphasis on compile time costs)
* Different running environment (different types of security concerns)
* Open source, with many external contributors (tech islands have a higher
penalty)
* Fewer automated refactoring tools (automated refactorability is less valuable)
* Smaller, more focused codebase (can ignore some types of theoretical use or
misuse)
At the same time, be mindful that:
* Exceptions have a cognitive cost, and like all style rules, should
["pull their weight"](https://google.github.io/styleguide/cppguide.html#Goals)
* Google style arbiters are experienced and draw from a large codebase, so their
decisions should not be discarded lightly
## Enforcement
Where feasible, style rules should be checked (better yet, automatically
implemented) via tooling. For example, we should strive to implement PRESUBMIT
checks (or similar) to prevent use of banned features. Changes that extend or
improve such automation, or tell authors how to comply in a more convenient way
(e.g. instructions to integrate clang-format with popular editors) are welcome.
Changes should not knowingly violate the style guide (even with local OWNER
approval) without at least raising a cxx@ thread about the issue (if for no
other reason than so that list can bless the use and consider changing the style
rules to formally allow it). This includes changes that do not ensure their
modifications are clang-format clean. If author and reviewers agree that an
exception is warranted while cxx@ discussion is ongoing, such changes may land
without blocking on the outcome, with the caveat that cxx@ may later require
them to be rolled back or reworked.
Subtree OWNERS may impose additional local style requirements (but not
exceptions to the global rules) if they do not impose surprising burdens on
contributions. Such requirements should be clearly documented and (ideally)
enforced via tooling of their own.
## Consistency
When style rules change, consider whether to update existing code. The goal of
such updates should be to maximize clarity and velocity. Use the following principles:
* Do the right thing going forward: assume the codebase will be long-lived, so
the total value of small but ongoing benefits is large
* Reduce discussion: updating is more valuable if it is likely to prevent lots
of future discussion and debate on code reviews
Lower priorities are worth considering, and it's reasonable to delay for short
times to achieve them, but should not indefinitely block higher ones.
Given Chromium's current tooling, hindering blame trawling is a significant
concern. However, the challenges here are not specific to style issues, so while
important, they should be thoughtfully considered, not treated as hard blockers.
A continual trickle of unrelated changes over years may be more disruptive on
net than a single LSC, and certainly cannot be skipped via
`.git-blame-ignore-revs`.
Subtree OWNERS are welcome (indeed, encouraged) to update code to comply with
(and enforce) new style rules more rapidly than is happening for the codebase as
a whole.
## LSCs
Large-scale changes to update code for style changes may use the
[LSC process](https://chromium.googlesource.com/chromium/src/+/main/docs/process/lsc/large_scale_changes.md)
if it's beneficial, but are not required to. The process is designed to vet
proposals for merit (which cxx@ consensus can judge in these cases) and bestow
OO+1 powers to global approvers where needed (which many cxx@ members already
have). Thus in most cases this would just be extra overhead.
If possible, style-change LSCs should aim to fully land in a short time window
(a few days or less) so committers can fix merge failures all at once. Any LSCs
that need to close the tree should be landed over weekends or holidays.
## Communications
Mailing cxx@ with a proposal is sufficient to request a change to either Chrome
style or the
[C++ allowed features list](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++-features.md).
Most proposals are discussed fairly actively, and reach consensus fairly
quickly. However, if there aren't many replies or discussion stalls without
unaddressed objections, feel free to request an explicit decision, and provide a
reasonable timeframe (generally one calendar week during non-holiday periods)
after which the request can be considered tacitly approved.
At least quarterly, if there are any changes to style rules (including allowed
C++ features), someone from cxx@ should summarize after-the-fact in an email to
chromium-dev@.
Pre-announcing changes or LSCs should be rare. chromium-dev@ has 83000+ members;
polling or even notifying it is usually more cost than benefit. For
exceptionally disruptive changes that deserve notification (exact definition up
to cxx@ discretion), announce at least two weeks in advance, linking to an
explainer doc with a scheduled date and a contact point for concerns and
escalations.