mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #9105 from Morph1984/warnings
general: Treat more warnings as errors
This commit is contained in:
		@@ -541,9 +541,9 @@ add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
 | 
			
		||||
# Adjustments for MSVC + Ninja
 | 
			
		||||
if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
 | 
			
		||||
    add_compile_options(
 | 
			
		||||
        /wd4711 # function 'function' selected for automatic inline expansion
 | 
			
		||||
        /wd4464 # relative include path contains '..'
 | 
			
		||||
        /wd4820 # 'identifier1': '4' bytes padding added after data member 'identifier2'
 | 
			
		||||
        /wd4711 # function 'function' selected for automatic inline expansion
 | 
			
		||||
        /wd4820 # 'bytes' bytes padding added after construct 'member_name'
 | 
			
		||||
    )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -58,13 +58,11 @@ if (MSVC)
 | 
			
		||||
 | 
			
		||||
        # Warnings
 | 
			
		||||
        /W3
 | 
			
		||||
        /we4018 # 'expression': signed/unsigned mismatch
 | 
			
		||||
        /WX
 | 
			
		||||
 | 
			
		||||
        /we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
 | 
			
		||||
        /we4101 # 'identifier': unreferenced local variable
 | 
			
		||||
        /we4189 # 'identifier': local variable is initialized but not referenced
 | 
			
		||||
        /we4265 # 'class': class has virtual functions, but destructor is not virtual
 | 
			
		||||
        /we4267 # 'var': conversion from 'size_t' to 'type', possible loss of data
 | 
			
		||||
        /we4305 # 'context': truncation from 'type1' to 'type2'
 | 
			
		||||
        /we4388 # 'expression': signed/unsigned mismatch
 | 
			
		||||
        /we4389 # 'operator': signed/unsigned mismatch
 | 
			
		||||
        /we4456 # Declaration of 'identifier' hides previous local declaration
 | 
			
		||||
@@ -75,10 +73,13 @@ if (MSVC)
 | 
			
		||||
        /we4547 # 'operator': operator before comma has no effect; expected operator with side-effect
 | 
			
		||||
        /we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'?
 | 
			
		||||
        /we4555 # Expression has no effect; expected expression with side-effect
 | 
			
		||||
        /we4715 # 'function': not all control paths return a value
 | 
			
		||||
        /we4834 # Discarding return value of function with 'nodiscard' attribute
 | 
			
		||||
        /we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior.
 | 
			
		||||
        /we5038 # data member 'member1' will be initialized after data member 'member2'
 | 
			
		||||
        /we5233 # explicit lambda capture 'identifier' is not used
 | 
			
		||||
        /we5245 # 'function': unreferenced function with internal linkage has been removed
 | 
			
		||||
 | 
			
		||||
        /wd4100 # 'identifier': unreferenced formal parameter
 | 
			
		||||
        /wd4324 # 'struct_name': structure was padded due to __declspec(align())
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if (USE_CCACHE)
 | 
			
		||||
@@ -99,24 +100,18 @@ if (MSVC)
 | 
			
		||||
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
 | 
			
		||||
else()
 | 
			
		||||
    add_compile_options(
 | 
			
		||||
        -Wall
 | 
			
		||||
        -Werror=array-bounds
 | 
			
		||||
        -Werror=implicit-fallthrough
 | 
			
		||||
        -Werror=all
 | 
			
		||||
        -Werror=extra
 | 
			
		||||
        -Werror=missing-declarations
 | 
			
		||||
        -Werror=missing-field-initializers
 | 
			
		||||
        -Werror=reorder
 | 
			
		||||
        -Werror=shadow
 | 
			
		||||
        -Werror=sign-compare
 | 
			
		||||
        -Werror=switch
 | 
			
		||||
        -Werror=uninitialized
 | 
			
		||||
        -Werror=unused-function
 | 
			
		||||
        -Werror=unused-result
 | 
			
		||||
        -Werror=unused-variable
 | 
			
		||||
        -Wextra
 | 
			
		||||
        -Wmissing-declarations
 | 
			
		||||
        -Werror=unused
 | 
			
		||||
 | 
			
		||||
        -Wno-attributes
 | 
			
		||||
        -Wno-invalid-offsetof
 | 
			
		||||
        -Wno-unused-parameter
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:Clang>:-Wno-braced-scalar-init>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:Clang>:-Wno-unused-private-field>
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    if (ARCHITECTURE_x86_64)
 | 
			
		||||
 
 | 
			
		||||
@@ -206,20 +206,11 @@ if (MSVC)
 | 
			
		||||
        /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
        /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
 | 
			
		||||
        /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
 | 
			
		||||
        /we4456 # Declaration of 'identifier' hides previous local declaration
 | 
			
		||||
        /we4457 # Declaration of 'identifier' hides function parameter
 | 
			
		||||
        /we4458 # Declaration of 'identifier' hides class member
 | 
			
		||||
        /we4459 # Declaration of 'identifier' hides global declaration
 | 
			
		||||
        /we4800 # Implicit conversion from 'type' to bool. Possible information loss
 | 
			
		||||
    )
 | 
			
		||||
else()
 | 
			
		||||
    target_compile_options(audio_core PRIVATE
 | 
			
		||||
        -Werror=conversion
 | 
			
		||||
        -Werror=ignored-qualifiers
 | 
			
		||||
        -Werror=shadow
 | 
			
		||||
        -Werror=unused-variable
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
 | 
			
		||||
 | 
			
		||||
        -Wno-sign-conversion
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -91,7 +91,7 @@ Result InfoUpdater::UpdateVoices(VoiceContext& voice_context,
 | 
			
		||||
            voice_info.Initialize();
 | 
			
		||||
 | 
			
		||||
            for (u32 channel = 0; channel < in_param.channel_count; channel++) {
 | 
			
		||||
                std::memset(voice_states[channel], 0, sizeof(VoiceState));
 | 
			
		||||
                *voice_states[channel] = {};
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ void BiquadFilterCommand::Dump([[maybe_unused]] const ADSP::CommandListProcessor
 | 
			
		||||
void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) {
 | 
			
		||||
    auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)};
 | 
			
		||||
    if (needs_init) {
 | 
			
		||||
        std::memset(state_, 0, sizeof(VoiceState::BiquadFilterState));
 | 
			
		||||
        *state_ = {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto input_buffer{
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ void MultiTapBiquadFilterCommand::Process(const ADSP::CommandListProcessor& proc
 | 
			
		||||
    for (u32 i = 0; i < filter_tap_count; i++) {
 | 
			
		||||
        auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])};
 | 
			
		||||
        if (needs_init[i]) {
 | 
			
		||||
            std::memset(state, 0, sizeof(VoiceState::BiquadFilterState));
 | 
			
		||||
            *state = {};
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state,
 | 
			
		||||
 
 | 
			
		||||
@@ -156,12 +156,13 @@ if (MSVC)
 | 
			
		||||
  )
 | 
			
		||||
  target_compile_options(common PRIVATE
 | 
			
		||||
    /W4
 | 
			
		||||
    /WX
 | 
			
		||||
 | 
			
		||||
    /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
    /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
 | 
			
		||||
    /we4800 # Implicit conversion from 'type' to bool. Possible information loss
 | 
			
		||||
  )
 | 
			
		||||
else()
 | 
			
		||||
  target_compile_options(common PRIVATE
 | 
			
		||||
    -Werror
 | 
			
		||||
 | 
			
		||||
    $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
 | 
			
		||||
  )
 | 
			
		||||
endif()
 | 
			
		||||
 
 | 
			
		||||
@@ -141,10 +141,6 @@ public:
 | 
			
		||||
    constexpr BitField(BitField&&) noexcept = default;
 | 
			
		||||
    constexpr BitField& operator=(BitField&&) noexcept = default;
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] constexpr operator T() const {
 | 
			
		||||
        return Value();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constexpr void Assign(const T& value) {
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
        storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value));
 | 
			
		||||
@@ -162,6 +158,17 @@ public:
 | 
			
		||||
        return ExtractValue(storage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename ConvertedToType>
 | 
			
		||||
    [[nodiscard]] constexpr ConvertedToType As() const {
 | 
			
		||||
        static_assert(!std::is_same_v<T, ConvertedToType>,
 | 
			
		||||
                      "Unnecessary cast. Use Value() instead.");
 | 
			
		||||
        return static_cast<ConvertedToType>(Value());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] constexpr operator T() const {
 | 
			
		||||
        return Value();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] constexpr explicit operator bool() const {
 | 
			
		||||
        return Value() != 0;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,11 +21,6 @@ constexpr size_t hardware_interference_size = std::hardware_destructive_interfer
 | 
			
		||||
constexpr size_t hardware_interference_size = 64;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(push)
 | 
			
		||||
#pragma warning(disable : 4324)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template <typename T, size_t capacity = 0x400>
 | 
			
		||||
class MPSCQueue {
 | 
			
		||||
public:
 | 
			
		||||
@@ -160,8 +155,4 @@ private:
 | 
			
		||||
    static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible");
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace Common
 | 
			
		||||
 
 | 
			
		||||
@@ -774,19 +774,15 @@ if (MSVC)
 | 
			
		||||
        /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
        /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
 | 
			
		||||
        /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
 | 
			
		||||
        /we4800 # Implicit conversion from 'type' to bool. Possible information loss
 | 
			
		||||
    )
 | 
			
		||||
else()
 | 
			
		||||
    target_compile_options(core PRIVATE
 | 
			
		||||
        -Werror=conversion
 | 
			
		||||
        -Werror=ignored-qualifiers
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
 | 
			
		||||
 | 
			
		||||
        -Wno-sign-conversion
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
 | 
			
		||||
    )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -232,8 +232,8 @@ const std::vector<std::shared_ptr<NCA>>& XCI::GetNCAs() const {
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const {
 | 
			
		||||
    const auto program_id = secure_partition->GetProgramTitleID();
 | 
			
		||||
    const auto iter = std::find_if(
 | 
			
		||||
        ncas.begin(), ncas.end(), [this, type, program_id](const std::shared_ptr<NCA>& nca) {
 | 
			
		||||
    const auto iter =
 | 
			
		||||
        std::find_if(ncas.begin(), ncas.end(), [type, program_id](const std::shared_ptr<NCA>& nca) {
 | 
			
		||||
            return nca->GetType() == type && nca->GetTitleId() == program_id;
 | 
			
		||||
        });
 | 
			
		||||
    return iter == ncas.end() ? nullptr : *iter;
 | 
			
		||||
 
 | 
			
		||||
@@ -127,7 +127,7 @@ void ProgramMetadata::LoadManual(bool is_64_bit, ProgramAddressSpaceType address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ProgramMetadata::Is64BitProgram() const {
 | 
			
		||||
    return npdm_header.has_64_bit_instructions;
 | 
			
		||||
    return npdm_header.has_64_bit_instructions.As<bool>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const {
 | 
			
		||||
 
 | 
			
		||||
@@ -1158,27 +1158,27 @@ bool EmulatedController::IsControllerSupported(bool use_temporary_value) const {
 | 
			
		||||
    const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type;
 | 
			
		||||
    switch (type) {
 | 
			
		||||
    case NpadStyleIndex::ProController:
 | 
			
		||||
        return supported_style_tag.fullkey;
 | 
			
		||||
        return supported_style_tag.fullkey.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::Handheld:
 | 
			
		||||
        return supported_style_tag.handheld;
 | 
			
		||||
        return supported_style_tag.handheld.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::JoyconDual:
 | 
			
		||||
        return supported_style_tag.joycon_dual;
 | 
			
		||||
        return supported_style_tag.joycon_dual.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::JoyconLeft:
 | 
			
		||||
        return supported_style_tag.joycon_left;
 | 
			
		||||
        return supported_style_tag.joycon_left.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::JoyconRight:
 | 
			
		||||
        return supported_style_tag.joycon_right;
 | 
			
		||||
        return supported_style_tag.joycon_right.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::GameCube:
 | 
			
		||||
        return supported_style_tag.gamecube;
 | 
			
		||||
        return supported_style_tag.gamecube.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::Pokeball:
 | 
			
		||||
        return supported_style_tag.palma;
 | 
			
		||||
        return supported_style_tag.palma.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::NES:
 | 
			
		||||
        return supported_style_tag.lark;
 | 
			
		||||
        return supported_style_tag.lark.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::SNES:
 | 
			
		||||
        return supported_style_tag.lucia;
 | 
			
		||||
        return supported_style_tag.lucia.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::N64:
 | 
			
		||||
        return supported_style_tag.lagoon;
 | 
			
		||||
        return supported_style_tag.lagoon.As<bool>();
 | 
			
		||||
    case NpadStyleIndex::SegaGenesis:
 | 
			
		||||
        return supported_style_tag.lager;
 | 
			
		||||
        return supported_style_tag.lager.As<bool>();
 | 
			
		||||
    default:
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -406,7 +406,7 @@ inline s32 RequestParser::Pop() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects.
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wclass-memaccess"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -417,7 +417,7 @@ void RequestParser::PopRaw(T& value) {
 | 
			
		||||
    std::memcpy(&value, cmdbuf + index, sizeof(T));
 | 
			
		||||
    index += (sizeof(T) + 3) / 4; // round up to word length
 | 
			
		||||
}
 | 
			
		||||
#if defined(__GNUC__)
 | 
			
		||||
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -751,8 +751,8 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    system.GetReporter().SaveSvcBreakReport(
 | 
			
		||||
        static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger, info1,
 | 
			
		||||
        info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
 | 
			
		||||
        static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger.As<bool>(),
 | 
			
		||||
        info1, info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
 | 
			
		||||
 | 
			
		||||
    if (!break_reason.signal_debugger) {
 | 
			
		||||
        LOG_CRITICAL(
 | 
			
		||||
 
 | 
			
		||||
@@ -164,7 +164,7 @@ protected:
 | 
			
		||||
        u32_le size;
 | 
			
		||||
        u32_le library_version;
 | 
			
		||||
        u32_le theme_color;
 | 
			
		||||
        u8 play_startup_sound;
 | 
			
		||||
        bool play_startup_sound;
 | 
			
		||||
        u64_le system_tick;
 | 
			
		||||
    };
 | 
			
		||||
    static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
 | 
			
		||||
 
 | 
			
		||||
@@ -1502,25 +1502,25 @@ bool Controller_NPad::IsControllerSupported(Core::HID::NpadStyleIndex controller
 | 
			
		||||
        Core::HID::NpadStyleTag style = GetSupportedStyleSet();
 | 
			
		||||
        switch (controller) {
 | 
			
		||||
        case Core::HID::NpadStyleIndex::ProController:
 | 
			
		||||
            return style.fullkey;
 | 
			
		||||
            return style.fullkey.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::JoyconDual:
 | 
			
		||||
            return style.joycon_dual;
 | 
			
		||||
            return style.joycon_dual.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::JoyconLeft:
 | 
			
		||||
            return style.joycon_left;
 | 
			
		||||
            return style.joycon_left.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::JoyconRight:
 | 
			
		||||
            return style.joycon_right;
 | 
			
		||||
            return style.joycon_right.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::GameCube:
 | 
			
		||||
            return style.gamecube;
 | 
			
		||||
            return style.gamecube.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::Pokeball:
 | 
			
		||||
            return style.palma;
 | 
			
		||||
            return style.palma.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::NES:
 | 
			
		||||
            return style.lark;
 | 
			
		||||
            return style.lark.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::SNES:
 | 
			
		||||
            return style.lucia;
 | 
			
		||||
            return style.lucia.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::N64:
 | 
			
		||||
            return style.lagoon;
 | 
			
		||||
            return style.lagoon.As<bool>();
 | 
			
		||||
        case Core::HID::NpadStyleIndex::SegaGenesis:
 | 
			
		||||
            return style.lager;
 | 
			
		||||
            return style.lager.As<bool>();
 | 
			
		||||
        default:
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -233,18 +233,17 @@ struct Memory::Impl {
 | 
			
		||||
                          current_vaddr, src_addr, size);
 | 
			
		||||
                std::memset(dest_buffer, 0, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&dest_buffer](const std::size_t copy_amount, const u8* const src_ptr) {
 | 
			
		||||
            [&](const std::size_t copy_amount, const u8* const src_ptr) {
 | 
			
		||||
                std::memcpy(dest_buffer, src_ptr, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, &dest_buffer](const VAddr current_vaddr,
 | 
			
		||||
                                             const std::size_t copy_amount,
 | 
			
		||||
                                             const u8* const host_ptr) {
 | 
			
		||||
            [&](const VAddr current_vaddr, const std::size_t copy_amount,
 | 
			
		||||
                const u8* const host_ptr) {
 | 
			
		||||
                if constexpr (!UNSAFE) {
 | 
			
		||||
                    system.GPU().FlushRegion(current_vaddr, copy_amount);
 | 
			
		||||
                }
 | 
			
		||||
                std::memcpy(dest_buffer, host_ptr, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&dest_buffer](const std::size_t copy_amount) {
 | 
			
		||||
            [&](const std::size_t copy_amount) {
 | 
			
		||||
                dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount;
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
@@ -267,17 +266,16 @@ struct Memory::Impl {
 | 
			
		||||
                          "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
 | 
			
		||||
                          current_vaddr, dest_addr, size);
 | 
			
		||||
            },
 | 
			
		||||
            [&src_buffer](const std::size_t copy_amount, u8* const dest_ptr) {
 | 
			
		||||
            [&](const std::size_t copy_amount, u8* const dest_ptr) {
 | 
			
		||||
                std::memcpy(dest_ptr, src_buffer, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, &src_buffer](const VAddr current_vaddr,
 | 
			
		||||
                                            const std::size_t copy_amount, u8* const host_ptr) {
 | 
			
		||||
            [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
 | 
			
		||||
                if constexpr (!UNSAFE) {
 | 
			
		||||
                    system.GPU().InvalidateRegion(current_vaddr, copy_amount);
 | 
			
		||||
                }
 | 
			
		||||
                std::memcpy(host_ptr, src_buffer, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&src_buffer](const std::size_t copy_amount) {
 | 
			
		||||
            [&](const std::size_t copy_amount) {
 | 
			
		||||
                src_buffer = static_cast<const u8*>(src_buffer) + copy_amount;
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
@@ -301,8 +299,7 @@ struct Memory::Impl {
 | 
			
		||||
            [](const std::size_t copy_amount, u8* const dest_ptr) {
 | 
			
		||||
                std::memset(dest_ptr, 0, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system](const VAddr current_vaddr, const std::size_t copy_amount,
 | 
			
		||||
                               u8* const host_ptr) {
 | 
			
		||||
            [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
 | 
			
		||||
                system.GPU().InvalidateRegion(current_vaddr, copy_amount);
 | 
			
		||||
                std::memset(host_ptr, 0, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
@@ -313,22 +310,20 @@ struct Memory::Impl {
 | 
			
		||||
                   const std::size_t size) {
 | 
			
		||||
        WalkBlock(
 | 
			
		||||
            process, dest_addr, size,
 | 
			
		||||
            [this, &process, &dest_addr, &src_addr, size](const std::size_t copy_amount,
 | 
			
		||||
                                                          const VAddr current_vaddr) {
 | 
			
		||||
            [&](const std::size_t copy_amount, const VAddr current_vaddr) {
 | 
			
		||||
                LOG_ERROR(HW_Memory,
 | 
			
		||||
                          "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
 | 
			
		||||
                          current_vaddr, src_addr, size);
 | 
			
		||||
                ZeroBlock(process, dest_addr, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [this, &process, &dest_addr](const std::size_t copy_amount, const u8* const src_ptr) {
 | 
			
		||||
            [&](const std::size_t copy_amount, const u8* const src_ptr) {
 | 
			
		||||
                WriteBlockImpl<false>(process, dest_addr, src_ptr, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [this, &system = system, &process, &dest_addr](
 | 
			
		||||
                const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
 | 
			
		||||
            [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
 | 
			
		||||
                system.GPU().FlushRegion(current_vaddr, copy_amount);
 | 
			
		||||
                WriteBlockImpl<false>(process, dest_addr, host_ptr, copy_amount);
 | 
			
		||||
            },
 | 
			
		||||
            [&dest_addr, &src_addr](const std::size_t copy_amount) {
 | 
			
		||||
            [&](const std::size_t copy_amount) {
 | 
			
		||||
                dest_addr += static_cast<VAddr>(copy_amount);
 | 
			
		||||
                src_addr += static_cast<VAddr>(copy_amount);
 | 
			
		||||
            });
 | 
			
		||||
@@ -575,7 +570,7 @@ struct Memory::Impl {
 | 
			
		||||
            [vaddr]() {
 | 
			
		||||
                LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, vaddr);
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, vaddr]() { system.GPU().FlushRegion(vaddr, sizeof(T)); });
 | 
			
		||||
            [&]() { system.GPU().FlushRegion(vaddr, sizeof(T)); });
 | 
			
		||||
        if (ptr) {
 | 
			
		||||
            std::memcpy(&result, ptr, sizeof(T));
 | 
			
		||||
        }
 | 
			
		||||
@@ -599,7 +594,7 @@ struct Memory::Impl {
 | 
			
		||||
                LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8,
 | 
			
		||||
                          vaddr, static_cast<u64>(data));
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
 | 
			
		||||
            [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
 | 
			
		||||
        if (ptr) {
 | 
			
		||||
            std::memcpy(ptr, &data, sizeof(T));
 | 
			
		||||
        }
 | 
			
		||||
@@ -613,7 +608,7 @@ struct Memory::Impl {
 | 
			
		||||
                LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}",
 | 
			
		||||
                          sizeof(T) * 8, vaddr, static_cast<u64>(data));
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
 | 
			
		||||
            [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
 | 
			
		||||
        if (ptr) {
 | 
			
		||||
            const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr);
 | 
			
		||||
            return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
 | 
			
		||||
@@ -628,7 +623,7 @@ struct Memory::Impl {
 | 
			
		||||
                LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}",
 | 
			
		||||
                          vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0]));
 | 
			
		||||
            },
 | 
			
		||||
            [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); });
 | 
			
		||||
            [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); });
 | 
			
		||||
        if (ptr) {
 | 
			
		||||
            const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr);
 | 
			
		||||
            return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);
 | 
			
		||||
 
 | 
			
		||||
@@ -39,21 +39,14 @@ add_library(input_common STATIC
 | 
			
		||||
if (MSVC)
 | 
			
		||||
    target_compile_options(input_common PRIVATE
 | 
			
		||||
        /W4
 | 
			
		||||
        /WX
 | 
			
		||||
 | 
			
		||||
        /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
        /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
        /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
 | 
			
		||||
        /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
 | 
			
		||||
        /we4800 # Implicit conversion from 'type' to bool. Possible information loss
 | 
			
		||||
    )
 | 
			
		||||
else()
 | 
			
		||||
    target_compile_options(input_common PRIVATE
 | 
			
		||||
        -Werror
 | 
			
		||||
        -Werror=conversion
 | 
			
		||||
        -Werror=ignored-qualifiers
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
 | 
			
		||||
        -Werror=unused-variable
 | 
			
		||||
    )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,8 +40,8 @@ public:
 | 
			
		||||
    void EnableMotion() {
 | 
			
		||||
        if (sdl_controller) {
 | 
			
		||||
            SDL_GameController* controller = sdl_controller.get();
 | 
			
		||||
            has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL);
 | 
			
		||||
            has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO);
 | 
			
		||||
            has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE;
 | 
			
		||||
            has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE;
 | 
			
		||||
            if (has_accel) {
 | 
			
		||||
                SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -797,8 +797,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateButtonDevice(
 | 
			
		||||
 | 
			
		||||
    const auto button_id = params.Get("button", 0);
 | 
			
		||||
    const auto keyboard_key = params.Get("code", 0);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false);
 | 
			
		||||
    const auto inverted = params.Get("inverted", false);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false) != 0;
 | 
			
		||||
    const auto inverted = params.Get("inverted", false) != 0;
 | 
			
		||||
    input_engine->PreSetController(identifier);
 | 
			
		||||
    input_engine->PreSetButton(identifier, button_id);
 | 
			
		||||
    input_engine->PreSetButton(identifier, keyboard_key);
 | 
			
		||||
@@ -820,8 +820,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateHatButtonDevice(
 | 
			
		||||
 | 
			
		||||
    const auto button_id = params.Get("hat", 0);
 | 
			
		||||
    const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
 | 
			
		||||
    const auto toggle = params.Get("toggle", false);
 | 
			
		||||
    const auto inverted = params.Get("inverted", false);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false) != 0;
 | 
			
		||||
    const auto inverted = params.Get("inverted", false) != 0;
 | 
			
		||||
 | 
			
		||||
    input_engine->PreSetController(identifier);
 | 
			
		||||
    input_engine->PreSetHatButton(identifier, button_id);
 | 
			
		||||
@@ -879,7 +879,7 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice(
 | 
			
		||||
        .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
 | 
			
		||||
        .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
 | 
			
		||||
        .inverted = params.Get("invert", "+") == "-",
 | 
			
		||||
        .toggle = static_cast<bool>(params.Get("toggle", false)),
 | 
			
		||||
        .toggle = params.Get("toggle", false) != 0,
 | 
			
		||||
    };
 | 
			
		||||
    input_engine->PreSetController(identifier);
 | 
			
		||||
    input_engine->PreSetAxis(identifier, axis);
 | 
			
		||||
@@ -895,8 +895,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTriggerDevice(
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const auto button = params.Get("button", 0);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false);
 | 
			
		||||
    const auto inverted = params.Get("inverted", false);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false) != 0;
 | 
			
		||||
    const auto inverted = params.Get("inverted", false) != 0;
 | 
			
		||||
 | 
			
		||||
    const auto axis = params.Get("axis", 0);
 | 
			
		||||
    const Common::Input::AnalogProperties properties = {
 | 
			
		||||
@@ -926,8 +926,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTouchDevice(
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const auto button = params.Get("button", 0);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false);
 | 
			
		||||
    const auto inverted = params.Get("inverted", false);
 | 
			
		||||
    const auto toggle = params.Get("toggle", false) != 0;
 | 
			
		||||
    const auto inverted = params.Get("inverted", false) != 0;
 | 
			
		||||
 | 
			
		||||
    const auto axis_x = params.Get("axis_x", 0);
 | 
			
		||||
    const Common::Input::AnalogProperties properties_x = {
 | 
			
		||||
 
 | 
			
		||||
@@ -241,24 +241,14 @@ target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit)
 | 
			
		||||
if (MSVC)
 | 
			
		||||
    target_compile_options(shader_recompiler PRIVATE
 | 
			
		||||
        /W4
 | 
			
		||||
        /WX
 | 
			
		||||
        /we4018 # 'expression' : signed/unsigned mismatch
 | 
			
		||||
        /we4244 # 'argument' : conversion from 'type1' to 'type2', possible loss of data (floating-point)
 | 
			
		||||
        /we4245 # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
 | 
			
		||||
 | 
			
		||||
        /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
 | 
			
		||||
        /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
 | 
			
		||||
        /we4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data
 | 
			
		||||
        /we4305 # 'context' : truncation from 'type1' to 'type2'
 | 
			
		||||
        /we4800 # Implicit conversion from 'type' to bool. Possible information loss
 | 
			
		||||
        /we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior.
 | 
			
		||||
    )
 | 
			
		||||
else()
 | 
			
		||||
    target_compile_options(shader_recompiler PRIVATE
 | 
			
		||||
        -Werror
 | 
			
		||||
        -Werror=conversion
 | 
			
		||||
        -Werror=ignored-qualifiers
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
 | 
			
		||||
        -Werror=unused-variable
 | 
			
		||||
 | 
			
		||||
        # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6.
 | 
			
		||||
        # And this in turns limits the size of a std::array.
 | 
			
		||||
 
 | 
			
		||||
@@ -5,10 +5,6 @@
 | 
			
		||||
#include "shader_recompiler/backend/glasm/glasm_emit_context.h"
 | 
			
		||||
#include "shader_recompiler/frontend/ir/value.h"
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(disable : 4100)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace Shader::Backend::GLASM {
 | 
			
		||||
 | 
			
		||||
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,6 @@
 | 
			
		||||
#include "shader_recompiler/backend/glsl/glsl_emit_context.h"
 | 
			
		||||
#include "shader_recompiler/frontend/ir/value.h"
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(disable : 4100)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace Shader::Backend::GLSL {
 | 
			
		||||
 | 
			
		||||
void EmitGetRegister(EmitContext& ctx) {
 | 
			
		||||
 
 | 
			
		||||
@@ -279,14 +279,8 @@ if (MSVC)
 | 
			
		||||
else()
 | 
			
		||||
    target_compile_options(video_core PRIVATE
 | 
			
		||||
        -Werror=conversion
 | 
			
		||||
        -Wno-error=sign-conversion
 | 
			
		||||
        -Werror=pessimizing-move
 | 
			
		||||
        -Werror=redundant-move
 | 
			
		||||
        -Werror=type-limits
 | 
			
		||||
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
 | 
			
		||||
        $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
 | 
			
		||||
        -Wno-sign-conversion
 | 
			
		||||
    )
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ inline void MemoryManager::SetBigPageContinous(size_t big_page_index, bool value
 | 
			
		||||
template <MemoryManager::EntryType entry_type>
 | 
			
		||||
GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size,
 | 
			
		||||
                                    PTEKind kind) {
 | 
			
		||||
    u64 remaining_size{size};
 | 
			
		||||
    [[maybe_unused]] u64 remaining_size{size};
 | 
			
		||||
    if constexpr (entry_type == EntryType::Mapped) {
 | 
			
		||||
        page_table.ReserveRange(gpu_addr, size);
 | 
			
		||||
    }
 | 
			
		||||
@@ -159,7 +159,7 @@ GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cp
 | 
			
		||||
template <MemoryManager::EntryType entry_type>
 | 
			
		||||
GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr,
 | 
			
		||||
                                       size_t size, PTEKind kind) {
 | 
			
		||||
    u64 remaining_size{size};
 | 
			
		||||
    [[maybe_unused]] u64 remaining_size{size};
 | 
			
		||||
    for (u64 offset{}; offset < size; offset += big_page_size) {
 | 
			
		||||
        const GPUVAddr current_gpu_addr = gpu_addr + offset;
 | 
			
		||||
        [[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr);
 | 
			
		||||
 
 | 
			
		||||
@@ -442,7 +442,7 @@ void TextureCache<P>::WriteMemory(VAddr cpu_addr, size_t size) {
 | 
			
		||||
template <class P>
 | 
			
		||||
void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) {
 | 
			
		||||
    std::vector<ImageId> images;
 | 
			
		||||
    ForEachImageInRegion(cpu_addr, size, [this, &images](ImageId image_id, ImageBase& image) {
 | 
			
		||||
    ForEachImageInRegion(cpu_addr, size, [&images](ImageId image_id, ImageBase& image) {
 | 
			
		||||
        if (!image.IsSafeDownload()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1502,9 +1502,9 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) {
 | 
			
		||||
    image.flags &= ~ImageFlagBits::BadOverlap;
 | 
			
		||||
    lru_cache.Free(image.lru_index);
 | 
			
		||||
    const auto& clear_page_table =
 | 
			
		||||
        [this, image_id](u64 page,
 | 
			
		||||
                         std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
 | 
			
		||||
                             selected_page_table) {
 | 
			
		||||
        [image_id](u64 page,
 | 
			
		||||
                   std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
 | 
			
		||||
                       selected_page_table) {
 | 
			
		||||
            const auto page_it = selected_page_table.find(page);
 | 
			
		||||
            if (page_it == selected_page_table.end()) {
 | 
			
		||||
                ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS);
 | 
			
		||||
 
 | 
			
		||||
@@ -1661,8 +1661,8 @@ void Decompress(std::span<const uint8_t> data, uint32_t width, uint32_t height,
 | 
			
		||||
    for (u32 z = 0; z < depth; ++z) {
 | 
			
		||||
        const u32 depth_offset = z * height * width * 4;
 | 
			
		||||
        for (u32 y_index = 0; y_index < rows; ++y_index) {
 | 
			
		||||
            auto decompress_stride = [data, width, height, depth, block_width, block_height, output,
 | 
			
		||||
                                      rows, cols, z, depth_offset, y_index] {
 | 
			
		||||
            auto decompress_stride = [data, width, height, block_width, block_height, output, rows,
 | 
			
		||||
                                      cols, z, depth_offset, y_index] {
 | 
			
		||||
                const u32 y = y_index * block_height;
 | 
			
		||||
                for (u32 x_index = 0; x_index < cols; ++x_index) {
 | 
			
		||||
                    const u32 block_index = (z * rows * cols) + (y_index * cols) + x_index;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ constexpr u32 pdep(u32 value) {
 | 
			
		||||
    u32 m = mask;
 | 
			
		||||
    for (u32 bit = 1; m; bit += bit) {
 | 
			
		||||
        if (value & bit)
 | 
			
		||||
            result |= m & -m;
 | 
			
		||||
            result |= m & (~m + 1);
 | 
			
		||||
        m &= m - 1;
 | 
			
		||||
    }
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
@@ -268,7 +268,7 @@ bool MultiplayerState::OnCloseRoom() {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // Save ban list
 | 
			
		||||
        UISettings::values.multiplayer_ban_list = std::move(room->GetBanList());
 | 
			
		||||
        UISettings::values.multiplayer_ban_list = room->GetBanList();
 | 
			
		||||
 | 
			
		||||
        room->Destroy();
 | 
			
		||||
        announce_multiplayer_session->Stop();
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ bool CheckEnvVars(bool* is_child) {
 | 
			
		||||
        *is_child = true;
 | 
			
		||||
        return false;
 | 
			
		||||
    } else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) {
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n",
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n",
 | 
			
		||||
                     IS_CHILD_ENV_VAR, GetLastError());
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -62,7 +62,7 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka
 | 
			
		||||
    // Set the startup variable for child processes
 | 
			
		||||
    const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT);
 | 
			
		||||
    if (!env_var_set) {
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n",
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n",
 | 
			
		||||
                     STARTUP_CHECK_ENV_VAR, GetLastError());
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -81,22 +81,22 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka
 | 
			
		||||
        DWORD exit_code = STILL_ACTIVE;
 | 
			
		||||
        const int err = GetExitCodeProcess(process_info.hProcess, &exit_code);
 | 
			
		||||
        if (err == 0) {
 | 
			
		||||
            std::fprintf(stderr, "GetExitCodeProcess failed with error %d\n", GetLastError());
 | 
			
		||||
            std::fprintf(stderr, "GetExitCodeProcess failed with error %lu\n", GetLastError());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Vulkan is broken if the child crashed (return value is not zero)
 | 
			
		||||
        *has_broken_vulkan = (exit_code != 0);
 | 
			
		||||
 | 
			
		||||
        if (CloseHandle(process_info.hProcess) == 0) {
 | 
			
		||||
            std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError());
 | 
			
		||||
            std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError());
 | 
			
		||||
        }
 | 
			
		||||
        if (CloseHandle(process_info.hThread) == 0) {
 | 
			
		||||
            std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError());
 | 
			
		||||
            std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, nullptr)) {
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %d\n",
 | 
			
		||||
        std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %lu\n",
 | 
			
		||||
                     STARTUP_CHECK_ENV_VAR, GetLastError());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -135,7 +135,8 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) {
 | 
			
		||||
    startup_info.cb = sizeof(startup_info);
 | 
			
		||||
 | 
			
		||||
    char p_name[255];
 | 
			
		||||
    std::strncpy(p_name, arg0, 255);
 | 
			
		||||
    std::strncpy(p_name, arg0, 254);
 | 
			
		||||
    p_name[254] = '\0';
 | 
			
		||||
 | 
			
		||||
    const bool process_created = CreateProcessA(nullptr,       // lpApplicationName
 | 
			
		||||
                                                p_name,        // lpCommandLine
 | 
			
		||||
@@ -149,7 +150,7 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) {
 | 
			
		||||
                                                pi             // lpProcessInformation
 | 
			
		||||
    );
 | 
			
		||||
    if (!process_created) {
 | 
			
		||||
        std::fprintf(stderr, "CreateProcessA failed with error %d\n", GetLastError());
 | 
			
		||||
        std::fprintf(stderr, "CreateProcessA failed with error %lu\n", GetLastError());
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user