[clang] [clang] [dataflow] use unqualified type for smart pointer matching (PR #125958)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 5 15:26:53 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis
Author: Florian Mayer (fmayer)
<details>
<summary>Changes</summary>
one would assume that `getCanonicalTypeUnqualified` returns an
unqualified type, but sadly one would be wrong. the current logic fails
for std::optional as implemented in libcxx, because Star and Arrow types
mismatch in their const qualification.
there are other places in clang that use
getCanonicalTypeUnqualified().getUnqualifiedType().
---
Full diff: https://github.com/llvm/llvm-project/pull/125958.diff
1 Files Affected:
- (modified) clang/lib/Analysis/FlowSensitive/SmartPointerAccessorCaching.cpp (+8-4)
``````````diff
diff --git a/clang/lib/Analysis/FlowSensitive/SmartPointerAccessorCaching.cpp b/clang/lib/Analysis/FlowSensitive/SmartPointerAccessorCaching.cpp
index c58bd309545dbf..576a0ca1594154 100644
--- a/clang/lib/Analysis/FlowSensitive/SmartPointerAccessorCaching.cpp
+++ b/clang/lib/Analysis/FlowSensitive/SmartPointerAccessorCaching.cpp
@@ -41,7 +41,8 @@ bool hasSmartPointerClassShape(const CXXRecordDecl &RD, bool &HasGet,
HasStar = true;
StarReturnType = MD->getReturnType()
.getNonReferenceType()
- ->getCanonicalTypeUnqualified();
+ ->getCanonicalTypeUnqualified()
+ .getUnqualifiedType();
}
break;
case OO_Arrow:
@@ -49,7 +50,8 @@ bool hasSmartPointerClassShape(const CXXRecordDecl &RD, bool &HasGet,
HasArrow = true;
ArrowReturnType = MD->getReturnType()
->getPointeeType()
- ->getCanonicalTypeUnqualified();
+ ->getCanonicalTypeUnqualified()
+ .getUnqualifiedType();
}
break;
case OO_None: {
@@ -61,14 +63,16 @@ bool hasSmartPointerClassShape(const CXXRecordDecl &RD, bool &HasGet,
HasGet = true;
GetReturnType = MD->getReturnType()
->getPointeeType()
- ->getCanonicalTypeUnqualified();
+ ->getCanonicalTypeUnqualified()
+ .getUnqualifiedType();
}
} else if (II->isStr("value")) {
if (MD->getReturnType()->isReferenceType()) {
HasValue = true;
ValueReturnType = MD->getReturnType()
.getNonReferenceType()
- ->getCanonicalTypeUnqualified();
+ ->getCanonicalTypeUnqualified()
+ .getUnqualifiedType();
}
}
} break;
``````````
</details>
https://github.com/llvm/llvm-project/pull/125958
More information about the cfe-commits
mailing list