mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
* Teach the importer to import any vector type as SIMDN<Scalar>. Instead of having a known set of vector types, check to see if the element type conforms to SIMDScalar; if it does, see if we have a SIMDN defined with the right number of elements. If both are satisfied, import the vector type as that Swift type. By making this change, we gain the ability to import vector types that aren't defined in terms of the Darwin simd module, which lets us use C API with vector types on other platforms. It also lets us import *every* vector type that Swift can represent, rather than the small subset that are currently hardcoded. * Increased test coverage for increased SIMD types that we can import. Includes some minor cleanup from review. Also eliminates the old simd_sans_simd test, since we can now import all of these types even when the simd module isn't imported.
115 lines
4.9 KiB
C++
115 lines
4.9 KiB
C++
//===--- KnownProtocols.def - Compiler protocol metaprogramming -*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines macros used for macro-metaprogramming with compiler-known
|
|
// protocols.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
/// \def PROTOCOL_WITH_NAME(Id, Name)
|
|
///
|
|
/// The enumerator value is \c KnownProtocolKind::Id. The protocol represented
|
|
/// is simply named \p Name.
|
|
#ifndef PROTOCOL_WITH_NAME
|
|
#define PROTOCOL_WITH_NAME(Id, Name)
|
|
#endif
|
|
|
|
/// \def EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name, typeName, performLocalLookup)
|
|
/// \param typeName supplies the name used for type lookup,
|
|
/// \param performLocalLookup specifies whether to first look in the local context.
|
|
#ifndef EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME
|
|
#define EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name, typeName, performLocalLookup) \
|
|
PROTOCOL_WITH_NAME(Id, Name)
|
|
#endif
|
|
|
|
/// \def BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name)
|
|
///
|
|
/// Note that this is not a special form of EXPRESSIBLE_BY_LITERAL_PROTOCOL.
|
|
#ifndef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME
|
|
#define BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(Id, Name) \
|
|
PROTOCOL_WITH_NAME(Id, Name)
|
|
#endif
|
|
|
|
|
|
#define PROTOCOL(name) PROTOCOL_WITH_NAME(name, #name)
|
|
#define PROTOCOL_(name) PROTOCOL_WITH_NAME(name, "_" #name)
|
|
|
|
/// \param typeName supplies the name used for type lookup,
|
|
/// \param performLocalLookup specifies whether to first look in the local context.
|
|
#define EXPRESSIBLE_BY_LITERAL_PROTOCOL(name, typeName, performLocalLookup) \
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, #name, typeName, performLocalLookup)
|
|
|
|
/// \param typeName supplies the name used for type lookup,
|
|
/// \param performLocalLookup specifies whether to first look in the local context.
|
|
#define EXPRESSIBLE_BY_LITERAL_PROTOCOL_(name, typeName, performLocalLookup) \
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, "_" #name, typeName, performLocalLookup)
|
|
|
|
#define BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(name) \
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME(name, "_" #name)
|
|
|
|
PROTOCOL(Sequence)
|
|
PROTOCOL(IteratorProtocol)
|
|
PROTOCOL(RawRepresentable)
|
|
PROTOCOL(Equatable)
|
|
PROTOCOL(Hashable)
|
|
PROTOCOL(Comparable)
|
|
PROTOCOL(Error)
|
|
PROTOCOL_(ErrorCodeProtocol)
|
|
PROTOCOL(OptionSet)
|
|
PROTOCOL(CaseIterable)
|
|
PROTOCOL(SIMDScalar)
|
|
|
|
PROTOCOL_(BridgedNSError)
|
|
PROTOCOL_(BridgedStoredNSError)
|
|
PROTOCOL_(CFObject)
|
|
PROTOCOL_(SwiftNewtypeWrapper)
|
|
PROTOCOL(CodingKey)
|
|
PROTOCOL(Encodable)
|
|
PROTOCOL(Decodable)
|
|
|
|
PROTOCOL_(ObjectiveCBridgeable)
|
|
PROTOCOL_(DestructorSafeContainer)
|
|
|
|
PROTOCOL(StringInterpolationProtocol)
|
|
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByArrayLiteral, "Array", false)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByBooleanLiteral, "BooleanLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByDictionaryLiteral, "Dictionary", false)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByExtendedGraphemeClusterLiteral, "ExtendedGraphemeClusterType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByFloatLiteral, "FloatLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByIntegerLiteral, "IntegerLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByStringInterpolation, "StringLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByStringLiteral, "StringLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByNilLiteral, nullptr, false)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL(ExpressibleByUnicodeScalarLiteral, "UnicodeScalarType", true)
|
|
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByColorLiteral, "_ColorLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByImageLiteral, "_ImageLiteralType", true)
|
|
EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByFileReferenceLiteral, "_FileReferenceLiteralType", true)
|
|
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinBooleanLiteral)
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinExtendedGraphemeClusterLiteral)
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinFloatLiteral)
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinIntegerLiteral)
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinStringLiteral)
|
|
BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_(ExpressibleByBuiltinUnicodeScalarLiteral)
|
|
|
|
#undef EXPRESSIBLE_BY_LITERAL_PROTOCOL
|
|
#undef EXPRESSIBLE_BY_LITERAL_PROTOCOL_
|
|
#undef EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME
|
|
#undef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_
|
|
#undef BUILTIN_EXPRESSIBLE_BY_LITERAL_PROTOCOL_WITH_NAME
|
|
#undef PROTOCOL
|
|
#undef PROTOCOL_
|
|
#undef PROTOCOL_WITH_NAME
|