Could those with the issue test this patch?:
diff --git a/source/blender/editors/interface/interface_view.cc b/source/blender/editors/interface/interface_view.cc
index 81b24c75020..a7cf7e6088b 100644
--- a/source/blender/editors/interface/interface_view.cc
+++ b/source/blender/editors/interface/interface_view.cc
@@ -24,6 +24,7 @@
*/
#include <memory>
+#include <type_traits>
#include <variant>
#include "DNA_screen_types.h"
@@ -35,9 +36,41 @@
#include "UI_interface.hh"
#include "UI_tree_view.hh"
+/* Old XCode versions (<= 10.3?) crash when using std::variant as below.
+ * See: https://devtalk.blender.org/t/20562 */
+#ifdef __APPLE__
+# define AVOID_STD_VARIANT
+#endif
+
using namespace blender;
using namespace blender::ui;
+#ifdef AVOID_STD_VARIANT
+struct ViewVariant {
+ using TreeViewPtr = std::unique_ptr<AbstractTreeView>;
+
+ union {
+ char none;
+ TreeViewPtr tree_view;
+ /* Other views... */
+ };
+ enum {
+ TypeNone,
+ TypeTreeView,
+ } type = TypeNone;
+
+ ViewVariant() : none()
+ {
+ }
+ ~ViewVariant()
+ {
+ if (type == TypeTreeView) {
+ tree_view = nullptr;
+ }
+ }
+};
+#endif
+
/**
* Wrapper to store views in a #ListBase. There's no `uiView` base class, we just store views as a
* #std::variant.
@@ -46,14 +79,25 @@ struct ViewLink : public Link {
using TreeViewPtr = std::unique_ptr<AbstractTreeView>;
std::string idname;
+#ifdef AVOID_STD_VARIANT
+ ViewVariant view;
+#else
/* NOTE: Can't use std::get() on this until minimum macOS deployment target is 10.14. */
std::variant<TreeViewPtr> view;
+#endif
};
template<class T> T *get_view_from_link(ViewLink &link)
{
+#ifdef AVOID_STD_VARIANT
+ if constexpr (std::is_same_v<T, AbstractTreeView>) {
+ return (link.view.type == ViewVariant::TypeTreeView) ? link.view.tree_view.get() : nullptr;
+ }
+ return nullptr;
+#else
auto *t_uptr = std::get_if<std::unique_ptr<T>>(&link.view);
return t_uptr ? t_uptr->get() : nullptr;
+#endif
}
AbstractTreeView *UI_block_add_view(uiBlock &block,
@@ -63,7 +107,12 @@ AbstractTreeView *UI_block_add_view(uiBlock &block,
ViewLink *view_link = MEM_new<ViewLink>(__func__);
BLI_addtail(&block.views, view_link);
+#ifdef AVOID_STD_VARIANT
+ view_link->view.tree_view = std::move(tree_view);
+ view_link->view.type = ViewVariant::TypeTreeView;
+#else
view_link->view = std::move(tree_view);
+#endif
view_link->idname = idname;
return get_view_from_link<AbstractTreeView>(*view_link);