mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 02:06:30 +00:00
[libc++] Adds is_implemented function for new ftm generator. (#134538)
At the moment the ftm macro for __cpp_lib_to_chars will have the following values: standard_ftms: { "c++17": "201611L", "c++20": "201611L", "c++23": "201611L", "c++26": "201611L", } implemented_ftms: { "c++17": None, } This is an issue with the test whether the FTM is implemented it does: self.implemented_ftms[ftm][std] == self.standard_ftms[ftm][std] This will fail in C++20 since implemented_ftms[ftm] does not have the key c++20. This adds a new helper function and removes the None entries when a FTM is not implemented. --------- Co-authored-by: Louis Dionne <ldionne.2@gmail.com>
This commit is contained in:
parent
1e54bca669
commit
df579ce4b6
@ -38,11 +38,7 @@ class Test(unittest.TestCase):
|
||||
"c++23": "201907L",
|
||||
"c++26": "299900L",
|
||||
},
|
||||
"__cpp_lib_format": {
|
||||
"c++20": None,
|
||||
"c++23": None,
|
||||
"c++26": None,
|
||||
},
|
||||
"__cpp_lib_format": {},
|
||||
"__cpp_lib_parallel_algorithm": {
|
||||
"c++17": "201603L",
|
||||
"c++20": "201603L",
|
||||
@ -55,11 +51,7 @@ class Test(unittest.TestCase):
|
||||
"c++23": "202102L",
|
||||
"c++26": "202102L",
|
||||
},
|
||||
"__cpp_lib_missing_FTM_in_older_standard": {
|
||||
"c++17": None,
|
||||
"c++20": None,
|
||||
"c++26": None,
|
||||
},
|
||||
"__cpp_lib_missing_FTM_in_older_standard": {},
|
||||
}
|
||||
|
||||
self.assertEqual(self.ftm.implemented_ftms, expected)
|
||||
|
39
libcxx/test/libcxx/feature_test_macro/is_implemented.sh.py
Normal file
39
libcxx/test/libcxx/feature_test_macro/is_implemented.sh.py
Normal file
@ -0,0 +1,39 @@
|
||||
# ===----------------------------------------------------------------------===##
|
||||
#
|
||||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
#
|
||||
# ===----------------------------------------------------------------------===##
|
||||
|
||||
# RUN: %{python} %s %{libcxx-dir}/utils %{libcxx-dir}/test/libcxx/feature_test_macro/test_data.json
|
||||
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
UTILS = sys.argv[1]
|
||||
TEST_DATA = sys.argv[2]
|
||||
del sys.argv[1:3]
|
||||
|
||||
sys.path.append(UTILS)
|
||||
from generate_feature_test_macro_components import FeatureTestMacros, Metadata
|
||||
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.ftm = FeatureTestMacros(TEST_DATA)
|
||||
self.maxDiff = None # This causes the diff to be printed when the test fails
|
||||
|
||||
def test_implementation(self):
|
||||
# FTM not available in C++14.
|
||||
self.assertEqual(self.ftm.is_implemented("__cpp_lib_any", "c++14"), False)
|
||||
self.assertEqual(self.ftm.is_implemented("__cpp_lib_any", "c++17"), True)
|
||||
|
||||
self.assertEqual(self.ftm.is_implemented("__cpp_lib_format", "c++20"), False)
|
||||
|
||||
# FTM C++20 202106L, libc++ has 202102L
|
||||
self.assertEqual(self.ftm.is_implemented("__cpp_lib_variant", "c++20"), False)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
@ -2011,7 +2011,8 @@ def get_ftms(
|
||||
else:
|
||||
break
|
||||
|
||||
entry[std] = last
|
||||
if last:
|
||||
entry[std] = last
|
||||
result[feature["name"]] = entry
|
||||
|
||||
return result
|
||||
@ -2207,6 +2208,18 @@ class FeatureTestMacros:
|
||||
|
||||
return get_ftms(self.__data, self.std_dialects, True)
|
||||
|
||||
def is_implemented(self, ftm: Ftm, std: Std) -> bool:
|
||||
"""Has the FTM `ftm` been implemented in the dialect `std`?"""
|
||||
|
||||
# When a paper for C++20 has not been implemented in libc++, then there will be no
|
||||
# FTM entry in implemented_ftms for C++23 and later. Similarly, a paper like <format>
|
||||
# has no entry in standard_ftms for e.g. C++11.
|
||||
if not std in self.implemented_ftms[ftm].keys() or not std in self.standard_ftms[ftm].keys():
|
||||
return False
|
||||
|
||||
return self.implemented_ftms[ftm][std] == self.standard_ftms[ftm][std]
|
||||
|
||||
|
||||
@functools.cached_property
|
||||
def ftm_metadata(self) -> Dict[Ftm, Metadata]:
|
||||
"""Returns the metadata of the FTMs defined in the Standard.
|
||||
@ -2240,7 +2253,7 @@ class FeatureTestMacros:
|
||||
continue
|
||||
last_value = value
|
||||
|
||||
implemented = self.implemented_ftms[ftm][std] == self.standard_ftms[ftm][std]
|
||||
implemented = self.is_implemented(ftm, std)
|
||||
entry = VersionHeader(
|
||||
value,
|
||||
implemented,
|
||||
|
Loading…
x
Reference in New Issue
Block a user