diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -14,6 +14,8 @@ _isClang = lambda cfg: '__clang__' in compilerMacros(cfg) and '__apple_build_version__' not in compilerMacros(cfg) _isAppleClang = lambda cfg: '__apple_build_version__' in compilerMacros(cfg) _isGCC = lambda cfg: '__GNUC__' in compilerMacros(cfg) and '__clang__' not in compilerMacros(cfg) +_isMSVC = lambda cfg: '_MSC_VER' in compilerMacros(cfg) +_msvcVersion = lambda cfg: (int(compilerMacros(cfg)['_MSC_VER']) // 100, int(compilerMacros(cfg)['_MSC_VER']) % 100) DEFAULT_FEATURES = [ Feature(name='fcoroutines-ts', @@ -81,6 +83,10 @@ Feature(name=lambda cfg: 'gcc-{__GNUC__}'.format(**compilerMacros(cfg)), when=_isGCC), Feature(name=lambda cfg: 'gcc-{__GNUC__}.{__GNUC_MINOR__}'.format(**compilerMacros(cfg)), when=_isGCC), Feature(name=lambda cfg: 'gcc-{__GNUC__}.{__GNUC_MINOR__}.{__GNUC_PATCHLEVEL__}'.format(**compilerMacros(cfg)), when=_isGCC), + + Feature(name='msvc', when=_isMSVC), + Feature(name=lambda cfg: 'msvc-{}'.format(*_msvcVersion(cfg)), when=_isMSVC), + Feature(name=lambda cfg: 'msvc-{}.{}'.format(*_msvcVersion(cfg)), when=_isMSVC), ] # Deduce and add the test features that that are implied by the #defines in diff --git a/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py --- a/libcxx/utils/libcxx/test/params.py +++ b/libcxx/utils/libcxx/test/params.py @@ -7,6 +7,7 @@ #===----------------------------------------------------------------------===## from libcxx.test.dsl import * +from libcxx.test.features import _isMSVC _warningFlags = [ '-Werror', @@ -111,7 +112,12 @@ help="Whether to enable tests for experimental C++ libraries (typically Library Fundamentals TSes).", actions=lambda experimental: [] if not experimental else [ AddFeature('c++experimental'), - PrependLinkFlag('-lc++experimental') + # When linking in MSVC mode via the Clang driver, a -l + # maps to .lib, so we need to use -llibc++experimental here + # to make it link against the static libc++experimental.lib. + # We can't check for the feature 'msvc' in available_features + # as those features are added after processing parameters. + PrependLinkFlag(lambda config: '-llibc++experimental' if _isMSVC(config) else '-lc++experimental') ]), Parameter(name='long_tests', choices=[True, False], type=bool, default=True,