Swift 2b4: “Constraint system missed a conformance?” swiftc crash working around mutual protocol recursion crash

Originator:rix.rob
Number:rdar://22064859 Date Originated:29-Jul-2015 09:59 PM
Status:Open Resolved:
Product:Developer Tools Product Version:Xcode-beta (7A165t)
Classification:Crash/Hang/Data Loss Reproducible:Always
 
Summary:
Trying to work around rdar://22064783, swiftc died another death instead.

Steps to Reproduce:
This code:
protocol A: _A {
	typealias O : B
}

protocol _A {
	typealias O
	init(_ : O)
	var out: O { get }
}

protocol B {
	typealias O : _A
}

enum Expr<T>: B {
	typealias O = T
	case Null
	func map<U>(transform: T -> U) -> Expr<U> { return .Null }
}

func out<Fix: A>(v: Fix) -> Fix.O { return v.out }

func cata<T, Fix: A where Fix.O == Expr<Fix>>(f: Expr<T> -> T)(_ term: Fix) -> T {
	return f({ $0.map(cata(f)) }(out(term)))
}


Expected Results:
should not crash swiftc

Actual Results:
but totally does:
rob@Resonance ~/Desktop> swiftc -v boom.swift
Apple Swift version 2.0 (swiftlang-700.0.47.4 clang-700.0.59.1)
Target: x86_64-apple-darwin14.4.0
/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file boom.swift -target x86_64-apple-darwin14.4.0 -enable-objc-interop -color-diagnostics -module-name boom -o /var/folders/9y/f7n4rvx901nctm_5d16c1wm40000gn/T/boom-57cfd6.o
boom.swift:23:33: error: same-type constraint type '<<error type>>' does not conform to required protocol '_A'
func cata<T, Fix: A where Fix.O == Expr<Fix>>(f: Expr<T> -> T)(_ term: Fix) -> T {
                                ^
boom.swift:23:33: error: same-type constraint type '<<error type>>' does not conform to required protocol '_A'
func cata<T, Fix: A where Fix.O == Expr<Fix>>(f: Expr<T> -> T)(_ term: Fix) -> T {
                                ^
boom.swift:15:6: error: type 'Expr<T>' does not conform to protocol 'B'
enum Expr<T>: B {
     ^
boom.swift:12:12: note: protocol requires nested type 'O'
        typealias O : _A
                  ^
boom.swift:16:12: note: possibly intended match 'O' does not conform to '_A'
        typealias O = T
                  ^
Assertion failed: ((conforms || firstArchetype->getIsRecursive() || isOpenedAnyObject(replacement) || replacement->is<GenericTypeParamType>()) && "Constraint system missed a conformance?"), function computeSubstitutions, file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.0.47.4/src/swift/lib/Sema/CSApply.cpp, line 145.
0  swift                    0x000000010b876b8b llvm::sys::PrintStackTrace(__sFILE*) + 43
1  swift                    0x000000010b8772cb SignalHandler(int) + 379
2  libsystem_platform.dylib 0x00007fff86e08f1a _sigtramp + 26
3  libc++.1.dylib           0x00007fff8b20043e operator new(unsigned long) + 30
4  libsystem_c.dylib        0x00007fff905e3b53 abort + 129
5  libsystem_c.dylib        0x00007fff905abc39 basename + 0
6  swift                    0x0000000109e567e5 swift::constraints::Solution::computeSubstitutions(swift::Type, swift::DeclContext*, swift::Type, swift::constraints::ConstraintLocator*, llvm::SmallVectorImpl<swift::Substitution>&) const + 2117
7  swift                    0x0000000109e6c7fd (anonymous namespace)::ExprRewriter::buildDeclRef(swift::ValueDecl*, swift::SourceLoc, swift::Type, swift::constraints::ConstraintLocatorBuilder, bool, bool, swift::AccessSemantics) + 557
8  swift                    0x0000000109e68839 swift::ASTVisitor<(anonymous namespace)::ExprRewriter, swift::Expr*, void, void, void, void, void>::visit(swift::Expr*) + 11129
9  swift                    0x0000000109e628c6 (anonymous namespace)::ExprWalker::walkToExprPost(swift::Expr*) + 22
10 swift                    0x0000000109fa96bc (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 76
11 swift                    0x0000000109fa78eb (anonymous namespace)::Traversal::visit(swift::Expr*) + 219
12 swift                    0x0000000109fa7890 (anonymous namespace)::Traversal::visit(swift::Expr*) + 128
13 swift                    0x0000000109fa96f0 (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 128
14 swift                    0x0000000109fa78eb (anonymous namespace)::Traversal::visit(swift::Expr*) + 219
15 swift                    0x0000000109fa7890 (anonymous namespace)::Traversal::visit(swift::Expr*) + 128
16 swift                    0x0000000109fa96f0 (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 128
17 swift                    0x0000000109fa78eb (anonymous namespace)::Traversal::visit(swift::Expr*) + 219
18 swift                    0x0000000109fa6cd5 swift::Expr::walk(swift::ASTWalker&) + 53
19 swift                    0x0000000109e56d94 swift::constraints::ConstraintSystem::applySolution(swift::constraints::Solution&, swift::Expr*, swift::Type, bool, bool) + 484
20 swift                    0x0000000109ee40af swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::Type, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListener*) + 399
21 swift                    0x0000000109f492f2 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 4242
22 swift                    0x0000000109f48399 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 313
23 swift                    0x0000000109f47769 (anonymous namespace)::StmtChecker::typeCheckBody(swift::BraceStmt*&) + 25
24 swift                    0x0000000109f4682f swift::TypeChecker::typeCheckFunctionBodyUntil(swift::FuncDecl*, swift::SourceLoc) + 415
25 swift                    0x0000000109f46641 swift::TypeChecker::typeCheckAbstractFunctionBodyUntil(swift::AbstractFunctionDecl*, swift::SourceLoc) + 49
26 swift                    0x0000000109f4736a swift::TypeChecker::typeCheckAbstractFunctionBody(swift::AbstractFunctionDecl*) + 138
27 swift                    0x0000000109ecc258 typeCheckFunctionsAndExternalDecls(swift::TypeChecker&) + 200
28 swift                    0x0000000109eccf53 swift::performTypeChecking(swift::SourceFile&, swift::TopLevelContext&, swift::OptionSet<swift::TypeCheckingFlags, unsigned int>, unsigned int) + 1731
29 swift                    0x0000000109cd66d5 swift::CompilerInstance::performSema() + 4149
30 swift                    0x000000010985a9d5 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&) + 725
31 swift                    0x000000010985a4e3 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 2627
32 swift                    0x00000001098565af main + 2015
33 libdyld.dylib            0x00007fff86cb45c9 start + 1
34 libdyld.dylib            0x000000000000000d start + 2033498693
Stack dump:
0.	Program arguments: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file boom.swift -target x86_64-apple-darwin14.4.0 -enable-objc-interop -color-diagnostics -module-name boom -o /var/folders/9y/f7n4rvx901nctm_5d16c1wm40000gn/T/boom-57cfd6.o 
1.	While type-checking 'cata' at boom.swift:23:1
2.	While type-checking expression at [boom.swift:24:9 - line:24:41] RangeText="f({ $0.map(cata(f)) }(out(term)))"
<unknown>:0: error: unable to execute command: Abort trap: 6
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)


Regression:
N/A

Notes:
N/A

Comments


Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!