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 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
