================
@@ -0,0 +1,190 @@
+// RUN: %clang_analyze_cc1 
-analyzer-checker=alpha.webkit.UncountedCallArgsChecker,alpha.webkit.UncountedLocalVarsChecker,alpha.webkit.UncheckedCallArgsChecker,alpha.webkit.UncheckedLocalVarsChecker
 -verify %s
+
+#include "mock-types.h"
+
+namespace WTF {
+
+template <typename T> class NeverDestroyed {
+public:
+  template <typename... Args> NeverDestroyed(Args&&...);
+  operator T&() { return *storagePointer(); }
+  T& get() { return *storagePointer(); }
+  T* operator->() { return storagePointer(); }
+  operator const T&() const { return *storagePointer(); }
+  const T& get() const { return *storagePointer(); }
+  const T* operator->() const { return storagePointer(); }
+
+private:
+  T* storagePointer() const { return 
reinterpret_cast<T*>(const_cast<char*>(m_storage)); }
----------------
steakhal wrote:

I thought the reinterpret-cast is not enough for acquiring a valid pointer to 
type-punned storage.
I figured that's why C++ has `std::launder`.
https://en.cppreference.com/cpp/utility/launder

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

Reply via email to