# General code to enable approximately all warnings.
#
# This is trivial for clang and MSVC, but GCC does not have such an option, and
# has several esoteric warnings, so we need to enable everything we want
# explicitly.  We enable everything that does not require a value argument,
# except for warnings that are only relevant for very old languages (earlier
# than C99 or C++11) or non-standard extensions.
#
# Omitted common warnings:
#
# Wabi=
# Waggregate-return
# Walloc-size-larger-than=BYTES
# Walloca-larger-than=BYTES
# Wframe-larger-than=BYTES
# Wlarger-than=BYTES
# Wstack-usage=BYTES
# Wsystem-headers
# Wtraditional
# Wtraditional-conversion
# Wtrampolines
# Wvla-larger-than=BYTES
#
# Omitted C warnings:
#
# Wc90-c99-compat
# Wdeclaration-after-statement
# Wtraditional
# Wtraditional-conversion
#
# Omitted C++ warnings:
#
# Wnamespaces
# Wtemplates

gcc_common_warnings = [
  '-Walloc-zero',
  '-Walloca',
  '-Wanalyzer-too-complex',
  '-Warith-conversion',
  '-Warray-bounds=2',
  '-Wattribute-alias=2',
  '-Wcast-align=strict',
  '-Wcast-qual',
  '-Wconversion',
  '-Wdate-time',
  '-Wdisabled-optimization',
  '-Wdouble-promotion',
  '-Wduplicated-branches',
  '-Wduplicated-cond',
  '-Wfloat-equal',
  '-Wformat-overflow=2',
  '-Wformat-signedness',
  '-Wformat-truncation=2',
  '-Wformat=2',
  '-Wimplicit-fallthrough=2',
  '-Winit-self',
  '-Winline',
  '-Winvalid-pch',
  '-Wlogical-op',
  '-Wmissing-declarations',
  '-Wmissing-include-dirs',
  '-Wmultichar',
  '-Wnormalized=nfc',
  '-Wnull-dereference',
  '-Wpacked',
  '-Wpadded',
  '-Wredundant-decls',
  '-Wscalar-storage-order',
  '-Wshadow',
  '-Wshift-overflow=2',
  '-Wsizeof-array-argument',
  '-Wstack-protector',
  '-Wstrict-aliasing=3',
  '-Wstrict-overflow=5',
  '-Wstringop-overflow=3',
  '-Wsuggest-attribute=cold',
  '-Wsuggest-attribute=const',
  '-Wsuggest-attribute=format',
  '-Wsuggest-attribute=malloc',
  '-Wsuggest-attribute=noreturn',
  '-Wsuggest-attribute=pure',
  '-Wswitch-default',
  '-Wswitch-enum',
  '-Wsync-nand',
  '-Wundef',
  '-Wunused-const-variable=2',
  '-Wunused-macros',
  '-Wvarargs',
  '-Wvector-operation-performance',
  '-Wvla',
  '-Wwrite-strings',
]

gcc_c_warnings = [
  '-Wbad-function-cast',
  '-Wc++-compat',
  '-Wc99-c11-compat',
  '-Wdesignated-init',
  '-Wdiscarded-array-qualifiers',
  '-Wdiscarded-qualifiers',
  '-Wincompatible-pointer-types',
  '-Wjump-misses-init',
  '-Wmissing-prototypes',
  '-Wnested-externs',
  '-Wold-style-definition',
  '-Wstrict-prototypes',
  '-Wunsuffixed-float-constants',
]

# Set all_c_warnings for the current C compiler
if is_variable('cc') and not is_variable('all_c_warnings')
  if cc.get_id() == 'clang'
    all_c_warnings = ['-Weverything']
  elif cc.get_id() == 'gcc'
    all_c_warnings = gcc_common_warnings + [
      '-Wbad-function-cast',
      '-Wc++-compat',
      '-Wc99-c11-compat',
      '-Wdesignated-init',
      '-Wdiscarded-array-qualifiers',
      '-Wdiscarded-qualifiers',
      '-Wincompatible-pointer-types',
      '-Wjump-misses-init',
      '-Wmissing-prototypes',
      '-Wnested-externs',
      '-Wold-style-definition',
      '-Wstrict-prototypes',
      '-Wunsuffixed-float-constants',
    ]
  elif cc.get_id() == 'msvc'
    all_c_warnings = ['/Wall']
  else
    all_c_warnings = []
  endif

  all_c_warnings = cc.get_supported_arguments(all_c_warnings)

endif

# Set all_cpp_warnings for the current C++ compiler
if is_variable('cpp') and not is_variable('all_cpp_warnings')
  if cpp.get_id() == 'clang'
    all_cpp_warnings = [
      '-Weverything',
      '-Wno-c++98-compat',
      '-Wno-c++98-compat-pedantic'
    ]
  elif cpp.get_id() == 'gcc'
    all_cpp_warnings = gcc_common_warnings + [
      '-Wabi-tag',
      '-Waligned-new=all',
      '-Wcatch-value=3',
      '-Wcomma-subscript',
      '-Wconditionally-supported',
      '-Wctor-dtor-privacy',
      '-Wdeprecated-copy-dtor',
      '-Weffc++',
      '-Wextra-semi',
      '-Wmismatched-tags',
      '-Wmultiple-inheritance',
      '-Wnoexcept',
      '-Wnoexcept-type',
      '-Wnon-virtual-dtor',
      '-Wold-style-cast',
      '-Woverloaded-virtual',
      '-Wplacement-new=2',
      '-Wredundant-tags',
      '-Wregister',
      '-Wsign-promo',
      '-Wstrict-null-sentinel',
      '-Wsuggest-final-methods',
      '-Wsuggest-final-types',
      '-Wsuggest-override',
      '-Wvirtual-inheritance',
      '-Wvolatile',
      '-Wzero-as-null-pointer-constant',
    ]
  elif cpp.get_id() == 'msvc'
    all_cpp_warnings = ['/Wall']
  else
    all_cpp_warnings = []
  endif

  all_cpp_warnings = cpp.get_supported_arguments(all_cpp_warnings)

endif

# Set all_objc_warnings for the current Objective C compiler
if is_variable('objcc') and not is_variable('all_objc_warnings')
  all_objc_warnings = []
  if objcc.get_id() == 'clang'
    all_objc_warnings = ['-Weverything']
  elif objc.get_id() == 'gcc'
    all_objc_warnings = gcc_common_warnings + [
      '-Wno-direct-ivar-access',
    ]
  else
    all_objc_warnings = []
  endif

  all_objc_warnings = objcc.get_supported_arguments(all_objc_warnings)
endif