[llvm-branch-commits] [NFCI] [FlowSensitive] [StatusOr] Add test for ABSL_ASSIGN_OR_RETURN (PR #200306)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu May 28 17:04:41 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Florian Mayer (fmayer)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/200306.diff
2 Files Affected:
- (modified) clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp (+64-1)
- (modified) clang/unittests/Analysis/FlowSensitive/UncheckedStatusOrAccessModelTestFixture.cpp (+13)
``````````diff
diff --git a/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp b/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
index c5ad8ea4dcb1f..c43c1e6999693 100644
--- a/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
@@ -465,6 +465,9 @@ struct in_place_t {};
constexpr in_place_t in_place;
+template<class T> struct remove_const { typedef T type; };
+template<class T> struct remove_const<const T> { typedef T type; };
+
} // namespace std
#endif // STD_TYPE_TRAITS_H
@@ -1739,7 +1742,8 @@ ReturnIfErrorAdaptor MacroAdaptor(const absl::Status& s,
absl::SourceLocation loc);
ReturnIfErrorAdaptor MacroAdaptor(absl::Status&& s,
absl::SourceLocation loc);
-}
+
+} // namespace status_macro_internal
} // namespace absl
@@ -1760,6 +1764,65 @@ ReturnIfErrorAdaptor MacroAdaptor(absl::Status&& s,
#define ABSL_RETURN_IF_ERROR(expr) \
ABSL_INTERNAL_STATUS_MACROS_RETURN_IF_ERROR_IMPL_(return, expr)
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_INNER_(x, y) x##y
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_(x, y) \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_INNER_(x, y)
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_UNPARENTHESIZE_IF_PARENTHESIZED(...) \
+ __VA_ARGS__
+
+#define ABSL_ASSIGN_OR_RETURN(...) \
+ ABSL_INTERNAL_STATUS_MACROS_ASSIGN_OR_RETURN_IMPL_(return, __VA_ARGS__)
+
+#define ABSL_INTERNAL_STATUS_MACROS_ASSIGN_OR_RETURN_IMPL_(return_keyword, \
+ ...) \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_GET_VARIADIC_( \
+ (return_keyword, __VA_ARGS__, \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_, \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_2_)) \
+ (return_keyword, __VA_ARGS__)
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_GET_VARIADIC_HELPER_(_1, _2, _3, _4, \
+ NAME, ...) \
+ NAME
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_GET_VARIADIC_(args) \
+ /* NOLINTNEXTLINE(clang-diagnostic-pre-c++20-compat) */ \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_GET_VARIADIC_HELPER_ args
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_2_(return_keyword, \
+ lhs, rexpr) \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), \
+ lhs, rexpr, \
+ return_keyword absl::Status( \
+ std::move(ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, \
+ __LINE__)) \
+ .status(), \
+ absl::SourceLocation::current()))
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_3_( \
+ return_keyword, lhs, rexpr, error_expression) \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, __LINE__), \
+ lhs, rexpr, /* NOLINTNEXTLINE(misc-const-correctness) */ \
+ absl::StatusBuilder _( \
+ std::move(ABSL_INTERNAL_STATUS_MACROS_IMPL_CONCAT_(_status_or_value, \
+ __LINE__)) \
+ .status(), \
+ absl::SourceLocation::current()); \
+ (void)_; /* error_expression is allowed to not use this variable */ \
+ return_keyword(error_expression))
+
+#define ABSL_INTERNAL_STATUS_MACROS_IMPL_ASSIGN_OR_RETURN_( \
+ statusor, lhs, rexpr, error_expression) \
+ auto statusor = (rexpr); \
+ if (!statusor.ok()) { \
+ error_expression; \
+ } \
+ ABSL_INTERNAL_STATUS_MACROS_IMPL_UNPARENTHESIZE_IF_PARENTHESIZED(lhs) = \
+ (*std::move(statusor))
+
#endif // STATUSOR_H_
)cc";
diff --git a/clang/unittests/Analysis/FlowSensitive/UncheckedStatusOrAccessModelTestFixture.cpp b/clang/unittests/Analysis/FlowSensitive/UncheckedStatusOrAccessModelTestFixture.cpp
index 3c72d1ec13c8e..7d4eae222b99f 100644
--- a/clang/unittests/Analysis/FlowSensitive/UncheckedStatusOrAccessModelTestFixture.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/UncheckedStatusOrAccessModelTestFixture.cpp
@@ -4585,6 +4585,19 @@ TEST_P(UncheckedStatusOrAccessModelTest, ReturnIfError) {
)cc");
}
+TEST_P(UncheckedStatusOrAccessModelTest, AssignOrReturn) {
+ ExpectDiagnosticsFor(R"cc(
+#include "unchecked_statusor_access_test_defs.h"
+#include "task.h"
+
+ absl::Status target(STATUSOR_INT sor) {
+ ABSL_ASSIGN_OR_RETURN(int x, sor);
+ *sor;
+ return {};
+ }
+ )cc");
+}
+
} // namespace
std::string
``````````
</details>
https://github.com/llvm/llvm-project/pull/200306
More information about the llvm-branch-commits
mailing list