AK: Add SFINAE fallback for AK C++ concepts use, for Coverity compiler

The Coverity compiler doesn't support C++2a yet, and thus doesn't
even recognize concept keywords. To allow serenity to be built and
analyzed on such compilers, add a fallback underdef to perform
the same template restriction based on AK::EnableIf<..> meta
programming.

Note: Coverity does seem to (annoyingly) define __cpp_concepts, even
though it doesn't support them, so we need to further check for
__COVERITY__ explicitly.
This commit is contained in:
Brian Gianforcaro 2020-08-16 15:11:05 -07:00 committed by Andreas Kling
parent 2030a49a1e
commit ff0c7da75d
3 changed files with 17 additions and 3 deletions

View file

@ -30,10 +30,14 @@
namespace AK::Concepts {
#if defined(__cpp_concepts) && !defined(__COVERITY__)
template<typename T>
concept Integral = IsIntegral<T>::value;
template<typename T>
concept FloatingPoint = IsFloatingPoint<T>::value;
#endif
}

View file

@ -62,7 +62,11 @@ public:
virtual bool discard_or_error(size_t count) = 0;
};
#if defined(__cpp_concepts) && !defined(__COVERITY__)
template<Concepts::Integral Integral>
#else
template<typename Integral, typename EnableIf<IsIntegral<Integral>::value, int>::Type = 0>
#endif
InputStream& operator>>(InputStream& stream, Integral& value)
{
stream.read_or_error({ &value, sizeof(value) });
@ -70,12 +74,18 @@ InputStream& operator>>(InputStream& stream, Integral& value)
}
#ifndef KERNEL
#if defined(__cpp_concepts) && !defined(__COVERITY__)
template<Concepts::FloatingPoint FloatingPoint>
#else
template<typename FloatingPoint, typename EnableIf<IsFloatingPoint<FloatingPoint>::value, int>::Type = 0>
#endif
InputStream& operator>>(InputStream& stream, FloatingPoint& value)
{
stream.read_or_error({ &value, sizeof(value) });
return stream;
}
#endif
inline InputStream& operator>>(InputStream& stream, bool& value)

View file

@ -33,12 +33,12 @@ namespace AK {
// HACK: This is just here to make syntax highlighting work in Qt Creator.
// Once it supports C++20 concepts, we can remove this.
#ifdef __clang__
template<typename T>
#else
#if defined(__cpp_concepts) && !defined(__COVERITY__)
template<typename T>
concept PointerTypeName = IsPointer<T>::value;
template<PointerTypeName T>
#else
template<typename T, typename EnableIf<IsPointer<T>::value, int>::Type = 0>
#endif
class Userspace {