blob: e7da004a00bb94290c4b7b67ec2fb56c81675c7a [file] [log] [blame]
// RUN: %target-swift-frontend -c %s -g -O -parse-stdlib -parse-as-library -module-name Swift
// TF-597: Exact minimal reproducer for IRGenDebugInfo crash.
// Crash occurred only with `-g` and `-O`.
//
// ```
// Assertion failed: (OffsetInBits + SizeInBits <= getSizeInBits(Var) && "pars > totum"),
// function emitVariableDeclaration, file swift/lib/IRGen/IRGenDebugInfo.cpp, line 2216.
// Stack dump:
// 1. Swift version 5.1-dev (LLVM 200186e28b, Swift c09c14dec5)
// 2. While emitting IR SIL function "@$ss8pullback2at2inyx_q_xXFts14DifferentiableRzsADR_r0_lF".
// for 'pullback(at:in:)' (at swift/test/AutoDiff/differentiable_func_debuginfo.swift:21:8)
// ```
//
// The crash was because `IRGenDebugInfoImpl::getOrCreateType` computes
// `llvm::DIType` type debug info by demangling type names.
//
// Since `@differentiable` and `@differentiable(linear)` function types did
// not have mangling support, `getOrCreateType` computed a regular `(A) -> B`
// function type instead of a `@differentiable (A) -> B` function type, leading
// to a type size inconsistency.
//
// Conclusion: mangling coverage is important.
// Minimal dummy compiler-known `Differentiable` protocol.
public protocol Differentiable {
associatedtype TangentVector
}
// This declaration is necessary to reproduce the crash.
// `Builtin.autodiffApply_vjp` constructs a use of the `tf597ProblematicVarDecl`
// type, which was mangled without `@differentiable` attribute. The parameter
// for `blackHole` is of type `$@noescape @callee_guaranteed (@in_guaranteed T) -> @out U`,
// which matched the mangled name for the type of the parameter of `blackHole`.
// As a result, the types are uniqued when generating debug info. The type of
// the parameter of `blackHole` is smaller than the `@differentiable` function
// type, causing IRGenDebugInfo to crash.
public func blackHole<T, U>(_: (T) -> U) {}
public func pullback<T, R>(
at x: T, in tf597ProblematicVarDecl: @differentiable (T) -> R
) {
let _ = Builtin.applyDerivative_vjp(tf597ProblematicVarDecl, x)
}