Merge pull request #7967 from jrose-apple/3.1-to-err-is-human
Make sure ErrorTypes containing type variables are marked as such
diff --git a/include/swift/AST/Types.h b/include/swift/AST/Types.h
index 3a59b46e..a5e0d35 100644
--- a/include/swift/AST/Types.h
+++ b/include/swift/AST/Types.h
@@ -992,8 +992,10 @@
class ErrorType : public TypeBase {
friend class ASTContext;
// The Error type is always canonical.
- ErrorType(ASTContext &C, Type originalType)
- : TypeBase(TypeKind::Error, &C, RecursiveTypeProperties::HasError) {
+ ErrorType(ASTContext &C, Type originalType,
+ RecursiveTypeProperties properties)
+ : TypeBase(TypeKind::Error, &C, properties) {
+ assert(properties.hasError());
if (originalType) {
ErrorTypeBits.HasOriginalType = true;
*reinterpret_cast<Type *>(this + 1) = originalType;
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 63b6d80..7a22f3e 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -402,7 +402,8 @@
SwiftShimsModuleName(getIdentifier(SWIFT_SHIMS_NAME)),
TypeCheckerDebug(new StderrTypeCheckerDebugConsumer()),
TheErrorType(
- new (*this, AllocationArena::Permanent) ErrorType(*this, Type())),
+ new (*this, AllocationArena::Permanent)
+ ErrorType(*this, Type(), RecursiveTypeProperties::HasError)),
TheUnresolvedType(new (*this, AllocationArena::Permanent)
UnresolvedType(*this)),
TheEmptyTupleType(TupleType::get(ArrayRef<TupleTypeElt>(), *this)),
@@ -2435,8 +2436,8 @@
Type ErrorType::get(Type originalType) {
assert(originalType);
- auto properties = originalType->getRecursiveProperties();
- auto arena = getArena(properties);
+ auto originalProperties = originalType->getRecursiveProperties();
+ auto arena = getArena(originalProperties);
auto &ctx = originalType->getASTContext();
auto &entry = ctx.Impl.getArena(arena).ErrorTypesWithOriginal[originalType];
@@ -2444,7 +2445,10 @@
void *mem = ctx.Allocate(sizeof(ErrorType) + sizeof(Type),
alignof(ErrorType), arena);
- return entry = new (mem) ErrorType(ctx, originalType);
+ RecursiveTypeProperties properties = RecursiveTypeProperties::HasError;
+ if (originalProperties.hasTypeVariable())
+ properties |= RecursiveTypeProperties::HasTypeVariable;
+ return entry = new (mem) ErrorType(ctx, originalType, properties);
}
BuiltinIntegerType *BuiltinIntegerType::get(BuiltinIntegerWidth BitWidth,
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp
index dbf0534..dc5cd4d 100644
--- a/lib/AST/Type.cpp
+++ b/lib/AST/Type.cpp
@@ -470,7 +470,8 @@
return false;
});
- assert(!typeVariables.empty() && "Did not find type variables!");
+ assert((!typeVariables.empty() || hasError()) &&
+ "Did not find type variables!");
}
}