[clang-tools-extra] [clang-tidy] support pointee mutation check in misc-const-correctness (PR #130494)
Baranov Victor via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 11 10:42:00 PDT 2025
================
@@ -145,64 +165,90 @@ void ConstCorrectnessCheck::check(const MatchFinder::MatchResult &Result) {
if (ArrayT->getElementType()->isPointerType())
VC = VariableCategory::Pointer;
- // Each variable can only be in one category: Value, Pointer, Reference.
- // Analysis can be controlled for every category.
- if (VC == VariableCategory::Reference && !AnalyzeReferences)
- return;
-
- if (VC == VariableCategory::Reference &&
- Variable->getType()->getPointeeType()->isPointerType() &&
- !WarnPointersAsValues)
- return;
-
- if (VC == VariableCategory::Pointer && !WarnPointersAsValues)
- return;
-
- if (VC == VariableCategory::Value && !AnalyzeValues)
- return;
-
- // The scope is only registered if the analysis shall be run.
- registerScope(LocalScope, Result.Context);
-
- // Offload const-analysis to utility function.
- if (ScopesCache[LocalScope]->isMutated(Variable))
- return;
-
- auto Diag = diag(Variable->getBeginLoc(),
- "variable %0 of type %1 can be declared 'const'")
- << Variable << Variable->getType();
- if (IsNormalVariableInTemplate)
- TemplateDiagnosticsCache.insert(Variable->getBeginLoc());
+ auto CheckValue = [&]() {
+ // The scope is only registered if the analysis shall be run.
+ registerScope(LocalScope, Result.Context);
+
+ // Offload const-analysis to utility function.
+ if (ScopesCache[LocalScope]->isMutated(Variable))
+ return;
+
+ auto Diag = diag(Variable->getBeginLoc(),
+ "variable %0 of type %1 can be declared 'const'")
+ << Variable << VT;
+ if (IsNormalVariableInTemplate)
+ TemplateDiagnosticsCache.insert(Variable->getBeginLoc());
+ if (!CanBeFixIt)
+ return;
+ using namespace utils::fixit;
+ if (VC == VariableCategory::Value && TransformValues) {
+ Diag << addQualifierToVarDecl(*Variable, *Result.Context,
+ Qualifiers::Const, QualifierTarget::Value,
+ QualifierPolicy::Right);
+ // FIXME: Add '{}' for default initialization if no user-defined default
+ // constructor exists and there is no initializer.
+ return;
+ }
- const auto *VarDeclStmt = Result.Nodes.getNodeAs<DeclStmt>("decl-stmt");
+ if (VC == VariableCategory::Reference && TransformReferences) {
+ Diag << addQualifierToVarDecl(*Variable, *Result.Context,
+ Qualifiers::Const, QualifierTarget::Value,
+ QualifierPolicy::Right);
+ return;
+ }
- // It can not be guaranteed that the variable is declared isolated, therefore
- // a transformation might effect the other variables as well and be incorrect.
- if (VarDeclStmt == nullptr || !VarDeclStmt->isSingleDecl())
- return;
+ if (VC == VariableCategory::Pointer && TransformPointersAsValues) {
+ Diag << addQualifierToVarDecl(*Variable, *Result.Context,
+ Qualifiers::Const, QualifierTarget::Value,
+ QualifierPolicy::Right);
+ return;
+ }
+ };
+
+ auto CheckPointee = [&]() {
+ assert(VC == VariableCategory::Pointer);
+ registerScope(LocalScope, Result.Context);
+ if (ScopesCache[LocalScope]->isPointeeMutated(Variable))
+ return;
+ auto Diag = diag(Variable->getBeginLoc(),
+ "variable %0 of type %1 can be declared 'const'")
----------------
vbvictor wrote:
According to https://github.com/llvm/llvm-project/pull/130494#discussion_r1989825168.
I'd suggest a wording _"pointee of variable %0 of type %1 can be declared 'const'"_, but I'm not sure 100%.
Maybe we can dump pointee type as a `%1` parameter, not the variable type itself.
https://github.com/llvm/llvm-project/pull/130494
More information about the cfe-commits
mailing list