Sfoglia il codice sorgente

frontend: Fix build failure with Clang 20+ in OBSCanvas

Canvas is a move-only type without a copy constructor. Since C++17
requires types stored in std::optional to be copy-constructible unless
explicitly allowed, Clang 20+ emits an error when attempting to
instantiate std::optional<Canvas>.

While GCC allows this as an extension, Clang enforces the standard
more strictly.

This PR replaces std::optional<Canvas> with std::unique_ptr<Canvas> to
resolve the build error with Clang 20+ while keeping functional
behavior identical.

Tested with GCC 15.1.0 and Clang 20.1.7.

Co-Authored-By: Ryan Foster <[email protected]>
Damian Marcin Szymański 3 mesi fa
parent
commit
9331fb7dac
2 ha cambiato i file con 5 aggiunte e 4 eliminazioni
  1. 3 3
      frontend/utility/OBSCanvas.cpp
  2. 2 1
      frontend/utility/OBSCanvas.hpp

+ 3 - 3
frontend/utility/OBSCanvas.cpp

@@ -55,15 +55,15 @@ std::optional<OBSDataAutoRelease> Canvas::Save() const
 	return std::nullopt;
 }
 
-std::optional<Canvas> Canvas::Load(obs_data_t *data)
+std::unique_ptr<Canvas> Canvas::Load(obs_data_t *data)
 {
 	if (OBSDataAutoRelease canvas_data = obs_data_get_obj(data, "info")) {
 		if (obs_canvas_t *canvas = obs_load_canvas(canvas_data)) {
-			return canvas;
+			return std::make_unique<Canvas>(canvas);
 		}
 	}
 
-	return std::nullopt;
+	return nullptr;
 }
 
 std::vector<Canvas> Canvas::LoadCanvases(obs_data_array_t *canvases)

+ 2 - 1
frontend/utility/OBSCanvas.hpp

@@ -17,6 +17,7 @@
 
 #pragma once
 
+#include <memory>
 #include <optional>
 #include <vector>
 
@@ -41,7 +42,7 @@ public:
 	operator obs_canvas_t *() const { return canvas; }
 
 	[[nodiscard]] std::optional<OBSDataAutoRelease> Save() const;
-	static std::optional<Canvas> Load(obs_data_t *data);
+	static std::unique_ptr<Canvas> Load(obs_data_t *data);
 	static std::vector<Canvas> LoadCanvases(obs_data_array_t *canvases);
 	static OBSDataArrayAutoRelease SaveCanvases(const std::vector<Canvas> &canvases);