llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis
@llvm/pr-subscribers-clang-tidy
Author: Changqing Jing (Changqing-JING)
<details>
<summary>Changes</summary>
```cpp
void* ignore_const_return(){
void* const p = nullptr;
return p;
}
```
misc-const-correctness give fake positive when a pointer is not modified but
returned as non-const type
```
test.cpp:7:3: warning: pointee of variable 'p' of type 'void *' can be declared
'const' [misc-const-correctness]
7 | void * p = nullptr;
```
---
Full diff: https://github.com/llvm/llvm-project/pull/162067.diff
2 Files Affected:
- (modified)
clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
(+30)
- (modified) clang/lib/Analysis/ExprMutationAnalyzer.cpp (+7-1)
``````````diff
diff --git
a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
index 2ef47266b02b0..6a4cbfec614aa 100644
---
a/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
+++
b/clang-tools-extra/test/clang-tidy/checkers/misc/const-correctness-pointer-as-pointers.cpp
@@ -48,3 +48,33 @@ void ignore_const_alias() {
p_local0 = &a[1];
}
+void* ignore_const_return(){
+ void* const p = nullptr;
+ return p;
+}
+
+void const* const_return(){
+ void * p = nullptr;
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: pointee of variable 'p' of type
'void *' can be declared 'const'
+ // CHECK-FIXES: void const* p
+ return p;
+}
+
+template<typename T>
+T* ignore_const_return_template(){
+ T* const p = nullptr;
+ return p;
+}
+
+template<typename T>
+T const* const_return_template(){
+ T * p = nullptr;
+ // CHECK-MESSAGES: [[@LINE-1]]:3: warning: pointee of variable 'p' of type
'int *' can be declared 'const'
+ // CHECK-FIXES: T const* p
+ return p;
+}
+
+void instantiate_return_templates() {
+ ignore_const_return_template<int>();
+ const_return_template<int>();
+}
diff --git a/clang/lib/Analysis/ExprMutationAnalyzer.cpp
b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
index 3fcd3481c2d6b..c051212ff1e57 100644
--- a/clang/lib/Analysis/ExprMutationAnalyzer.cpp
+++ b/clang/lib/Analysis/ExprMutationAnalyzer.cpp
@@ -787,10 +787,16 @@
ExprMutationAnalyzer::Analyzer::findPointeeToNonConst(const Expr *Exp) {
// FIXME: false positive if the pointee does not change in lambda
const auto CaptureNoConst = lambdaExpr(hasCaptureInit(Exp));
+ // Return statement in function with non-const pointer return type
+ const auto ReturnAsNonConst = returnStmt(
+ hasDescendant(equalsNode(Exp)),
+ hasAncestor(functionDecl(returns(NonConstPointerOrDependentType))));
+
const auto Matches =
match(stmt(anyOf(forEachDescendant(
stmt(anyOf(AssignToNonConst, PassAsNonConstArg,
- CastToNonConst, CaptureNoConst))
+ CastToNonConst, CaptureNoConst,
+ ReturnAsNonConst))
.bind("stmt")),
forEachDescendant(InitToNonConst))),
Stm, Context);
``````````
</details>
https://github.com/llvm/llvm-project/pull/162067
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits