-
Notifications
You must be signed in to change notification settings - Fork 15k
[clang-tidy] Improve bugprone-unused-return-value check #66573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
PiotrZSL
merged 3 commits into
llvm:main
from
nokia:66570-clang-tidy-bugprone-unused-return-value-shouldnt-encourage-to-suppress-issue-with-casting-to-void
Oct 26, 2023
Merged
[clang-tidy] Improve bugprone-unused-return-value check #66573
PiotrZSL
merged 3 commits into
llvm:main
from
nokia:66570-clang-tidy-bugprone-unused-return-value-shouldnt-encourage-to-suppress-issue-with-casting-to-void
Oct 26, 2023
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|
@llvm/pr-subscribers-clang-tidy ChangesImprove diagnostic message to be more straight forward, fix handling of Closes #66570Patch is 23.93 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/66573.diff 9 Files Affected:
diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
index bdc601c2445f5e6..6bc9f2dd367dcbd 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
@@ -130,26 +130,35 @@ UnusedReturnValueCheck::UnusedReturnValueCheck(llvm::StringRef Name,
"::std::error_condition;"
"::std::errc;"
"::std::expected;"
- "::boost::system::error_code"))) {}
+ "::boost::system::error_code"))),
+ AllowCastToVoid(Options.get("AllowCastToVoid", false)) {}
void UnusedReturnValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "CheckedFunctions", CheckedFunctions);
Options.store(Opts, "CheckedReturnTypes",
utils::options::serializeStringList(CheckedReturnTypes));
+ Options.store(Opts, "AllowCastToVoid", AllowCastToVoid);
}
void UnusedReturnValueCheck::registerMatchers(MatchFinder *Finder) {
auto FunVec = utils::options::parseStringList(CheckedFunctions);
- auto MatchedCallExpr = expr(ignoringImplicit(ignoringParenImpCasts(
- callExpr(callee(functionDecl(
- // Don't match void overloads of checked functions.
- unless(returns(voidType())),
- anyOf(isInstantiatedFrom(hasAnyName(FunVec)),
- returns(hasCanonicalType(hasDeclaration(
- namedDecl(matchers::matchesAnyListedName(
- CheckedReturnTypes)))))))))
- .bind("match"))));
+ auto MatchedDirectCallExpr =
+ expr(callExpr(callee(functionDecl(
+ // Don't match void overloads of checked functions.
+ unless(returns(voidType())),
+ anyOf(isInstantiatedFrom(hasAnyName(FunVec)),
+ returns(hasCanonicalType(hasDeclaration(
+ namedDecl(matchers::matchesAnyListedName(
+ CheckedReturnTypes)))))))))
+ .bind("match"));
+
+ auto CheckCastToVoid =
+ AllowCastToVoid ? castExpr(unless(hasCastKind(CK_ToVoid))) : castExpr();
+ auto MatchedCallExpr = expr(
+ anyOf(MatchedDirectCallExpr,
+ explicitCastExpr(unless(cxxFunctionalCastExpr()), CheckCastToVoid,
+ hasSourceExpression(MatchedDirectCallExpr))));
auto UnusedInCompoundStmt =
compoundStmt(forEach(MatchedCallExpr),
@@ -178,8 +187,13 @@ void UnusedReturnValueCheck::registerMatchers(MatchFinder *Finder) {
void UnusedReturnValueCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *Matched = Result.Nodes.getNodeAs<CallExpr>("match")) {
diag(Matched->getBeginLoc(),
- "the value returned by this function should be used")
+ "the value returned by this function should not be disregarded; "
+ "neglecting it may lead to errors")
<< Matched->getSourceRange();
+
+ if (!AllowCastToVoid)
+ return;
+
diag(Matched->getBeginLoc(),
"cast the expression to void to silence this warning",
DiagnosticIDs::Note);
diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
index 15881e12ca0c36a..b4356f8379fdc85 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
+++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
@@ -24,10 +24,14 @@ class UnusedReturnValueCheck : public ClangTidyCheck {
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+ std::optional<TraversalKind> getCheckTraversalKind() const override {
+ return TK_IgnoreUnlessSpelledInSource;
+ }
private:
std::string CheckedFunctions;
const std::vector<StringRef> CheckedReturnTypes;
+ const bool AllowCastToVoid;
};
} // namespace clang::tidy::bugprone
diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
index d448d9ba6145481..d334ab8c437d32a 100644
--- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
@@ -328,6 +328,7 @@ class CERTModule : public ClangTidyModule {
ClangTidyOptions::OptionMap &Opts = Options.CheckOptions;
Opts["cert-dcl16-c.NewSuffixes"] = "L;LL;LU;LLU";
Opts["cert-err33-c.CheckedFunctions"] = CertErr33CCheckedFunctions;
+ Opts["cert-err33-c.AllowCastToVoid"] = "true";
Opts["cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField"] = "false";
Opts["cert-str34-c.DiagnoseSignedUnsignedCharComparisons"] = "false";
return Options;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 6d6f51998a01e57..7432333024f44fe 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -202,6 +202,12 @@ Changes in existing checks
<clang-tidy/checks/bugprone/reserved-identifier>` check, so that it does not
warn on macros starting with underscore and lowercase letter.
+- Improved :doc:`bugprone-unused-return-value
+ <clang-tidy/checks/bugprone/unused-return-value>` check diagnostic message,
+ added support for detection of unused results when cast to non-``void`` type.
+ Casting to ``void`` no longer suppresses issues by default, control this
+ behavior with the new `AllowCastToVoid` option.
+
- Improved :doc:`cppcoreguidelines-avoid-non-const-global-variables
<clang-tidy/checks/cppcoreguidelines/avoid-non-const-global-variables>` check
to ignore ``static`` variables declared within the scope of
diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
index 5ca96216a10043e..1e3c8a3268222ed 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
@@ -52,5 +52,9 @@ Options
By default the following function return types are checked:
`::std::error_code`, `::std::error_condition`, `::std::errc`, `::std::expected`, `::boost::system::error_code`
+.. option:: AllowCastToVoid
+
+ Controls whether casting return values to ``void`` is permitted. Default: `false`.
+
:doc:`cert-err33-c <../cert/err33-c>` is an alias of this check that checks a
fixed and large set of standard library functions.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/err33-c.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/err33-c.rst
index f3211e50b7e6cad..c1414ec5e086db1 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/cert/err33-c.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/cert/err33-c.rst
@@ -189,6 +189,9 @@ functions are checked:
This check is an alias of check :doc:`bugprone-unused-return-value <../bugprone/unused-return-value>`
with a fixed set of functions.
+Suppressing issues by casting to ``void`` is enabled by default and can be
+disabled by setting `AllowCastToVoid` option to ``false``.
+
The check corresponds to a part of CERT C Coding Standard rule `ERR33-C.
Detect and handle standard library errors
<https://wiki.sei.cmu.edu/confluence/display/c/ERR33-C.+Detect+and+handle+standard+library+errors>`_.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
index fb5f77031a3276f..d3650b210ab02b5 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
@@ -47,40 +47,35 @@ void fun(int);
void warning() {
fun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value returned by this function should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
(fun());
- // CHECK-NOTES: [[@LINE-1]]:4: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:4: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:4: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+
+ (void)fun();
+ // CHECK-MESSAGES: [[@LINE-1]]:9: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::Outer::Inner ObjA1;
ObjA1.memFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::AliasName::Inner ObjA2;
ObjA2.memFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::Derived ObjA3;
ObjA3.memFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::Type::staticFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::ClassTemplate<int> ObjA4;
ObjA4.memFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
ns::ClassTemplate<int>::staticFun();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
}
void noWarning() {
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value.cpp
index 6da66ca42d90fa8..5c6ce1e4bf1fd21 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value.cpp
@@ -1,4 +1,5 @@
-// RUN: %check_clang_tidy %s bugprone-unused-return-value %t -- -- -fexceptions
+// RUN: %check_clang_tidy %s bugprone-unused-return-value %t -- \
+// RUN: --config="{CheckOptions: {bugprone-unused-return-value.AllowCastToVoid: true}}" -- -fexceptions
namespace std {
@@ -81,121 +82,125 @@ std::error_code errorFunc() {
void warning() {
std::async(increment, 42);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value returned by this function should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::async(std::launch::async, increment, 42);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
Foo F;
std::launder(&F);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::remove_if(nullptr, nullptr, nullptr);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::unique(nullptr, nullptr);
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::unique_ptr<Foo> UPtr;
UPtr.release();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
std::string Str;
Str.empty();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
+
+ (int)Str.empty();
+ // CHECK-MESSAGES: [[@LINE-1]]:8: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:8: note: cast the expression to void to silence this warning
std::vector<Foo> Vec;
Vec.empty();
- // CHECK-NOTES: [[@LINE-1]]:3: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:3: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:3: note: cast the expression to void to silence this warning
// test discarding return values inside different kinds of statements
auto Lambda = [] { std::remove(nullptr, nullptr, 1); };
- // CHECK-NOTES: [[@LINE-1]]:22: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:22: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:22: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:22: note: cast the expression to void to silence this warning
if (true)
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
else if (true)
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
else
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
while (true)
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
do
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
while (true);
for (;;)
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
for (std::remove(nullptr, nullptr, 1);;)
- // CHECK-NOTES: [[@LINE-1]]:8: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:8: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:8: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:8: note: cast the expression to void to silence this warning
;
for (;; std::remove(nullptr, nullptr, 1))
- // CHECK-NOTES: [[@LINE-1]]:11: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:11: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:11: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:11: note: cast the expression to void to silence this warning
;
for (auto C : "foo")
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MESSAGES: [[@LINE-1]]:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors
+ // CHECK-MESSAGES: [[@LINE-2]]:5: note: cast the expression to void to silence this warning
switch (1) {
case 1:
std::remove(nullptr, nullptr, 1);
- // CHECK-NOTES: [[@LINE-1]]:5: warning: the value {{.*}} should be used
- // CHECK-NOTES: [[@LINE-2]]:5: note: cast {{.*}} this warning
+ // CHECK-MES...
[truncated]
|
HerrCai0907
reviewed
Oct 25, 2023
clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
Outdated
Show resolved
Hide resolved
HerrCai0907
approved these changes
Oct 26, 2023
Improve diagnostic message to be more straight forward.
…-value Issues could be silenced by for example casting bool result value to int, now it won't work, and problem will be detected.
Add option that control casting to void behavior, change default issue suppression to disallow casting to void.
be2cd0a to
c2ac1a6
Compare
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Improve diagnostic message to be more straight forward, fix handling of
casting to non-void and add new option AllowCastToVoid to control casting
to void behavior.
Closes #66570