fix: Resolve compilation issues with fmt library and formatters

Fix multiple compilation errors preventing successful build:

* Add const qualifier to custom fmt formatter functions across codebase
  - Updated formatters in logging, shader recompiler, texture cache, and other modules
  - Ensures compatibility with newer fmt library versions

* Add missing fmt/ranges.h includes for fmt::join usage
  - Fixed fmt::join calls in Vulkan renderer, GDB stub, NFC service, and main window
  - Resolves "no member named 'join' in namespace 'fmt'" errors

* Exclude unsupported platforms from Boost.Process usage in debugger
  - Extended conditional compilation to avoid Boost.Process where unavailable

* Fix type casting issues in AOC service manager
  - Resolved std::min type mismatch with explicit casting
This commit is contained in:
Boss.sfc
2025-07-16 11:11:33 +07:00
parent 25e8c0539c
commit 0fb39034c1
21 changed files with 37 additions and 31 deletions

View File

@@ -93,6 +93,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual
#endif #endif
#include <fmt/format.h> #include <fmt/format.h>
#include <fmt/ranges.h>
#include "common/detached_tasks.h" #include "common/detached_tasks.h"
#include "common/fs/fs.h" #include "common/fs/fs.h"
#include "common/fs/path_util.h" #include "common/fs/path_util.h"

View File

@@ -14,7 +14,7 @@ template <typename T>
struct fmt::formatter<T, std::enable_if_t<std::is_enum_v<T>, char>> struct fmt::formatter<T, std::enable_if_t<std::is_enum_v<T>, char>>
: formatter<std::underlying_type_t<T>> { : formatter<std::underlying_type_t<T>> {
template <typename FormatContext> template <typename FormatContext>
auto format(const T& value, FormatContext& ctx) -> decltype(ctx.out()) { auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) {
return fmt::formatter<std::underlying_type_t<T>>::format( return fmt::formatter<std::underlying_type_t<T>>::format(
static_cast<std::underlying_type_t<T>>(value), ctx); static_cast<std::underlying_type_t<T>>(value), ctx);
} }

View File

@@ -262,7 +262,7 @@ struct fmt::formatter<Common::PhysicalAddress> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) { auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue())); return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
} }
}; };
@@ -273,7 +273,7 @@ struct fmt::formatter<Common::ProcessAddress> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Common::ProcessAddress& addr, FormatContext& ctx) { auto format(const Common::ProcessAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue())); return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
} }
}; };
@@ -284,7 +284,7 @@ struct fmt::formatter<Common::VirtualAddress> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Common::VirtualAddress& addr, FormatContext& ctx) { auto format(const Common::VirtualAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue())); return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
} }
}; };

View File

@@ -22,7 +22,7 @@ struct fmt::formatter<Dynarmic::A32::CoprocReg> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) { auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "cp{}", static_cast<size_t>(reg)); return fmt::format_to(ctx.out(), "cp{}", static_cast<size_t>(reg));
} }
}; };

View File

@@ -6,7 +6,7 @@
#include <thread> #include <thread>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#ifndef __ANDROID__ #if !defined(__ANDROID__) && !defined(__APPLE__)
#include <boost/process/async_pipe.hpp> #include <boost/process/async_pipe.hpp>
#endif #endif
@@ -161,10 +161,10 @@ private:
// Set the new state. This will tear down any existing state. // Set the new state. This will tear down any existing state.
state = ConnectionState{ state = ConnectionState{
.client_socket{std::move(peer)}, .client_socket{std::move(peer)},
#ifndef __ANDROID__ #if !defined(__ANDROID__) && !defined(__APPLE__)
.signal_pipe{io_context}, .signal_pipe{io_context},
#else #else
// Use a regular socket pair for Android // Use a regular socket pair for Android and macOS
.signal_pipe{io_context}, .signal_pipe{io_context},
#endif #endif
.info{}, .info{},
@@ -333,10 +333,10 @@ private:
struct ConnectionState { struct ConnectionState {
boost::asio::ip::tcp::socket client_socket; boost::asio::ip::tcp::socket client_socket;
#ifndef __ANDROID__ #if !defined(__ANDROID__) && !defined(__APPLE__)
boost::process::async_pipe signal_pipe; boost::process::async_pipe signal_pipe;
#else #else
// Use a regular socket pair for Android // Use a regular socket pair for Android and macOS
boost::asio::ip::tcp::socket signal_pipe; boost::asio::ip::tcp::socket signal_pipe;
#endif #endif

View File

@@ -10,6 +10,9 @@
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <fmt/format.h>
#include <fmt/ranges.h>
#include "common/hex_util.h" #include "common/hex_util.h"
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/scope_exit.h" #include "common/scope_exit.h"

View File

@@ -76,7 +76,7 @@ Result IAsyncData::Read(OutBuffer<BufferAttr_HipcMapAlias> out_buffer, u64 offse
} }
const u64 read_size = std::min(size, static_cast<u64>(data_buffer.size() - offset)); const u64 read_size = std::min(size, static_cast<u64>(data_buffer.size() - offset));
const u64 copy_size = std::min(read_size, out_buffer.size()); const u64 copy_size = std::min(read_size, static_cast<u64>(out_buffer.size()));
std::memcpy(out_buffer.data(), data_buffer.data() + offset, copy_size); std::memcpy(out_buffer.data(), data_buffer.data() + offset, copy_size);

View File

@@ -15,6 +15,7 @@
#endif #endif
#include <fmt/format.h> #include <fmt/format.h>
#include <fmt/ranges.h>
#include "common/fs/file.h" #include "common/fs/file.h"
#include "common/fs/fs.h" #include "common/fs/fs.h"

View File

@@ -167,7 +167,7 @@ constexpr inline Result GetSpanBetweenTimePoints(s64* out_seconds, const SteadyC
template <> template <>
struct fmt::formatter<Service::PSC::Time::TimeType> : fmt::formatter<fmt::string_view> { struct fmt::formatter<Service::PSC::Time::TimeType> : fmt::formatter<fmt::string_view> {
template <typename FormatContext> template <typename FormatContext>
auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) { auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) const {
const string_view name = [type] { const string_view name = [type] {
using Service::PSC::Time::TimeType; using Service::PSC::Time::TimeType;
switch (type) { switch (type) {

View File

@@ -184,7 +184,7 @@ struct fmt::formatter<Shader::Backend::GLASM::Id> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) { auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) const {
return Shader::Backend::GLASM::FormatTo<true>(ctx, id); return Shader::Backend::GLASM::FormatTo<true>(ctx, id);
} }
}; };
@@ -195,7 +195,7 @@ struct fmt::formatter<Shader::Backend::GLASM::Register> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) const {
if (value.type != Shader::Backend::GLASM::Type::Register) { if (value.type != Shader::Backend::GLASM::Type::Register) {
throw Shader::InvalidArgument("Register value type is not register"); throw Shader::InvalidArgument("Register value type is not register");
} }
@@ -209,7 +209,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarRegister> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) const {
if (value.type != Shader::Backend::GLASM::Type::Register) { if (value.type != Shader::Backend::GLASM::Type::Register) {
throw Shader::InvalidArgument("Register value type is not register"); throw Shader::InvalidArgument("Register value type is not register");
} }
@@ -223,7 +223,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarU32> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) const {
switch (value.type) { switch (value.type) {
case Shader::Backend::GLASM::Type::Void: case Shader::Backend::GLASM::Type::Void:
break; break;
@@ -244,7 +244,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarS32> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) const {
switch (value.type) { switch (value.type) {
case Shader::Backend::GLASM::Type::Void: case Shader::Backend::GLASM::Type::Void:
break; break;
@@ -265,7 +265,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF32> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) const {
switch (value.type) { switch (value.type) {
case Shader::Backend::GLASM::Type::Void: case Shader::Backend::GLASM::Type::Void:
break; break;
@@ -286,7 +286,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF64> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) { auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) const {
switch (value.type) { switch (value.type) {
case Shader::Backend::GLASM::Type::Void: case Shader::Backend::GLASM::Type::Void:
break; break;

View File

@@ -250,7 +250,7 @@ struct fmt::formatter<Shader::IR::Attribute> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) { auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(attribute)); return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(attribute));
} }
}; };

View File

@@ -52,7 +52,7 @@ struct fmt::formatter<Shader::IR::Condition> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Condition& cond, FormatContext& ctx) { auto format(const Shader::IR::Condition& cond, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(cond)); return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(cond));
} }
}; };

View File

@@ -55,7 +55,7 @@ struct fmt::formatter<Shader::IR::FlowTest> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) { auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(flow_test)); return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(flow_test));
} }
}; };

View File

@@ -103,7 +103,7 @@ struct fmt::formatter<Shader::IR::Opcode> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Opcode& op, FormatContext& ctx) { auto format(const Shader::IR::Opcode& op, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(op)); return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(op));
} }
}; };

View File

@@ -33,7 +33,7 @@ struct fmt::formatter<Shader::IR::Pred> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Pred& pred, FormatContext& ctx) { auto format(const Shader::IR::Pred& pred, FormatContext& ctx) const {
if (pred == Shader::IR::Pred::PT) { if (pred == Shader::IR::Pred::PT) {
return fmt::format_to(ctx.out(), "PT"); return fmt::format_to(ctx.out(), "PT");
} else { } else {

View File

@@ -319,7 +319,7 @@ struct fmt::formatter<Shader::IR::Reg> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Reg& reg, FormatContext& ctx) { auto format(const Shader::IR::Reg& reg, FormatContext& ctx) const {
if (reg == Shader::IR::Reg::RZ) { if (reg == Shader::IR::Reg::RZ) {
return fmt::format_to(ctx.out(), "RZ"); return fmt::format_to(ctx.out(), "RZ");
} else if (static_cast<int>(reg) >= 0 && static_cast<int>(reg) < 255) { } else if (static_cast<int>(reg) >= 0 && static_cast<int>(reg) < 255) {

View File

@@ -54,7 +54,7 @@ struct fmt::formatter<Shader::IR::Type> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::IR::Type& type, FormatContext& ctx) { auto format(const Shader::IR::Type& type, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", NameOf(type)); return fmt::format_to(ctx.out(), "{}", NameOf(type));
} }
}; };

View File

@@ -102,7 +102,7 @@ struct fmt::formatter<Shader::Maxwell::Location> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) { auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:04x}", location.Offset()); return fmt::format_to(ctx.out(), "{:04x}", location.Offset());
} }
}; };

View File

@@ -23,7 +23,7 @@ struct fmt::formatter<Shader::Maxwell::Opcode> {
return ctx.begin(); return ctx.begin();
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) { auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", NameOf(opcode)); return fmt::format_to(ctx.out(), "{}", NameOf(opcode));
} }
}; };

View File

@@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include <fmt/format.h> #include <fmt/format.h>
#include <fmt/ranges.h>
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/polyfill_ranges.h" #include "common/polyfill_ranges.h"

View File

@@ -13,7 +13,7 @@
template <> template <>
struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::string_view> { struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::string_view> {
template <typename FormatContext> template <typename FormatContext>
auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) { auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) const {
using VideoCore::Surface::PixelFormat; using VideoCore::Surface::PixelFormat;
const string_view name = [format] { const string_view name = [format] {
switch (format) { switch (format) {
@@ -234,7 +234,7 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
template <> template <>
struct fmt::formatter<VideoCommon::ImageType> : fmt::formatter<fmt::string_view> { struct fmt::formatter<VideoCommon::ImageType> : fmt::formatter<fmt::string_view> {
template <typename FormatContext> template <typename FormatContext>
auto format(VideoCommon::ImageType type, FormatContext& ctx) { auto format(VideoCommon::ImageType type, FormatContext& ctx) const {
const string_view name = [type] { const string_view name = [type] {
using VideoCommon::ImageType; using VideoCommon::ImageType;
switch (type) { switch (type) {
@@ -262,7 +262,7 @@ struct fmt::formatter<VideoCommon::Extent3D> {
} }
template <typename FormatContext> template <typename FormatContext>
auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) { auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height, return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height,
extent.depth); extent.depth);
} }