================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits