Cleanup/MSVC: Enable C++ conformance mode on compiler versions that support it.
authorRay Molenkamp <github@lazydodo.com>
Fri, 14 Feb 2020 00:13:07 +0000 (17:13 -0700)
committerRay Molenkamp <github@lazydodo.com>
Fri, 14 Feb 2020 00:13:07 +0000 (17:13 -0700)
MSVC has a conformance mode (/permissive-) where the C++ standard is more strictly
enforced. This mode is available on MSVC 15.5+ [1]

This patch enables this mode on compilers that support it and cleans up the few violations it threw up in the process.

- Mantaflow was using M_PI without requesting them using the _USE_MATH_DEFINES define to opt in to non default behaviour.
- Collada did not include the right header for std::cerr, this seemingly was fixed for other platforms already but put inside a platform guard.
- Ghost had some scoping issues regarding uninitialized variables and goto behaviour

Second landing of this patch, earlier commit was reverted due to some compiler configurations having slipped though testing

[1] https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance

Differential Revision: https://developer.blender.org/D6824

Reviewed By: brecht

build_files/cmake/platform/platform_win32.cmake
extern/mantaflow/CMakeLists.txt
intern/ghost/intern/GHOST_ContextWGL.cpp
intern/mantaflow/CMakeLists.txt
source/blender/collada/MeshImporter.cpp

index 653b3a9f50849ec62b8ccf95e9f41c040c195123..cfa4f1c9bf746e8aa7e7371f38d81679a8b4ad1c 100644 (file)
@@ -144,6 +144,14 @@ else()
   set(CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} /nologo /J /Gd /MP /bigobj")
 endif()
 
+# C++ standards conformace (/permissive-) is available on msvc 15.5 (1912) and up
+if(MSVC_VERSION GREATER 1911 AND NOT MSVC_CLANG)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-")
+  # Two-phase name lookup does not place nicely with OpenMP yet, so disable for now
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:twoPhase-")
+endif()
+
+
 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd /ZI")
 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd /ZI")
 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
index d2f78f7ab6c1d8ebab329b88a35f95e27086af58..99d985578bd24080784c09bb780f8b270e0a262f 100644 (file)
@@ -54,6 +54,10 @@ if(WITH_OPENVDB)
   add_definitions(-DOPENVDB_STATICLIB)
 endif()
 
+if(WIN32)
+  add_definitions(-D_USE_MATH_DEFINES)
+endif()
+
 set(INC
   ${MANTA_PP}
   ${MANTA_PP}/fileio
index d4851450ce8daa533472ded9f0e6f4507f1bb691..6d5d4f753518598bdcd6a9f4332901ba1a606e1c 100644 (file)
@@ -647,9 +647,11 @@ GHOST_TSuccess GHOST_ContextWGL::initializeDrawingContext()
 
   /* Silence warnings interpreted as errors by users when trying to get
    * a context with version higher than 3.3 Core. */
-  const bool silent = m_contextMajorVersion > 3;
-  if (!WIN32_CHK_SILENT(m_hGLRC != NULL, silent)) {
-    goto error;
+  {
+    const bool silent = m_contextMajorVersion > 3;
+    if (!WIN32_CHK_SILENT(m_hGLRC != NULL, silent)) {
+      goto error;
+    }
   }
 
   s_sharedCount++;
@@ -680,15 +682,17 @@ GHOST_TSuccess GHOST_ContextWGL::initializeDrawingContext()
   ::SwapBuffers(m_hDC);
 
 #ifndef NDEBUG
-  const char *vendor = reinterpret_cast<const char *>(glGetString(GL_VENDOR));
-  const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
-  const char *version = reinterpret_cast<const char *>(glGetString(GL_VERSION));
+  {
+    const char *vendor = reinterpret_cast<const char *>(glGetString(GL_VENDOR));
+    const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
+    const char *version = reinterpret_cast<const char *>(glGetString(GL_VERSION));
 
-  reportContextString("Vendor", m_dummyVendor, vendor);
-  reportContextString("Renderer", m_dummyRenderer, renderer);
-  reportContextString("Version", m_dummyVersion, version);
+    reportContextString("Vendor", m_dummyVendor, vendor);
+    reportContextString("Renderer", m_dummyRenderer, renderer);
+    reportContextString("Version", m_dummyVersion, version);
 
-  fprintf(stderr, "Context Version: %d.%d\n", m_contextMajorVersion, m_contextMinorVersion);
+    fprintf(stderr, "Context Version: %d.%d\n", m_contextMajorVersion, m_contextMinorVersion);
+  }
 #endif
 
   return GHOST_kSuccess;
index 2d49f96a451cc46004c1d318843c8f52e5266e47..b2a0ab30a0c2d9958f8336c7b36c57be621c2498 100644 (file)
@@ -30,6 +30,11 @@ if(WITH_OPENVDB)
   add_definitions(-DOPENVDB_STATICLIB)
 endif()
 
+if(WIN32)
+  add_definitions(-D_USE_MATH_DEFINES)
+endif()
+
+
 set(INC
   extern
   intern/strings
index 14c09a95d10a25a24faa15ad4510538e076b3177..bc6dd4202b1f7d451d8d4882cbf688a44bcd9d05 100644 (file)
  */
 
 #include <algorithm>
-
-#if !defined(WIN32)
-#  include <iostream>
-#endif
+#include <iostream>
 
 /* COLLADABU_ASSERT, may be able to remove later */
 #include "COLLADABUPlatform.h"