Author: Florian Mayer
Date: 2026-02-20T14:33:12-08:00
New Revision: 5e09590993a9eaf256df07c7aecafa26f1e81253

URL: 
https://github.com/llvm/llvm-project/commit/5e09590993a9eaf256df07c7aecafa26f1e81253
DIFF: 
https://github.com/llvm/llvm-project/commit/5e09590993a9eaf256df07c7aecafa26f1e81253.diff

LOG: [NFC] [FlowSensitive] Add mock header for coroutines

These are copied from libcxx with some details and implementation removed.

Reviewers: rohanjr

Pull Request: https://github.com/llvm/llvm-project/pull/182602

Added: 
    

Modified: 
    clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp

Removed: 
    


################################################################################
diff  --git a/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp 
b/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
index 8ea2015da08df..55abb57091bdf 100644
--- a/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/MockHeaders.cpp
@@ -219,6 +219,8 @@ inline constexpr bool is_convertible_v = 
is_convertible<From, To>::value;
 
 template <class...>
 using void_t = void;
+template <class...>
+using __void_t = void;
 
 template <class, class T, class... Args>
 struct is_constructible_ : false_type {};
@@ -2000,6 +2002,103 @@ char *Check_LTImpl(const T1 &v1, const T2 &v2, const 
char *names);
 #endif // ABSL_LOG_H
 )cc";
 
+static constexpr char StdCoroutineHeader[] = R"cc(
+#ifndef COROUTINE_H
+#define COROUTINE_H
+
+#include "std_type_traits.h"
+
+namespace std {
+
+template <class _Tp, class = void>
+struct __coroutine_traits_sfinae {};
+
+template <class _Tp>
+struct __coroutine_traits_sfinae< _Tp, __void_t<typename _Tp::promise_type> > {
+  using promise_type = typename _Tp::promise_type;
+};
+
+template <class _Ret, class... _Args>
+struct coroutine_traits : public __coroutine_traits_sfinae<_Ret> {};
+
+template <class _Promise = void>
+struct coroutine_handle;
+
+template <>
+struct coroutine_handle<void> {
+public:
+  constexpr coroutine_handle() noexcept;
+  constexpr coroutine_handle(nullptr_t) noexcept;
+  coroutine_handle& operator=(nullptr_t) noexcept;
+  constexpr void* address() const noexcept;
+
+  static constexpr coroutine_handle from_address(void* __addr) noexcept;
+
+  // [coroutine.handle.observers], observers
+  constexpr explicit operator bool() const noexcept;
+
+  bool done() const;
+
+  // [coroutine.handle.resumption], resumption
+  void operator()() const;
+
+  void resume() const;
+
+  void destroy() const;
+};
+
+template <class _Promise>
+struct coroutine_handle {
+public:
+  // [coroutine.handle.con], construct/reset
+  constexpr coroutine_handle() noexcept;
+
+  constexpr coroutine_handle(nullptr_t) noexcept;
+
+  static coroutine_handle from_promise(_Promise& __promise);
+  coroutine_handle& operator=(nullptr_t) noexcept;
+
+  // [coroutine.handle.export.import], export/import
+  constexpr void* address() const noexcept;
+
+  static constexpr coroutine_handle from_address(void* __addr) noexcept;
+
+  // [coroutine.handle.conv], conversion
+  constexpr operator coroutine_handle<>() const noexcept;
+
+  // [coroutine.handle.observers], observers
+  constexpr explicit operator bool() const noexcept;
+
+  bool done() const;
+
+  // [coroutine.handle.resumption], resumption
+  void operator()() const;
+
+  void resume() const;
+
+  void destroy() const;
+
+  // [coroutine.handle.promise], promise access
+  _Promise& promise() const;
+};
+
+struct suspend_never {
+  constexpr bool await_ready() const noexcept { return true; }
+  constexpr void await_suspend(coroutine_handle<>) const noexcept {}
+  constexpr void await_resume() const noexcept {}
+};
+
+struct suspend_always {
+  constexpr bool await_ready() const noexcept { return false; }
+  constexpr void await_suspend(coroutine_handle<>) const noexcept {}
+  constexpr void await_resume() const noexcept {}
+};
+
+} // namespace std
+
+#endif // COROUTINE_H
+)cc";
+
 constexpr const char TestingDefsHeader[] = R"cc(
 #pragma clang system_header
 
@@ -2333,6 +2432,7 @@ std::vector<std::pair<std::string, std::string>> 
getMockHeaders() {
   Headers.emplace_back("std_type_traits.h", StdTypeTraitsHeader);
   Headers.emplace_back("std_utility.h", StdUtilityHeader);
   Headers.emplace_back("std_optional.h", StdOptionalHeader);
+  Headers.emplace_back("std_coroutine.h", StdCoroutineHeader);
   Headers.emplace_back("absl_type_traits.h", AbslTypeTraitsHeader);
   Headers.emplace_back("absl_optional.h", AbslOptionalHeader);
   Headers.emplace_back("base_optional.h", BaseOptionalHeader);
@@ -2348,4 +2448,4 @@ std::vector<std::pair<std::string, std::string>> 
getMockHeaders() {
 
 } // namespace test
 } // namespace dataflow
-} // namespace clang
\ No newline at end of file
+} // namespace clang


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to