-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang-tidy] Fix performance-unnecessary-value-param #109145
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
[clang-tidy] Fix performance-unnecessary-value-param #109145
Conversation
This patch essentially reverts llvm#108674 while adding a testcase that triggers a crash in clang-tidy. Fixes llvm#108963.
@llvm/pr-subscribers-clang-tools-extra @llvm/pr-subscribers-clang Author: Kazu Hirata (kazutakahirata) ChangesThis patch essentially reverts #108674 while adding a testcase that Fixes #108963. Full diff: https://github.com/llvm/llvm-project/pull/109145.diff 2 Files Affected:
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-value-param-crash.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-value-param-crash.cpp
new file mode 100644
index 00000000000000..99c2fe905bdf37
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-value-param-crash.cpp
@@ -0,0 +1,23 @@
+// RUN: %check_clang_tidy -std=c++14-or-later %s performance-unnecessary-value-param %t
+
+// The test case used to crash clang-tidy.
+// https://github.com/llvm/llvm-project/issues/108963
+
+struct A
+{
+ template<typename T> A(T&&) {}
+};
+
+struct B
+{
+ ~B();
+};
+
+struct C
+{
+ A a;
+ C(B, int i) : a(i) {}
+ // CHECK-MESSAGES: [[@LINE-1]]:6: warning: the parameter #1 is copied for each invocation but only used as a const reference; consider making it a const reference
+};
+
+C c(B(), 0);
diff --git a/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h b/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h
index b7b84852168e2e..d7d0d80ee8cd8c 100644
--- a/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h
+++ b/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h
@@ -118,10 +118,19 @@ class FunctionParmMutationAnalyzer {
static FunctionParmMutationAnalyzer *
getFunctionParmMutationAnalyzer(const FunctionDecl &Func, ASTContext &Context,
ExprMutationAnalyzer::Memoized &Memorized) {
- auto [it, Inserted] = Memorized.FuncParmAnalyzer.try_emplace(&Func);
- if (Inserted)
- it->second = std::unique_ptr<FunctionParmMutationAnalyzer>(
- new FunctionParmMutationAnalyzer(Func, Context, Memorized));
+ auto it = Memorized.FuncParmAnalyzer.find(&Func);
+ if (it == Memorized.FuncParmAnalyzer.end())
+ // We call try_emplace here, repeating a hash lookup on the same key. Note
+ // that creating a new instance of FunctionParmMutationAnalyzer below may
+ // add additional elements to FuncParmAnalyzer and invalidate iterators.
+ // That means that we cannot call try_emplace above and update the value
+ // portion (i.e. it->second) here.
+ it =
+ Memorized.FuncParmAnalyzer
+ .try_emplace(&Func, std::unique_ptr<FunctionParmMutationAnalyzer>(
+ new FunctionParmMutationAnalyzer(
+ Func, Context, Memorized)))
+ .first;
return it->getSecond().get();
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code change looks good to me, but not familiar with clang-tidy testing.
clang-tools-extra/test/clang-tidy/checkers/performance/unnecessary-value-param-crash.cpp
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
The comment is a little bit hard to understand. maybe you can sort out the wording.
This patch essentially reverts llvm#108674 while adding a testcase that triggers a crash in clang-tidy. Fixes llvm#108963.
This patch essentially reverts #108674 while adding a testcase that
triggers a crash in clang-tidy.
Fixes #108963.