From e9b269a284db69c6e19ceba79075e017a33e7f99 Mon Sep 17 00:00:00 2001
From: David Robillard <d@drobilla.net>
Date: Sat, 4 Jul 2020 14:02:01 +0200
Subject: Clean up and strengthen warning flags

---
 waflib  |  2 +-
 wscript | 98 ++++++++++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 64 insertions(+), 36 deletions(-)

diff --git a/waflib b/waflib
index c7d3468..158a547 160000
--- a/waflib
+++ b/waflib
@@ -1 +1 @@
-Subproject commit c7d3468459863bab4b6a155f203746102df78c1f
+Subproject commit 158a547ad7b9a01f991d2c378e17f704a99c6584
diff --git a/wscript b/wscript
index 0c1f5a4..48a9bc2 100644
--- a/wscript
+++ b/wscript
@@ -62,47 +62,75 @@ def configure(conf):
         conf.find_program("clang-tidy", var="CLANG_TIDY", mandatory=False)
         conf.find_program("iwyu_tool", var="IWYU_TOOL", mandatory=False)
 
-    def append_cflags(flags):
-        conf.env.append_value('CFLAGS', flags)
-        conf.env.append_value('CXXFLAGS', flags)
-
-    if conf.env.MSVC_COMPILER:
-        append_cflags(['/wd4191', '/wd4355'])
-    else:
-        if Options.options.ultra_strict:
-            append_cflags(['-Wunused-parameter', '-Wno-pedantic'])
-            if conf.env.TARGET_PLATFORM == "win32":
-                append_cflags(['-Wno-cast-function-type'])
-
-    if Options.options.ultra_strict and 'clang' in conf.env.CC[0]:
-        for var in ['CFLAGS', 'CXXFLAGS']:
-            flags = conf.env[var]
-            conf.env[var] = [f for f in flags
-                             if not (f.startswith('-W') and f != '-Werror')]
-
-            conf.env.append_value(var, [
-                '-Weverything',
+    if Options.options.ultra_strict:
+        # All warnings enabled by autowaf, disable some we trigger
+        conf.add_compiler_flags('*', {
+            'clang': [
                 '-Wno-bad-function-cast',
                 '-Wno-float-equal',
-                '-Wno-format-nonliteral',
                 '-Wno-implicit-fallthrough',
                 '-Wno-padded',
                 '-Wno-reserved-id-macro',
                 '-Wno-switch-enum',
-            ])
-
-        conf.env.append_value('CXXFLAGS', [
-            '-Wno-c++98-compat',
-            '-Wno-c++98-compat-pedantic',
-            '-Wno-documentation-unknown-command',
-            '-Wno-old-style-cast',
-        ])
-
-    if conf.env.TARGET_PLATFORM == 'darwin':
-        append_cflags(['-DGL_SILENCE_DEPRECATION',
-                       '-Wno-deprecated-declarations',
-                       '-Wno-direct-ivar-access'])
-
+            ],
+            'gcc': [
+                '-Wno-float-equal',
+                '-Wno-padded',
+                '-Wno-switch-default',
+                '-Wno-switch-enum',
+            ],
+            'msvc': [
+                '/wd4061',  # enumerator in switch is not explicitly handled
+                '/wd4191',  # unsafe conversion from type to type
+                '/wd4355',  # 'this' used in base member initializer list
+                '/wd4514',  # unreferenced inline function has been removed
+                '/wd4571',  # structured exceptions (SEH) are no longer caught
+                '/wd4625',  # copy constructor implicitly deleted
+                '/wd4626',  # assignment operator implicitly deleted
+                '/wd4706',  # assignment within conditional expression
+                '/wd4710',  # function not inlined
+                '/wd4820',  # padding added after construct
+                '/wd5026',  # move constructor implicitly defined as deleted
+                '/wd5027',  # move assignment operator implicitly deleted
+                '/wd5045',  # will insert Spectre mitigation for memory load
+            ],
+        })
+
+        conf.add_compiler_flags('c', {
+            'gcc': ['-Wno-bad-function-cast'],
+        })
+
+        conf.add_compiler_flags('cxx', {
+            'clang': [
+                '-Wno-c++98-compat',
+                '-Wno-c++98-compat-pedantic',
+                '-Wno-documentation-unknown-command',
+                '-Wno-old-style-cast',
+            ],
+            'gcc': [
+                '-Wno-old-style-cast',
+            ],
+        })
+
+        # Add some platform-specific warning suppressions
+        if conf.env.TARGET_PLATFORM == "win32":
+            conf.add_compiler_flags('*', {
+                'gcc': ['-Wno-cast-function-type',
+                        '-Wno-conversion',
+                        '-Wno-format',
+                        '-Wno-suggest-attribute=format'],
+            })
+        elif conf.env.TARGET_PLATFORM == 'darwin':
+            conf.add_compiler_flags('*', {
+                'clang': ['-DGL_SILENCE_DEPRECATION',
+                          '-Wno-deprecated-declarations',
+                          '-Wno-direct-ivar-access'],
+                'gcc': ['-DGL_SILENCE_DEPRECATION',
+                        '-Wno-deprecated-declarations',
+                        '-Wno-direct-ivar-access'],
+            })
+
+    # Check for base system libraries needed on some systems
     conf.check_cc(lib='m', uselib_store='M', mandatory=False)
     conf.check_cc(lib='dl', uselib_store='DL', mandatory=False)
 
-- 
cgit v1.2.1