compilers/c++: Add MSVC option to make the __cplusplus define accurate

Otherwise it always returns the value for c++98, starting with MSVC 2017
15.7 or later. Earlier versions are not affected by this mis-feature
pull/9098/head
Dylan Baker 3 years ago committed by Jussi Pakkanen
parent 042adba204
commit 0b97d58548
  1. 7
      docs/markdown/snippets/msvc_cplusplus_define.md
  2. 11
      mesonbuild/compilers/cpp.py
  3. 7
      test cases/windows/18 msvc cplusplus define/main.cpp
  4. 14
      test cases/windows/18 msvc cplusplus define/meson.build
  5. 2
      test cases/windows/3 cpp/meson.build
  6. 1
      unittests/windowstests.py

@ -0,0 +1,7 @@
## MSVC now sets the __cplusplus #define accurately
For reasons, MSVC will always return `199711L` for `__cplusplus`, even when a
newer c++ standard is explicitly requested, unless you pass a specific option to
the compiler for MSVC 2017 15.7 and newer. Older versions are unaffected by
this. Meson now always sets the option if it is available, as it is unlikley
that users want the default behavior.

@ -692,6 +692,17 @@ class VisualStudioCPPCompiler(CPP11AsCPP14Mixin, VisualStudioLikeCPPCompilerMixi
del args[i] del args[i]
return args return args
def get_always_args(self) -> T.List[str]:
args = super().get_always_args()
# update the __cplusplus #define to match the version given on the
# command line with /std:NNN, but only for versions above 15.7 (2017)
# https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=msvc-160
if version_compare(self.version, '>= 15.7'):
args.append('/Zc:__cplusplus')
return args
class ClangClCPPCompiler(CPP11AsCPP14Mixin, VisualStudioLikeCPPCompilerMixin, ClangClCompiler, CPPCompiler): class ClangClCPPCompiler(CPP11AsCPP14Mixin, VisualStudioLikeCPPCompilerMixin, ClangClCompiler, CPPCompiler):
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice, def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice,
is_cross: bool, info: 'MachineInfo', target: str, is_cross: bool, info: 'MachineInfo', target: str,

@ -0,0 +1,7 @@
int main() {
#if __cplusplus == 199711L
return 1;
#else
return 0;
#endif
}

@ -0,0 +1,14 @@
project('msvc __cplusplus', 'cpp', default_options : ['cpp_std=c++14'])
cpp = meson.get_compiler('cpp')
if cpp.get_id() != 'msvc'
error('MESON_SKIP_TEST: test is only relavent for msvc')
elif meson.project_version().version_compare('< 15.7')
error('MESON_SKIP_TEST: test is only relavent for msvc versions >= 15.7')
endif
test(
'main',
executable('main', 'main.cpp'),
)

@ -1,4 +1,4 @@
project('wincpp', 'cpp') project('wincpp', 'cpp', default_options : ['cpp_std=c++14'])
exe = executable('prog', 'prog.cpp') exe = executable('prog', 'prog.cpp')
test('wincpp', exe) test('wincpp', exe)

@ -359,4 +359,3 @@ class WindowsTests(BasePlatformTests):
raise SkipTest('C++ modules are only supported with VS 2019 Preview or newer.') raise SkipTest('C++ modules are only supported with VS 2019 Preview or newer.')
self.init(os.path.join(self.unit_test_dir, '86 cpp modules')) self.init(os.path.join(self.unit_test_dir, '86 cpp modules'))
self.build() self.build()

Loading…
Cancel
Save