void updated this revision to Diff 502766. void added a comment. Slight typo
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D144136/new/ https://reviews.llvm.org/D144136 Files: clang/include/clang/Basic/DiagnosticGroups.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaChecking.cpp Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -16232,8 +16232,25 @@ return; Expr::EvalResult Result; - if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) + if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) { + SmallString<128> sizeString; + llvm::raw_svector_ostream OS(sizeString); + + OS << "'"; + IndexExpr->printPretty(OS, nullptr, getPrintingPolicy()); + OS << "'"; + + if (!IsUnboundedArray) + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_array_access) + << 0 << ArrayTy->desugar() << OS.str(); + else + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_unknown_array_access) + << OS.str(); + return; + } llvm::APSInt index = Result.Val.getInt(); if (IndexNegated) { @@ -16348,6 +16365,10 @@ else if (size.getBitWidth() < index.getBitWidth()) size = size.zext(index.getBitWidth()); + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_array_access) + << 1 << ArrayTy->desugar() << toString(index, 10, true); + // For array subscripting the index must be less than size, but for pointer // arithmetic also allow the index (offset) to be equal to size since // computing the next address after the end of the array is legal and Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9450,6 +9450,13 @@ def note_array_declared_here : Note< "array %0 declared here">; +def remark_array_access : Remark< + "accessing %select{fixed|dynamic}0 sized array %1 by %2">, + InGroup<ArrayBoundsRemarks>; +def remark_unknown_array_access : Remark< + "accessing unknown sized array by %0">, + InGroup<ArrayBoundsRemarks>; + def warn_inconsistent_array_form : Warning< "argument %0 of type %1 with mismatched bound">, InGroup<ArrayParameter>, DefaultIgnore; Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -1302,6 +1302,9 @@ def ProfileInstrUnprofiled : DiagGroup<"profile-instr-unprofiled">; def MisExpect : DiagGroup<"misexpect">; +// Array bounds remarks. +def ArrayBoundsRemarks : DiagGroup<"array-bounds">; + // AddressSanitizer frontend instrumentation remarks. def SanitizeAddressRemarks : DiagGroup<"sanitize-address">;
Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -16232,8 +16232,25 @@ return; Expr::EvalResult Result; - if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) + if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) { + SmallString<128> sizeString; + llvm::raw_svector_ostream OS(sizeString); + + OS << "'"; + IndexExpr->printPretty(OS, nullptr, getPrintingPolicy()); + OS << "'"; + + if (!IsUnboundedArray) + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_array_access) + << 0 << ArrayTy->desugar() << OS.str(); + else + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_unknown_array_access) + << OS.str(); + return; + } llvm::APSInt index = Result.Val.getInt(); if (IndexNegated) { @@ -16348,6 +16365,10 @@ else if (size.getBitWidth() < index.getBitWidth()) size = size.zext(index.getBitWidth()); + Context.getDiagnostics().Report( + BaseExpr->getBeginLoc(), diag::remark_array_access) + << 1 << ArrayTy->desugar() << toString(index, 10, true); + // For array subscripting the index must be less than size, but for pointer // arithmetic also allow the index (offset) to be equal to size since // computing the next address after the end of the array is legal and Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9450,6 +9450,13 @@ def note_array_declared_here : Note< "array %0 declared here">; +def remark_array_access : Remark< + "accessing %select{fixed|dynamic}0 sized array %1 by %2">, + InGroup<ArrayBoundsRemarks>; +def remark_unknown_array_access : Remark< + "accessing unknown sized array by %0">, + InGroup<ArrayBoundsRemarks>; + def warn_inconsistent_array_form : Warning< "argument %0 of type %1 with mismatched bound">, InGroup<ArrayParameter>, DefaultIgnore; Index: clang/include/clang/Basic/DiagnosticGroups.td =================================================================== --- clang/include/clang/Basic/DiagnosticGroups.td +++ clang/include/clang/Basic/DiagnosticGroups.td @@ -1302,6 +1302,9 @@ def ProfileInstrUnprofiled : DiagGroup<"profile-instr-unprofiled">; def MisExpect : DiagGroup<"misexpect">; +// Array bounds remarks. +def ArrayBoundsRemarks : DiagGroup<"array-bounds">; + // AddressSanitizer frontend instrumentation remarks. def SanitizeAddressRemarks : DiagGroup<"sanitize-address">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits