mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Type checker] Eliminate the 'literalConformanceProto' state on type variables.
The 'literalConformanceProto' field of
TypeVariableType::Implementation didn't take into account equivalence
classes of type variables. Eliminate it, and either look at the actual
expressions (for optimizing constraints during constraint generation)
or the actual constraints on a given type variable (for determining
whether to include optionals in the set of potential type variable
bindings).
(cherry picked from commit 6bdd9cfae5)
This commit is contained in:
@@ -61,6 +61,7 @@ Constraint::Constraint(ConstraintKind Kind, Type First, Type Second,
|
||||
case ConstraintKind::OperatorArgumentTupleConversion:
|
||||
case ConstraintKind::OperatorArgumentConversion:
|
||||
case ConstraintKind::ConformsTo:
|
||||
case ConstraintKind::LiteralConformsTo:
|
||||
case ConstraintKind::CheckedCast:
|
||||
case ConstraintKind::SelfObjectOfProtocol:
|
||||
case ConstraintKind::DynamicTypeOf:
|
||||
@@ -144,6 +145,7 @@ Constraint::Constraint(ConstraintKind kind, Fix fix,
|
||||
|
||||
ProtocolDecl *Constraint::getProtocol() const {
|
||||
assert((Kind == ConstraintKind::ConformsTo ||
|
||||
Kind == ConstraintKind::LiteralConformsTo ||
|
||||
Kind == ConstraintKind::SelfObjectOfProtocol)
|
||||
&& "Not a conformance constraint");
|
||||
return Types.Second->castTo<ProtocolType>()->getDecl();
|
||||
@@ -162,6 +164,7 @@ Constraint *Constraint::clone(ConstraintSystem &cs) const {
|
||||
case ConstraintKind::OperatorArgumentTupleConversion:
|
||||
case ConstraintKind::OperatorArgumentConversion:
|
||||
case ConstraintKind::ConformsTo:
|
||||
case ConstraintKind::LiteralConformsTo:
|
||||
case ConstraintKind::CheckedCast:
|
||||
case ConstraintKind::DynamicTypeOf:
|
||||
case ConstraintKind::SelfObjectOfProtocol:
|
||||
@@ -238,6 +241,7 @@ void Constraint::print(llvm::raw_ostream &Out, SourceManager *sm) const {
|
||||
case ConstraintKind::OperatorArgumentConversion:
|
||||
Out << " operator arg conv "; break;
|
||||
case ConstraintKind::ConformsTo: Out << " conforms to "; break;
|
||||
case ConstraintKind::LiteralConformsTo: Out << " literal conforms to "; break;
|
||||
case ConstraintKind::CheckedCast: Out << " checked cast to "; break;
|
||||
case ConstraintKind::SelfObjectOfProtocol: Out << " Self type of "; break;
|
||||
case ConstraintKind::ApplicableFunction: Out << " applicable fn "; break;
|
||||
@@ -486,6 +490,7 @@ gatherReferencedTypeVars(Constraint *constraint,
|
||||
case ConstraintKind::BindOverload:
|
||||
case ConstraintKind::Class:
|
||||
case ConstraintKind::ConformsTo:
|
||||
case ConstraintKind::LiteralConformsTo:
|
||||
case ConstraintKind::SelfObjectOfProtocol:
|
||||
constraint->getFirstType()->getTypeVariables(typeVars);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user