Merge pull request #9105 from Morph1984/warnings

general: Treat more warnings as errors
merge-requests/60/head
bunnei 2022-10-23 17:25:18 +07:00 committed by GitHub
commit 0313ee7793
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 117 additions and 171 deletions

@ -541,9 +541,9 @@ add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
# Adjustments for MSVC + Ninja # Adjustments for MSVC + Ninja
if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja") if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
add_compile_options( add_compile_options(
/wd4711 # function 'function' selected for automatic inline expansion
/wd4464 # relative include path contains '..' /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() endif()

@ -58,13 +58,11 @@ if (MSVC)
# Warnings # Warnings
/W3 /W3
/we4018 # 'expression': signed/unsigned mismatch /WX
/we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled /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 /we4189 # 'identifier': local variable is initialized but not referenced
/we4265 # 'class': class has virtual functions, but destructor is not virtual /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 /we4388 # 'expression': signed/unsigned mismatch
/we4389 # 'operator': signed/unsigned mismatch /we4389 # 'operator': signed/unsigned mismatch
/we4456 # Declaration of 'identifier' hides previous local declaration /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 /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'? /we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'?
/we4555 # Expression has no effect; expected expression with side-effect /we4555 # Expression has no effect; expected expression with side-effect
/we4715 # 'function': not all control paths return a value /we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior.
/we4834 # Discarding return value of function with 'nodiscard' attribute
/we5038 # data member 'member1' will be initialized after data member 'member2' /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 /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) 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) set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
else() else()
add_compile_options( add_compile_options(
-Wall -Werror=all
-Werror=array-bounds -Werror=extra
-Werror=implicit-fallthrough
-Werror=missing-declarations -Werror=missing-declarations
-Werror=missing-field-initializers
-Werror=reorder
-Werror=shadow -Werror=shadow
-Werror=sign-compare -Werror=unused
-Werror=switch
-Werror=uninitialized
-Werror=unused-function
-Werror=unused-result
-Werror=unused-variable
-Wextra
-Wmissing-declarations
-Wno-attributes -Wno-attributes
-Wno-invalid-offsetof -Wno-invalid-offsetof
-Wno-unused-parameter -Wno-unused-parameter
$<$<CXX_COMPILER_ID:Clang>:-Wno-braced-scalar-init>
$<$<CXX_COMPILER_ID:Clang>:-Wno-unused-private-field>
) )
if (ARCHITECTURE_x86_64) if (ARCHITECTURE_x86_64)

@ -206,20 +206,11 @@ if (MSVC)
/we4244 # 'conversion': 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 /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 /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
/we4456 # Declaration of 'identifier' hides previous local declaration /we4800 # Implicit conversion from 'type' to bool. Possible information loss
/we4457 # Declaration of 'identifier' hides function parameter
/we4458 # Declaration of 'identifier' hides class member
/we4459 # Declaration of 'identifier' hides global declaration
) )
else() else()
target_compile_options(audio_core PRIVATE target_compile_options(audio_core PRIVATE
-Werror=conversion -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 -Wno-sign-conversion
) )

@ -91,7 +91,7 @@ Result InfoUpdater::UpdateVoices(VoiceContext& voice_context,
voice_info.Initialize(); voice_info.Initialize();
for (u32 channel = 0; channel < in_param.channel_count; channel++) { 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) { void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) {
auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)}; auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)};
if (needs_init) { if (needs_init) {
std::memset(state_, 0, sizeof(VoiceState::BiquadFilterState)); *state_ = {};
} }
auto input_buffer{ auto input_buffer{

@ -30,7 +30,7 @@ void MultiTapBiquadFilterCommand::Process(const ADSP::CommandListProcessor& proc
for (u32 i = 0; i < filter_tap_count; i++) { for (u32 i = 0; i < filter_tap_count; i++) {
auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])}; auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])};
if (needs_init[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, ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state,

@ -156,12 +156,13 @@ if (MSVC)
) )
target_compile_options(common PRIVATE target_compile_options(common PRIVATE
/W4 /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() else()
target_compile_options(common PRIVATE target_compile_options(common PRIVATE
-Werror
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
) )
endif() endif()

@ -141,10 +141,6 @@ public:
constexpr BitField(BitField&&) noexcept = default; constexpr BitField(BitField&&) noexcept = default;
constexpr BitField& operator=(BitField&&) noexcept = default; constexpr BitField& operator=(BitField&&) noexcept = default;
[[nodiscard]] constexpr operator T() const {
return Value();
}
constexpr void Assign(const T& value) { constexpr void Assign(const T& value) {
#ifdef _MSC_VER #ifdef _MSC_VER
storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value)); storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value));
@ -162,6 +158,17 @@ public:
return ExtractValue(storage); 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 { [[nodiscard]] constexpr explicit operator bool() const {
return Value() != 0; return Value() != 0;
} }

@ -21,11 +21,6 @@ constexpr size_t hardware_interference_size = std::hardware_destructive_interfer
constexpr size_t hardware_interference_size = 64; constexpr size_t hardware_interference_size = 64;
#endif #endif
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4324)
#endif
template <typename T, size_t capacity = 0x400> template <typename T, size_t capacity = 0x400>
class MPSCQueue { class MPSCQueue {
public: public:
@ -160,8 +155,4 @@ private:
static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible"); static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible");
}; };
#ifdef _MSC_VER
#pragma warning(pop)
#endif
} // namespace Common } // namespace Common

@ -774,19 +774,15 @@ if (MSVC)
/we4244 # 'conversion': 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 /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 /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() else()
target_compile_options(core PRIVATE target_compile_options(core PRIVATE
-Werror=conversion -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 -Wno-sign-conversion
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
) )
endif() endif()

@ -232,8 +232,8 @@ const std::vector<std::shared_ptr<NCA>>& XCI::GetNCAs() const {
std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const { std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const {
const auto program_id = secure_partition->GetProgramTitleID(); const auto program_id = secure_partition->GetProgramTitleID();
const auto iter = std::find_if( const auto iter =
ncas.begin(), ncas.end(), [this, type, program_id](const std::shared_ptr<NCA>& nca) { 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 nca->GetType() == type && nca->GetTitleId() == program_id;
}); });
return iter == ncas.end() ? nullptr : *iter; return iter == ncas.end() ? nullptr : *iter;

@ -127,7 +127,7 @@ void ProgramMetadata::LoadManual(bool is_64_bit, ProgramAddressSpaceType address
} }
bool ProgramMetadata::Is64BitProgram() const { bool ProgramMetadata::Is64BitProgram() const {
return npdm_header.has_64_bit_instructions; return npdm_header.has_64_bit_instructions.As<bool>();
} }
ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const { 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; const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type;
switch (type) { switch (type) {
case NpadStyleIndex::ProController: case NpadStyleIndex::ProController:
return supported_style_tag.fullkey; return supported_style_tag.fullkey.As<bool>();
case NpadStyleIndex::Handheld: case NpadStyleIndex::Handheld:
return supported_style_tag.handheld; return supported_style_tag.handheld.As<bool>();
case NpadStyleIndex::JoyconDual: case NpadStyleIndex::JoyconDual:
return supported_style_tag.joycon_dual; return supported_style_tag.joycon_dual.As<bool>();
case NpadStyleIndex::JoyconLeft: case NpadStyleIndex::JoyconLeft:
return supported_style_tag.joycon_left; return supported_style_tag.joycon_left.As<bool>();
case NpadStyleIndex::JoyconRight: case NpadStyleIndex::JoyconRight:
return supported_style_tag.joycon_right; return supported_style_tag.joycon_right.As<bool>();
case NpadStyleIndex::GameCube: case NpadStyleIndex::GameCube:
return supported_style_tag.gamecube; return supported_style_tag.gamecube.As<bool>();
case NpadStyleIndex::Pokeball: case NpadStyleIndex::Pokeball:
return supported_style_tag.palma; return supported_style_tag.palma.As<bool>();
case NpadStyleIndex::NES: case NpadStyleIndex::NES:
return supported_style_tag.lark; return supported_style_tag.lark.As<bool>();
case NpadStyleIndex::SNES: case NpadStyleIndex::SNES:
return supported_style_tag.lucia; return supported_style_tag.lucia.As<bool>();
case NpadStyleIndex::N64: case NpadStyleIndex::N64:
return supported_style_tag.lagoon; return supported_style_tag.lagoon.As<bool>();
case NpadStyleIndex::SegaGenesis: case NpadStyleIndex::SegaGenesis:
return supported_style_tag.lager; return supported_style_tag.lager.As<bool>();
default: default:
return false; return false;
} }

@ -406,7 +406,7 @@ inline s32 RequestParser::Pop() {
} }
// Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects. // 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 push
#pragma GCC diagnostic ignored "-Wclass-memaccess" #pragma GCC diagnostic ignored "-Wclass-memaccess"
#endif #endif
@ -417,7 +417,7 @@ void RequestParser::PopRaw(T& value) {
std::memcpy(&value, cmdbuf + index, sizeof(T)); std::memcpy(&value, cmdbuf + index, sizeof(T));
index += (sizeof(T) + 3) / 4; // round up to word length 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 #pragma GCC diagnostic pop
#endif #endif

@ -751,8 +751,8 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) {
} }
system.GetReporter().SaveSvcBreakReport( system.GetReporter().SaveSvcBreakReport(
static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger, info1, static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger.As<bool>(),
info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt); info1, info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt);
if (!break_reason.signal_debugger) { if (!break_reason.signal_debugger) {
LOG_CRITICAL( LOG_CRITICAL(

@ -164,7 +164,7 @@ protected:
u32_le size; u32_le size;
u32_le library_version; u32_le library_version;
u32_le theme_color; u32_le theme_color;
u8 play_startup_sound; bool play_startup_sound;
u64_le system_tick; u64_le system_tick;
}; };
static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size."); 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(); Core::HID::NpadStyleTag style = GetSupportedStyleSet();
switch (controller) { switch (controller) {
case Core::HID::NpadStyleIndex::ProController: case Core::HID::NpadStyleIndex::ProController:
return style.fullkey; return style.fullkey.As<bool>();
case Core::HID::NpadStyleIndex::JoyconDual: case Core::HID::NpadStyleIndex::JoyconDual:
return style.joycon_dual; return style.joycon_dual.As<bool>();
case Core::HID::NpadStyleIndex::JoyconLeft: case Core::HID::NpadStyleIndex::JoyconLeft:
return style.joycon_left; return style.joycon_left.As<bool>();
case Core::HID::NpadStyleIndex::JoyconRight: case Core::HID::NpadStyleIndex::JoyconRight:
return style.joycon_right; return style.joycon_right.As<bool>();
case Core::HID::NpadStyleIndex::GameCube: case Core::HID::NpadStyleIndex::GameCube:
return style.gamecube; return style.gamecube.As<bool>();
case Core::HID::NpadStyleIndex::Pokeball: case Core::HID::NpadStyleIndex::Pokeball:
return style.palma; return style.palma.As<bool>();
case Core::HID::NpadStyleIndex::NES: case Core::HID::NpadStyleIndex::NES:
return style.lark; return style.lark.As<bool>();
case Core::HID::NpadStyleIndex::SNES: case Core::HID::NpadStyleIndex::SNES:
return style.lucia; return style.lucia.As<bool>();
case Core::HID::NpadStyleIndex::N64: case Core::HID::NpadStyleIndex::N64:
return style.lagoon; return style.lagoon.As<bool>();
case Core::HID::NpadStyleIndex::SegaGenesis: case Core::HID::NpadStyleIndex::SegaGenesis:
return style.lager; return style.lager.As<bool>();
default: default:
return false; return false;
} }

@ -233,18 +233,17 @@ struct Memory::Impl {
current_vaddr, src_addr, size); current_vaddr, src_addr, size);
std::memset(dest_buffer, 0, copy_amount); 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); std::memcpy(dest_buffer, src_ptr, copy_amount);
}, },
[&system = system, &dest_buffer](const VAddr current_vaddr, [&](const VAddr current_vaddr, const std::size_t copy_amount,
const std::size_t copy_amount,
const u8* const host_ptr) { const u8* const host_ptr) {
if constexpr (!UNSAFE) { if constexpr (!UNSAFE) {
system.GPU().FlushRegion(current_vaddr, copy_amount); system.GPU().FlushRegion(current_vaddr, copy_amount);
} }
std::memcpy(dest_buffer, host_ptr, 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; 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 = {})", "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
current_vaddr, dest_addr, 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); std::memcpy(dest_ptr, src_buffer, copy_amount);
}, },
[&system = system, &src_buffer](const VAddr current_vaddr, [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
const std::size_t copy_amount, u8* const host_ptr) {
if constexpr (!UNSAFE) { if constexpr (!UNSAFE) {
system.GPU().InvalidateRegion(current_vaddr, copy_amount); system.GPU().InvalidateRegion(current_vaddr, copy_amount);
} }
std::memcpy(host_ptr, src_buffer, 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; 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) { [](const std::size_t copy_amount, u8* const dest_ptr) {
std::memset(dest_ptr, 0, copy_amount); std::memset(dest_ptr, 0, copy_amount);
}, },
[&system = system](const VAddr current_vaddr, const std::size_t copy_amount, [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) {
u8* const host_ptr) {
system.GPU().InvalidateRegion(current_vaddr, copy_amount); system.GPU().InvalidateRegion(current_vaddr, copy_amount);
std::memset(host_ptr, 0, copy_amount); std::memset(host_ptr, 0, copy_amount);
}, },
@ -313,22 +310,20 @@ struct Memory::Impl {
const std::size_t size) { const std::size_t size) {
WalkBlock( WalkBlock(
process, dest_addr, size, process, dest_addr, size,
[this, &process, &dest_addr, &src_addr, size](const std::size_t copy_amount, [&](const std::size_t copy_amount, const VAddr current_vaddr) {
const VAddr current_vaddr) {
LOG_ERROR(HW_Memory, LOG_ERROR(HW_Memory,
"Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})",
current_vaddr, src_addr, size); current_vaddr, src_addr, size);
ZeroBlock(process, dest_addr, copy_amount); 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); 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); system.GPU().FlushRegion(current_vaddr, copy_amount);
WriteBlockImpl<false>(process, dest_addr, host_ptr, 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); dest_addr += static_cast<VAddr>(copy_amount);
src_addr += static_cast<VAddr>(copy_amount); src_addr += static_cast<VAddr>(copy_amount);
}); });
@ -575,7 +570,7 @@ struct Memory::Impl {
[vaddr]() { [vaddr]() {
LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, 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) { if (ptr) {
std::memcpy(&result, ptr, sizeof(T)); 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, LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8,
vaddr, static_cast<u64>(data)); vaddr, static_cast<u64>(data));
}, },
[&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); }); [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); });
if (ptr) { if (ptr) {
std::memcpy(ptr, &data, sizeof(T)); std::memcpy(ptr, &data, sizeof(T));
} }
@ -613,7 +608,7 @@ struct Memory::Impl {
LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}",
sizeof(T) * 8, vaddr, static_cast<u64>(data)); 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) { if (ptr) {
const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr); const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr);
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); 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}", LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}",
vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0])); 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) { if (ptr) {
const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr); const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr);
return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); return Common::AtomicCompareAndSwap(volatile_pointer, data, expected);

@ -39,21 +39,14 @@ add_library(input_common STATIC
if (MSVC) if (MSVC)
target_compile_options(input_common PRIVATE target_compile_options(input_common PRIVATE
/W4 /W4
/WX
/we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data /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 /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() else()
target_compile_options(input_common PRIVATE target_compile_options(input_common PRIVATE
-Werror
-Werror=conversion -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() endif()

@ -40,8 +40,8 @@ public:
void EnableMotion() { void EnableMotion() {
if (sdl_controller) { if (sdl_controller) {
SDL_GameController* controller = sdl_controller.get(); SDL_GameController* controller = sdl_controller.get();
has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL); has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE;
has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO); has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE;
if (has_accel) { if (has_accel) {
SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE); 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 button_id = params.Get("button", 0);
const auto keyboard_key = params.Get("code", 0); const auto keyboard_key = params.Get("code", 0);
const auto toggle = params.Get("toggle", false); const auto toggle = params.Get("toggle", false) != 0;
const auto inverted = params.Get("inverted", false); const auto inverted = params.Get("inverted", false) != 0;
input_engine->PreSetController(identifier); input_engine->PreSetController(identifier);
input_engine->PreSetButton(identifier, button_id); input_engine->PreSetButton(identifier, button_id);
input_engine->PreSetButton(identifier, keyboard_key); 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 button_id = params.Get("hat", 0);
const auto direction = input_engine->GetHatButtonId(params.Get("direction", "")); const auto direction = input_engine->GetHatButtonId(params.Get("direction", ""));
const auto toggle = params.Get("toggle", false); const auto toggle = params.Get("toggle", false) != 0;
const auto inverted = params.Get("inverted", false); const auto inverted = params.Get("inverted", false) != 0;
input_engine->PreSetController(identifier); input_engine->PreSetController(identifier);
input_engine->PreSetHatButton(identifier, button_id); 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), .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
.offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f), .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
.inverted = params.Get("invert", "+") == "-", .inverted = params.Get("invert", "+") == "-",
.toggle = static_cast<bool>(params.Get("toggle", false)), .toggle = params.Get("toggle", false) != 0,
}; };
input_engine->PreSetController(identifier); input_engine->PreSetController(identifier);
input_engine->PreSetAxis(identifier, axis); 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 button = params.Get("button", 0);
const auto toggle = params.Get("toggle", false); const auto toggle = params.Get("toggle", false) != 0;
const auto inverted = params.Get("inverted", false); const auto inverted = params.Get("inverted", false) != 0;
const auto axis = params.Get("axis", 0); const auto axis = params.Get("axis", 0);
const Common::Input::AnalogProperties properties = { 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 button = params.Get("button", 0);
const auto toggle = params.Get("toggle", false); const auto toggle = params.Get("toggle", false) != 0;
const auto inverted = params.Get("inverted", false); const auto inverted = params.Get("inverted", false) != 0;
const auto axis_x = params.Get("axis_x", 0); const auto axis_x = params.Get("axis_x", 0);
const Common::Input::AnalogProperties properties_x = { const Common::Input::AnalogProperties properties_x = {

@ -241,24 +241,14 @@ target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit)
if (MSVC) if (MSVC)
target_compile_options(shader_recompiler PRIVATE target_compile_options(shader_recompiler PRIVATE
/W4 /W4
/WX
/we4018 # 'expression' : signed/unsigned mismatch /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
/we4244 # 'argument' : conversion from 'type1' to 'type2', possible loss of data (floating-point)
/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 /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 /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() else()
target_compile_options(shader_recompiler PRIVATE target_compile_options(shader_recompiler PRIVATE
-Werror
-Werror=conversion -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. # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6.
# And this in turns limits the size of a std::array. # 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/backend/glasm/glasm_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h" #include "shader_recompiler/frontend/ir/value.h"
#ifdef _MSC_VER
#pragma warning(disable : 4100)
#endif
namespace Shader::Backend::GLASM { namespace Shader::Backend::GLASM {
#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__)

@ -7,10 +7,6 @@
#include "shader_recompiler/backend/glsl/glsl_emit_context.h" #include "shader_recompiler/backend/glsl/glsl_emit_context.h"
#include "shader_recompiler/frontend/ir/value.h" #include "shader_recompiler/frontend/ir/value.h"
#ifdef _MSC_VER
#pragma warning(disable : 4100)
#endif
namespace Shader::Backend::GLSL { namespace Shader::Backend::GLSL {
void EmitGetRegister(EmitContext& ctx) { void EmitGetRegister(EmitContext& ctx) {

@ -279,14 +279,8 @@ if (MSVC)
else() else()
target_compile_options(video_core PRIVATE target_compile_options(video_core PRIVATE
-Werror=conversion -Werror=conversion
-Wno-error=sign-conversion
-Werror=pessimizing-move
-Werror=redundant-move
-Werror=type-limits
$<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess> -Wno-sign-conversion
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
) )
endif() endif()

@ -133,7 +133,7 @@ inline void MemoryManager::SetBigPageContinous(size_t big_page_index, bool value
template <MemoryManager::EntryType entry_type> template <MemoryManager::EntryType entry_type>
GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size, GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size,
PTEKind kind) { PTEKind kind) {
u64 remaining_size{size}; [[maybe_unused]] u64 remaining_size{size};
if constexpr (entry_type == EntryType::Mapped) { if constexpr (entry_type == EntryType::Mapped) {
page_table.ReserveRange(gpu_addr, size); 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> template <MemoryManager::EntryType entry_type>
GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr,
size_t size, PTEKind kind) { size_t size, PTEKind kind) {
u64 remaining_size{size}; [[maybe_unused]] u64 remaining_size{size};
for (u64 offset{}; offset < size; offset += big_page_size) { for (u64 offset{}; offset < size; offset += big_page_size) {
const GPUVAddr current_gpu_addr = gpu_addr + offset; const GPUVAddr current_gpu_addr = gpu_addr + offset;
[[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr); [[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> template <class P>
void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) { void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) {
std::vector<ImageId> images; 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()) { if (!image.IsSafeDownload()) {
return; return;
} }
@ -1502,7 +1502,7 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) {
image.flags &= ~ImageFlagBits::BadOverlap; image.flags &= ~ImageFlagBits::BadOverlap;
lru_cache.Free(image.lru_index); lru_cache.Free(image.lru_index);
const auto& clear_page_table = const auto& clear_page_table =
[this, image_id](u64 page, [image_id](u64 page,
std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>& std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>&
selected_page_table) { selected_page_table) {
const auto page_it = selected_page_table.find(page); const auto page_it = selected_page_table.find(page);

@ -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) { for (u32 z = 0; z < depth; ++z) {
const u32 depth_offset = z * height * width * 4; const u32 depth_offset = z * height * width * 4;
for (u32 y_index = 0; y_index < rows; ++y_index) { for (u32 y_index = 0; y_index < rows; ++y_index) {
auto decompress_stride = [data, width, height, depth, block_width, block_height, output, auto decompress_stride = [data, width, height, block_width, block_height, output, rows,
rows, cols, z, depth_offset, y_index] { cols, z, depth_offset, y_index] {
const u32 y = y_index * block_height; const u32 y = y_index * block_height;
for (u32 x_index = 0; x_index < cols; ++x_index) { for (u32 x_index = 0; x_index < cols; ++x_index) {
const u32 block_index = (z * rows * cols) + (y_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; u32 m = mask;
for (u32 bit = 1; m; bit += bit) { for (u32 bit = 1; m; bit += bit) {
if (value & bit) if (value & bit)
result |= m & -m; result |= m & (~m + 1);
m &= m - 1; m &= m - 1;
} }
return result; return result;

@ -268,7 +268,7 @@ bool MultiplayerState::OnCloseRoom() {
return true; return true;
} }
// Save ban list // Save ban list
UISettings::values.multiplayer_ban_list = std::move(room->GetBanList()); UISettings::values.multiplayer_ban_list = room->GetBanList();
room->Destroy(); room->Destroy();
announce_multiplayer_session->Stop(); announce_multiplayer_session->Stop();

@ -49,7 +49,7 @@ bool CheckEnvVars(bool* is_child) {
*is_child = true; *is_child = true;
return false; return false;
} else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) { } 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()); IS_CHILD_ENV_VAR, GetLastError());
return true; 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 // Set the startup variable for child processes
const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT); const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT);
if (!env_var_set) { 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()); STARTUP_CHECK_ENV_VAR, GetLastError());
return false; return false;
} }
@ -81,22 +81,22 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka
DWORD exit_code = STILL_ACTIVE; DWORD exit_code = STILL_ACTIVE;
const int err = GetExitCodeProcess(process_info.hProcess, &exit_code); const int err = GetExitCodeProcess(process_info.hProcess, &exit_code);
if (err == 0) { 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) // Vulkan is broken if the child crashed (return value is not zero)
*has_broken_vulkan = (exit_code != 0); *has_broken_vulkan = (exit_code != 0);
if (CloseHandle(process_info.hProcess) == 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) { 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)) { 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()); 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); startup_info.cb = sizeof(startup_info);
char p_name[255]; 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 const bool process_created = CreateProcessA(nullptr, // lpApplicationName
p_name, // lpCommandLine p_name, // lpCommandLine
@ -149,7 +150,7 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) {
pi // lpProcessInformation pi // lpProcessInformation
); );
if (!process_created) { 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; return false;
} }