mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Introduce checking of ConcurrentValue conformances: - For structs, check that each stored property conforms to ConcurrentValue - For enums, check that each associated value conforms to ConcurrentValue - For classes, check that each stored property is immutable and conforms to ConcurrentValue Because all of the stored properties / associated values need to be visible for this check to work, limit ConcurrentValue conformances to be in the same source file as the type definition. This checking can be disabled by conforming to a new marker protocol, UnsafeConcurrentValue, that refines ConcurrentValue. UnsafeConcurrentValue otherwise his no specific meaning. This allows both "I know what I'm doing" for types that manage concurrent access themselves as well as enabling retroactive conformance, both of which are fundamentally unsafe but also quite necessary. The bulk of this change ended up being to the standard library, because all conformances of standard library types to the ConcurrentValue protocol needed to be sunk down into the standard library so they would benefit from the checking above. There were numerous little mistakes in the initial pass through the stsandard library types that have now been corrected.
129 lines
5.2 KiB
C++
129 lines
5.2 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. Note that this mechanism does not look through an overlay into its
|
|
// underlying module, so it typically cannot find Objective-C 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(Actor)
|
|
PROTOCOL(Sequence)
|
|
PROTOCOL(IteratorProtocol)
|
|
PROTOCOL(RawRepresentable)
|
|
PROTOCOL(Equatable)
|
|
PROTOCOL(Hashable)
|
|
PROTOCOL(Comparable)
|
|
PROTOCOL(Error)
|
|
PROTOCOL_(ErrorCodeProtocol)
|
|
PROTOCOL(OptionSet)
|
|
PROTOCOL(CaseIterable)
|
|
PROTOCOL(SIMDScalar)
|
|
PROTOCOL(BinaryInteger)
|
|
|
|
PROTOCOL_(BridgedNSError)
|
|
PROTOCOL_(BridgedStoredNSError)
|
|
PROTOCOL_(CFObject)
|
|
PROTOCOL_(SwiftNewtypeWrapper)
|
|
PROTOCOL(CodingKey)
|
|
PROTOCOL(Encodable)
|
|
PROTOCOL(Decodable)
|
|
|
|
PROTOCOL(ConcurrentValue)
|
|
PROTOCOL(UnsafeConcurrentValue)
|
|
|
|
PROTOCOL_(ObjectiveCBridgeable)
|
|
PROTOCOL_(DestructorSafeContainer)
|
|
|
|
PROTOCOL(StringInterpolationProtocol)
|
|
|
|
PROTOCOL(AdditiveArithmetic)
|
|
PROTOCOL(Differentiable)
|
|
|
|
PROTOCOL(AsyncSequence)
|
|
PROTOCOL(AsyncIteratorProtocol)
|
|
|
|
PROTOCOL(FloatingPoint)
|
|
|
|
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
|