diff options
author | Jan Svoboda <jan_svoboda@apple.com> | 2020-12-21 13:50:09 +0100 |
---|---|---|
committer | Jan Svoboda <jan_svoboda@apple.com> | 2020-12-22 14:45:29 +0100 |
commit | bef9eb84b2fb17b22ca771c8c5c34a85f141168d (patch) | |
tree | 2fa768846841b4c179b2e814b705e70da15eefa9 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 31b67d2debd43b9854248b853a52ea989c7322a0 (diff) | |
download | llvm-bef9eb84b2fb17b22ca771c8c5c34a85f141168d.zip llvm-bef9eb84b2fb17b22ca771c8c5c34a85f141168d.tar.gz llvm-bef9eb84b2fb17b22ca771c8c5c34a85f141168d.tar.bz2 |
[clang] NFC: Refactor custom class into a lambda in CompilerInvocation
Change `makeFlagToValueNormalizer` so that one specialization converts all integral/enum arguments into `uint64_t` and forwards them to the more generic version.
This makes it easy to replace the custom `FlagToValueNormalizer` struct with a lambda, which is the common approach in other (de)normalizers.
Finally, drop custom `is_int_convertbile` in favor of `llvm::is_integral_or_enum`.
Reviewed By: dexonsmith
Differential Revision: https://reviews.llvm.org/D93628
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d7c1a6f..44453ad 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -157,33 +157,26 @@ static void denormalizeSimpleFlag(SmallVectorImpl<const char *> &Args, Args.push_back(Spelling); } -namespace { -template <typename T> struct FlagToValueNormalizer { - T Value; +template <typename T> static constexpr bool is_uint64_t_convertible() { + return !std::is_same<T, uint64_t>::value && + llvm::is_integral_or_enum<T>::value; +} - Optional<T> operator()(OptSpecifier Opt, unsigned, const ArgList &Args, - DiagnosticsEngine &) { +template <typename T, + std::enable_if_t<!is_uint64_t_convertible<T>(), bool> = false> +static auto makeFlagToValueNormalizer(T Value) { + return [Value](OptSpecifier Opt, unsigned, const ArgList &Args, + DiagnosticsEngine &) -> Optional<T> { if (Args.hasArg(Opt)) return Value; return None; - } -}; -} // namespace - -template <typename T> static constexpr bool is_int_convertible() { - return sizeof(T) <= sizeof(uint64_t) && - std::is_trivially_constructible<T, uint64_t>::value && - std::is_trivially_constructible<uint64_t, T>::value; -} - -template <typename T, std::enable_if_t<is_int_convertible<T>(), bool> = false> -static FlagToValueNormalizer<uint64_t> makeFlagToValueNormalizer(T Value) { - return FlagToValueNormalizer<uint64_t>{Value}; + }; } -template <typename T, std::enable_if_t<!is_int_convertible<T>(), bool> = false> -static FlagToValueNormalizer<T> makeFlagToValueNormalizer(T Value) { - return FlagToValueNormalizer<T>{std::move(Value)}; +template <typename T, + std::enable_if_t<is_uint64_t_convertible<T>(), bool> = false> +static auto makeFlagToValueNormalizer(T Value) { + return makeFlagToValueNormalizer(uint64_t(Value)); } static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, |