Merge pull request #283 from dgrove-oss/cmake-extended-warnings

Enable additional compiler warnings for CMake build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f6b078e..1f34e51 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,9 @@
 
 include(DispatchAppleOptions)
 
+include(DispatchCompilerWarnings)
+dispatch_common_warnings()
+
 option(ENABLE_DISPATCH_INIT_CONSTRUCTOR "enable libdispatch_init as a constructor" ON)
 set(USE_LIBDISPATCH_INIT_CONSTRUCTOR ${ENABLE_DISPATCH_INIT_CONSTRUCTOR})
 
diff --git a/cmake/modules/DispatchCompilerWarnings.cmake b/cmake/modules/DispatchCompilerWarnings.cmake
new file mode 100644
index 0000000..2ae27cd
--- /dev/null
+++ b/cmake/modules/DispatchCompilerWarnings.cmake
@@ -0,0 +1,90 @@
+
+if("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")
+  # TODO: someone needs to provide the msvc equivalent warning flags
+  macro(dispatch_common_warnings)
+  endmacro()
+else()
+  macro(dispatch_common_warnings)
+	add_compile_options(-Werror)
+	add_compile_options(-Wall)
+	add_compile_options(-Wextra)
+	add_compile_options(-Wno-unknown-warning-option)
+	add_compile_options(-Wno-trigraphs)
+	add_compile_options(-Wmissing-field-initializers)
+	add_compile_options(-Wmissing-prototypes)
+	add_compile_options(-Wdocumentation)
+	add_compile_options(-Wunreachable-code)
+	add_compile_options(-Wmissing-braces)
+	add_compile_options(-Wparentheses)
+	add_compile_options(-Wswitch)
+	add_compile_options(-Wunused-function)
+	add_compile_options(-Wunused-label)
+	add_compile_options(-Wunused-parameter)
+	add_compile_options(-Wunused-variable)
+	add_compile_options(-Wunused-value)
+	add_compile_options(-Wempty-body)
+	add_compile_options(-Wuninitialized)
+	add_compile_options(-Wunknown-pragmas)
+	add_compile_options(-Wshadow)
+	add_compile_options(-Wno-four-char-constants)
+	add_compile_options(-Wconversion)
+	add_compile_options(-Wconstant-conversion)
+	add_compile_options(-Wint-conversion)
+	add_compile_options(-Wbool-conversion)
+	add_compile_options(-Wenum-conversion)
+	add_compile_options(-Wassign-enum)
+	add_compile_options(-Wsign-compare)
+	add_compile_options(-Wshorten-64-to-32)
+	add_compile_options(-Wpointer-sign)
+	add_compile_options(-Wnewline-eof)
+	add_compile_options(-Wdeprecated-declarations)
+	add_compile_options(-Wsign-conversion)
+	add_compile_options(-Winfinite-recursion)
+	add_compile_options(-Warray-bounds-pointer-arithmetic)
+	add_compile_options(-Watomic-properties)
+	add_compile_options(-Wcomma)
+	add_compile_options(-Wconditional-uninitialized)
+	add_compile_options(-Wcovered-switch-default)
+	add_compile_options(-Wdate-time)
+	add_compile_options(-Wdeprecated)
+	add_compile_options(-Wdouble-promotion)
+	add_compile_options(-Wduplicate-enum)
+	add_compile_options(-Wexpansion-to-defined)
+	add_compile_options(-Wfloat-equal)
+	add_compile_options(-Widiomatic-parentheses)
+	add_compile_options(-Wignored-qualifiers)
+	add_compile_options(-Wimplicit-fallthrough)
+	add_compile_options(-Wnullable-to-nonnull-conversion)
+	add_compile_options(-Wobjc-interface-ivars)
+	add_compile_options(-Wover-aligned)
+	add_compile_options(-Wpacked)
+	add_compile_options(-Wpointer-arith)
+	add_compile_options(-Wselector)
+	add_compile_options(-Wstatic-in-inline)
+	add_compile_options(-Wsuper-class-method-mismatch)
+	add_compile_options(-Wswitch-enum)
+	add_compile_options(-Wtautological-compare)
+	add_compile_options(-Wunguarded-availability)
+	add_compile_options(-Wunused)
+	add_compile_options(-Wno-disabled-macro-expansion)
+	add_compile_options(-Wno-pedantic)
+	add_compile_options(-Wno-bad-function-cast)
+	add_compile_options(-Wno-c++-compat)
+	add_compile_options(-Wno-c++98-compat)
+	add_compile_options(-Wno-c++98-compat-pedantic)
+	add_compile_options(-Wno-cast-align)
+	add_compile_options(-Wno-cast-qual)
+	add_compile_options(-Wno-documentation-unknown-command)
+	add_compile_options(-Wno-format-nonliteral)
+	add_compile_options(-Wno-missing-variable-declarations)
+	add_compile_options(-Wno-old-style-cast)
+	add_compile_options(-Wno-padded)
+	add_compile_options(-Wno-reserved-id-macro)
+	add_compile_options(-Wno-shift-sign-overflow)
+	add_compile_options(-Wno-undef)
+	add_compile_options(-Wno-unreachable-code-aggressive)
+	add_compile_options(-Wno-unused-macros)
+	add_compile_options(-Wno-used-but-marked-unused)
+	add_compile_options(-Wno-vla)
+  endmacro()
+endif()
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3ecd069..0f8628f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -59,7 +59,7 @@
 endif()
 
 function(add_unit_test name)
-  set(options DISABLED_TEST)
+  set(options DISABLED_TEST;NO_BSD_OVERLAY)
   set(single_value_args)
   set(multiple_value_args SOURCES)
   cmake_parse_arguments(AUT "${options}" "${single_value_args}" "${multiple_value_args}" ${ARGN})
@@ -84,7 +84,7 @@
                                SYSTEM BEFORE PRIVATE
                                  "${WITH_BLOCKS_RUNTIME}")
   endif()
-  if(BSD_OVERLAY_FOUND)
+  if(BSD_OVERLAY_FOUND AND NOT AUT_NO_BSD_OVERLAY)
     target_compile_options(${name}
                            PRIVATE
                              ${BSD_OVERLAY_CFLAGS})
@@ -96,7 +96,7 @@
   if(WITH_BLOCKS_RUNTIME)
     target_link_libraries(${name} PRIVATE BlocksRuntime)
   endif()
-  if(BSD_OVERLAY_FOUND)
+  if(BSD_OVERLAY_FOUND AND NOT AUT_NO_BSD_OVERLAY)
     target_link_libraries(${name}
                           PRIVATE
                             ${BSD_OVERLAY_LDFLAGS})
@@ -122,10 +122,10 @@
   endif()
 endfunction()
 
+# Tests that reliably pass on all platforms
 set(DISPATCH_C_TESTS
     apply
     api
-    c99
     debug
     queue_finalizer
     group
@@ -143,11 +143,9 @@
     data
     io_net
     select)
-set(DISPATCH_CPP_TESTS
-    plusplus)
 
-# Tests that usually pass, but occasionally fail
-# and are therefore not suitable for general CI usage.
+# Tests that usually pass, but occasionally fail.
+# Excluded by default for purposes of Swift CI
 if(EXTENDED_TEST_SUITE)
   list(APPEND DISPATCH_C_TESTS
 	priority
@@ -165,7 +163,7 @@
   target_compile_options(dispatch_priority2 PRIVATE -DUSE_SET_TARGET_QUEUE=1)
 endif()
 
-# Tests for platform-specific functionality
+# add C tests for platform-specific functionality when applicable
 if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
   list(APPEND DISPATCH_C_TESTS
 	deadname
@@ -179,11 +177,10 @@
                 SOURCES
                   dispatch_${test}.c)
 endforeach()
-foreach(test ${DISPATCH_CPP_TESTS})
-  add_unit_test(dispatch_${test}
-                SOURCES
-                  dispatch_${test}.cpp)
-endforeach()
+
+# test dispatch API for various C/CXX language variants
+add_unit_test(dispatch_c99 NO_BSD_OVERLAY SOURCES dispatch_c99.c)
+add_unit_test(dispatch_plusplus SOURCES dispatch_plusplus.cpp)
 
 # test-specific link options
 target_link_libraries(dispatch_group PRIVATE m)