[llvm-branch-commits] [clang] [FlowSensitive] [StatusOr] [8/N] Support value ctor and assignment (PR #163894)

Jan Voung via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Oct 23 08:10:06 PDT 2025


================
@@ -177,6 +177,27 @@ static auto isPointerComparisonOperatorCall(std::string operator_name) {
                             pointee(anyOf(statusOrType(), statusType())))))));
 }
 
+static auto isStatusOrValueAssignmentCall() {
+  using namespace ::clang::ast_matchers; // NOLINT: Too many names
+  return cxxOperatorCallExpr(
+      hasOverloadedOperatorName("="),
+      callee(cxxMethodDecl(ofClass(statusOrClass()))),
+      hasArgument(1, anyOf(hasType(hasUnqualifiedDesugaredType(
+                               type(equalsBoundNode("T")))),
+                           nullPointerConstant())));
----------------
jvoung wrote:

is the `nullPointerConstant()` a special case because the operator= more broadly accepts some type `U` as long as IsAssignmentValid(T, U), but here it is directly checking for `T` types?

(and the nullptr constant  `U = nullptr_t` instead of `T = void*`) ?

If so, would be good to leave a comment as to why.

I think the std::optional checker is more relaxed during the matching, and then tries to split in the transfer function if it is `U` or `std::optional<U>` (https://github.com/llvm/llvm-project/blob/9a5ae34eb6e90c51e2231ceb1a8cf933341f3222/clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp#L689)

which could be another way to do it.



https://github.com/llvm/llvm-project/pull/163894


More information about the llvm-branch-commits mailing list