From 2ed61b0ee1d18547d1dc662bf538c7eaab4886f7 Mon Sep 17 00:00:00 2001 From: Phil Christensen Date: Wed, 15 Feb 2017 20:37:04 -0800 Subject: [PATCH 1/2] C++ conformance fixes (MSVC /permissive-) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We (the Microsoft C++ team) use the dolphin project as part of our "Real world code" tests. I noticed a few issues in windows specific code when building dolphin with the MSVC compiler in its conformance mode (/permissive-). For more information on /permissive- see our blog https://blogs.msdn.microsoft.com/vcblog/2016/11/16/permissive-switch/. These changes are to address 3 different types of issues: 1) Use of qualified names in member declarations struct A {      void A::f() { } // error C4596: illegal qualified name in member declaration                      // remove redundant 'A::' to fix }; 2) Binding a non-const reference to a temporary struct S{};    // If arg is in 'in' parameter, then it should be made const. void func(S& arg){}    int main() {    //error C2664: 'void func(S &)': cannot convert argument 1 from 'S' to 'S &'    //note: A non-const reference may only be bound to an lvalue    func( S() );       //Work around this by creating a local, and using it to call the function    S s;    func( s ); } 3) Add missing #include Because of the workaround you are using in the code you will need to include this. This is because of changes in the libraries and not /permissive- --- Source/Core/AudioCommon/XAudio2Stream.cpp | 4 ++-- Source/Core/AudioCommon/XAudio2_7Stream.cpp | 4 ++-- Source/Core/Common/MathUtil.h | 2 ++ Source/Core/Core/HW/WiimoteReal/IOWin.cpp | 4 ++-- Source/Core/DolphinWX/Config/PathConfigPane.cpp | 2 +- Source/Core/DolphinWX/Config/PathConfigPane.h | 2 +- Source/Core/VideoBackends/D3D/GeometryShaderCache.h | 4 ++-- Source/Core/VideoBackends/D3D/VertexShaderCache.h | 2 +- Source/Core/VideoBackends/D3D12/TextureCache.cpp | 2 +- 9 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Source/Core/AudioCommon/XAudio2Stream.cpp b/Source/Core/AudioCommon/XAudio2Stream.cpp index 959cbd0b71..12954fc5bf 100644 --- a/Source/Core/AudioCommon/XAudio2Stream.cpp +++ b/Source/Core/AudioCommon/XAudio2Stream.cpp @@ -28,8 +28,8 @@ public: ~StreamingVoiceContext(); - void StreamingVoiceContext::Stop(); - void StreamingVoiceContext::Play(); + void Stop(); + void Play(); STDMETHOD_(void, OnVoiceError)(THIS_ void* pBufferContext, HRESULT Error) {} STDMETHOD_(void, OnVoiceProcessingPassStart)(UINT32) {} diff --git a/Source/Core/AudioCommon/XAudio2_7Stream.cpp b/Source/Core/AudioCommon/XAudio2_7Stream.cpp index 74df4d35c4..06fb645c95 100644 --- a/Source/Core/AudioCommon/XAudio2_7Stream.cpp +++ b/Source/Core/AudioCommon/XAudio2_7Stream.cpp @@ -28,8 +28,8 @@ public: ~StreamingVoiceContext2_7(); - void StreamingVoiceContext2_7::Stop(); - void StreamingVoiceContext2_7::Play(); + void Stop(); + void Play(); STDMETHOD_(void, OnVoiceError)(THIS_ void* pBufferContext, HRESULT Error) {} STDMETHOD_(void, OnVoiceProcessingPassStart)(UINT32) {} diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h index b9a99f6b52..c5409be663 100644 --- a/Source/Core/Common/MathUtil.h +++ b/Source/Core/Common/MathUtil.h @@ -24,6 +24,8 @@ constexpr T SNANConstant() // will use __builtin_nans, which is improperly handled by the compiler and generates // a bad constant. Here we go back to the version MSVC used before the builtin. // TODO: Remove this and use numeric_limits directly whenever this bug is fixed. +#include + template <> constexpr double SNANConstant() { diff --git a/Source/Core/Core/HW/WiimoteReal/IOWin.cpp b/Source/Core/Core/HW/WiimoteReal/IOWin.cpp index 6cfea743bb..6c9cc937e5 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOWin.cpp +++ b/Source/Core/Core/HW/WiimoteReal/IOWin.cpp @@ -187,7 +187,7 @@ int IOWrite(HANDLE& dev_handle, OVERLAPPED& hid_overlap_write, enum WinWriteMeth int IORead(HANDLE& dev_handle, OVERLAPPED& hid_overlap_read, u8* buf, int index); template -void ProcessWiimotes(bool new_scan, T& callback); +void ProcessWiimotes(bool new_scan, const T& callback); bool AttachWiimote(HANDLE hRadio, const BLUETOOTH_RADIO_INFO&, BLUETOOTH_DEVICE_INFO_STRUCT&); void RemoveWiimote(BLUETOOTH_DEVICE_INFO_STRUCT&); @@ -795,7 +795,7 @@ int WiimoteWindows::IOWrite(const u8* buf, size_t len) // invokes callback for each found Wiimote Bluetooth device template -void ProcessWiimotes(bool new_scan, T& callback) +void ProcessWiimotes(bool new_scan, const T& callback) { BLUETOOTH_DEVICE_SEARCH_PARAMS srch; srch.dwSize = sizeof(srch); diff --git a/Source/Core/DolphinWX/Config/PathConfigPane.cpp b/Source/Core/DolphinWX/Config/PathConfigPane.cpp index d9efea5ca1..d810870f48 100644 --- a/Source/Core/DolphinWX/Config/PathConfigPane.cpp +++ b/Source/Core/DolphinWX/Config/PathConfigPane.cpp @@ -147,7 +147,7 @@ void PathConfigPane::BindEvents() Bind(wxEVT_UPDATE_UI, &WxEventUtils::OnEnableIfCoreNotRunning); } -void PathConfigPane::OnISOPathSelectionChanged(wxCommandEvent& event) +void PathConfigPane::OnISOPathSelectionChanged(const wxCommandEvent& event) { m_remove_iso_path_button->Enable(m_iso_paths_listbox->GetSelection() != wxNOT_FOUND); } diff --git a/Source/Core/DolphinWX/Config/PathConfigPane.h b/Source/Core/DolphinWX/Config/PathConfigPane.h index 76a22a1586..d10c07618e 100644 --- a/Source/Core/DolphinWX/Config/PathConfigPane.h +++ b/Source/Core/DolphinWX/Config/PathConfigPane.h @@ -22,7 +22,7 @@ private: void LoadGUIValues(); void BindEvents(); - void OnISOPathSelectionChanged(wxCommandEvent&); + void OnISOPathSelectionChanged(const wxCommandEvent&); void OnRecursiveISOCheckBoxChanged(wxCommandEvent&); void OnAddISOPath(wxCommandEvent&); void OnRemoveISOPath(wxCommandEvent&); diff --git a/Source/Core/VideoBackends/D3D/GeometryShaderCache.h b/Source/Core/VideoBackends/D3D/GeometryShaderCache.h index f0cab99940..72024e52f5 100644 --- a/Source/Core/VideoBackends/D3D/GeometryShaderCache.h +++ b/Source/Core/VideoBackends/D3D/GeometryShaderCache.h @@ -21,8 +21,8 @@ public: static bool InsertByteCode(const GeometryShaderUid& uid, const void* bytecode, unsigned int bytecodelen); - static ID3D11GeometryShader* GeometryShaderCache::GetClearGeometryShader(); - static ID3D11GeometryShader* GeometryShaderCache::GetCopyGeometryShader(); + static ID3D11GeometryShader* GetClearGeometryShader(); + static ID3D11GeometryShader* GetCopyGeometryShader(); static ID3D11GeometryShader* GetActiveShader() { return last_entry->shader; } static ID3D11Buffer*& GetConstantBuffer(); diff --git a/Source/Core/VideoBackends/D3D/VertexShaderCache.h b/Source/Core/VideoBackends/D3D/VertexShaderCache.h index 7471d4f769..ba006bb954 100644 --- a/Source/Core/VideoBackends/D3D/VertexShaderCache.h +++ b/Source/Core/VideoBackends/D3D/VertexShaderCache.h @@ -30,7 +30,7 @@ public: static ID3D11InputLayout* GetSimpleInputLayout(); static ID3D11InputLayout* GetClearInputLayout(); - static bool VertexShaderCache::InsertByteCode(const VertexShaderUid& uid, D3DBlob* bcodeblob); + static bool InsertByteCode(const VertexShaderUid& uid, D3DBlob* bcodeblob); private: struct VSCacheEntry diff --git a/Source/Core/VideoBackends/D3D12/TextureCache.cpp b/Source/Core/VideoBackends/D3D12/TextureCache.cpp index 4e297dc7e8..59198dca8d 100644 --- a/Source/Core/VideoBackends/D3D12/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D12/TextureCache.cpp @@ -499,7 +499,7 @@ void TextureCache::ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* uncon g_renderer->RestoreAPIState(); } -D3D12_SHADER_BYTECODE GetConvertShader12(std::string& Type) +D3D12_SHADER_BYTECODE GetConvertShader12(const std::string& Type) { std::string shader = "#define DECODE DecodePixel_"; shader.append(Type); From 34b0b1b9d643a669ebfd3ac154003e61f693a3d2 Mon Sep 17 00:00:00 2001 From: Phil Christensen Date: Wed, 15 Feb 2017 21:20:29 -0800 Subject: [PATCH 2/2] wxWidgets expects non-const revert my previous change to these files and instead create a named temporary. --- Source/Core/DolphinWX/Config/PathConfigPane.cpp | 5 +++-- Source/Core/DolphinWX/Config/PathConfigPane.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Core/DolphinWX/Config/PathConfigPane.cpp b/Source/Core/DolphinWX/Config/PathConfigPane.cpp index d810870f48..2dc3078a56 100644 --- a/Source/Core/DolphinWX/Config/PathConfigPane.cpp +++ b/Source/Core/DolphinWX/Config/PathConfigPane.cpp @@ -147,7 +147,7 @@ void PathConfigPane::BindEvents() Bind(wxEVT_UPDATE_UI, &WxEventUtils::OnEnableIfCoreNotRunning); } -void PathConfigPane::OnISOPathSelectionChanged(const wxCommandEvent& event) +void PathConfigPane::OnISOPathSelectionChanged(wxCommandEvent& event) { m_remove_iso_path_button->Enable(m_iso_paths_listbox->GetSelection() != wxNOT_FOUND); } @@ -187,7 +187,8 @@ void PathConfigPane::OnRemoveISOPath(wxCommandEvent& event) // This seems to not be activated on Windows when it should be. wxw bug? #ifdef _WIN32 - OnISOPathSelectionChanged(wxCommandEvent()); + wxCommandEvent dummy_event{}; + OnISOPathSelectionChanged(dummy_event); #endif SaveISOPathChanges(); diff --git a/Source/Core/DolphinWX/Config/PathConfigPane.h b/Source/Core/DolphinWX/Config/PathConfigPane.h index d10c07618e..76a22a1586 100644 --- a/Source/Core/DolphinWX/Config/PathConfigPane.h +++ b/Source/Core/DolphinWX/Config/PathConfigPane.h @@ -22,7 +22,7 @@ private: void LoadGUIValues(); void BindEvents(); - void OnISOPathSelectionChanged(const wxCommandEvent&); + void OnISOPathSelectionChanged(wxCommandEvent&); void OnRecursiveISOCheckBoxChanged(wxCommandEvent&); void OnAddISOPath(wxCommandEvent&); void OnRemoveISOPath(wxCommandEvent&);