From a9623d5f550c8fc63f436a40f43bfbf539ac0853 Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Sun, 2 Apr 2023 19:02:04 -0400
Subject: [PATCH] general: fixes for gcc 13

---
 src/CMakeLists.txt                       | 11 +++++++++++
 src/common/intrusive_red_black_tree.h    |  8 --------
 src/common/typed_address.h               |  5 -----
 src/core/internal_network/socket_proxy.h |  3 ---
 src/core/internal_network/sockets.h      | 13 ++-----------
 src/web_service/verify_login.cpp         |  2 +-
 6 files changed, 14 insertions(+), 28 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0eca8e90e7..312a49f42d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -126,6 +126,17 @@ else()
         add_compile_options("-stdlib=libc++")
     endif()
 
+    # GCC bugs
+    if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+        # These diagnostics would be great if they worked, but are just completely broken
+        # and produce bogus errors on external libraries like fmt.
+        add_compile_options(
+            -Wno-array-bounds
+            -Wno-stringop-overread
+            -Wno-stringop-overflow
+        )
+    endif()
+
     # Set file offset size to 64 bits.
     #
     # On modern Unixes, this is typically already the case. The lone exception is
diff --git a/src/common/intrusive_red_black_tree.h b/src/common/intrusive_red_black_tree.h
index 5f6b34e821..bc2940fa0a 100644
--- a/src/common/intrusive_red_black_tree.h
+++ b/src/common/intrusive_red_black_tree.h
@@ -96,10 +96,6 @@ public:
             return m_node == rhs.m_node;
         }
 
-        constexpr bool operator!=(const Iterator& rhs) const {
-            return !(*this == rhs);
-        }
-
         constexpr pointer operator->() const {
             return m_node;
         }
@@ -324,10 +320,6 @@ public:
             return m_impl == rhs.m_impl;
         }
 
-        constexpr bool operator!=(const Iterator& rhs) const {
-            return !(*this == rhs);
-        }
-
         constexpr pointer operator->() const {
             return Traits::GetParent(std::addressof(*m_impl));
         }
diff --git a/src/common/typed_address.h b/src/common/typed_address.h
index cf7bbeae1b..64f4a07c20 100644
--- a/src/common/typed_address.h
+++ b/src/common/typed_address.h
@@ -116,7 +116,6 @@ public:
 
     // Comparison operators.
     constexpr bool operator==(const TypedAddress&) const = default;
-    constexpr bool operator!=(const TypedAddress&) const = default;
     constexpr auto operator<=>(const TypedAddress&) const = default;
 
     // For convenience, also define comparison operators versus uint64_t.
@@ -124,10 +123,6 @@ public:
         return m_address == rhs;
     }
 
-    constexpr inline bool operator!=(uint64_t rhs) const {
-        return m_address != rhs;
-    }
-
     // Allow getting the address explicitly, for use in accessors.
     constexpr inline uint64_t GetValue() const {
         return m_address;
diff --git a/src/core/internal_network/socket_proxy.h b/src/core/internal_network/socket_proxy.h
index 9421492bc0..6e991fa386 100644
--- a/src/core/internal_network/socket_proxy.h
+++ b/src/core/internal_network/socket_proxy.h
@@ -16,9 +16,6 @@ namespace Network {
 
 class ProxySocket : public SocketBase {
 public:
-    YUZU_NON_COPYABLE(ProxySocket);
-    YUZU_NON_MOVEABLE(ProxySocket);
-
     explicit ProxySocket(RoomNetwork& room_network_) noexcept;
     ~ProxySocket() override;
 
diff --git a/src/core/internal_network/sockets.h b/src/core/internal_network/sockets.h
index 4c74892584..11e479e509 100644
--- a/src/core/internal_network/sockets.h
+++ b/src/core/internal_network/sockets.h
@@ -36,13 +36,10 @@ public:
 
     SocketBase() = default;
     explicit SocketBase(SOCKET fd_) : fd{fd_} {}
-
     virtual ~SocketBase() = default;
 
-    virtual SocketBase& operator=(const SocketBase&) = delete;
-
-    // Avoid closing sockets implicitly
-    virtual SocketBase& operator=(SocketBase&&) noexcept = delete;
+    YUZU_NON_COPYABLE(SocketBase);
+    YUZU_NON_MOVEABLE(SocketBase);
 
     virtual Errno Initialize(Domain domain, Type type, Protocol protocol) = 0;
 
@@ -109,14 +106,8 @@ public:
 
     ~Socket() override;
 
-    Socket(const Socket&) = delete;
-    Socket& operator=(const Socket&) = delete;
-
     Socket(Socket&& rhs) noexcept;
 
-    // Avoid closing sockets implicitly
-    Socket& operator=(Socket&&) noexcept = delete;
-
     Errno Initialize(Domain domain, Type type, Protocol protocol) override;
 
     Errno Close() override;
diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp
index 050080278b..d5b7161cbe 100644
--- a/src/web_service/verify_login.cpp
+++ b/src/web_service/verify_login.cpp
@@ -21,7 +21,7 @@ bool VerifyLogin(const std::string& host, const std::string& username, const std
         return username.empty();
     }
 
-    return username == *iter;
+    return *iter == username;
 }
 
 } // namespace WebService