Skip to content

Commit d2f5188

Browse files
committed
Fix SR-15818 and add test
1 parent 44d9c67 commit d2f5188

5 files changed

+69
-14
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3499,8 +3499,8 @@ NOTE(autodiff_attr_original_decl_not_same_type_context,none,
34993499
ERROR(autodiff_attr_original_void_result,none,
35003500
"cannot differentiate void function %0", (DeclName))
35013501
ERROR(autodiff_attr_original_multiple_semantic_results,none,
3502-
"cannot differentiate functions with both an 'inout' parameter and a "
3503-
"result", ())
3502+
"cannot differentiate functions with both a differentiable 'inout' "
3503+
"parameter and a result", ())
35043504
ERROR(autodiff_attr_result_not_differentiable,none,
35053505
"can only differentiate functions with results that conform to "
35063506
"'Differentiable', but %0 does not conform to 'Differentiable'", (Type))
@@ -5058,8 +5058,8 @@ ERROR(differentiable_function_type_invalid_result,none,
50585058
"function type is '@differentiable%select{|(_linear)}1'",
50595059
(StringRef, bool))
50605060
ERROR(differentiable_function_type_multiple_semantic_results,none,
5061-
"'@differentiable' function type cannot have both an 'inout' parameter "
5062-
"and a differentiable result", ())
5061+
"'@differentiable' function type cannot have both a differentiable "
5062+
"'inout' parameter and a result", ())
50635063
ERROR(differentiable_function_type_no_differentiability_parameters,
50645064
none,
50655065
"'@differentiable' function type requires at least one differentiability "

test/AutoDiff/Sema/derivative_attr_type_checking.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ extension ProtocolRequirementDerivative {
746746
func multipleSemanticResults(_ x: inout Float) -> Float {
747747
return x
748748
}
749-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
749+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
750750
@derivative(of: multipleSemanticResults)
751751
func vjpMultipleSemanticResults(x: inout Float) -> (
752752
value: Float, pullback: (Float) -> Float
@@ -885,14 +885,14 @@ func vjpNoSemanticResults(_ x: Float) -> (value: Void, pullback: Void) {}
885885

886886
extension InoutParameters {
887887
func multipleSemanticResults(_ x: inout Float) -> Float { x }
888-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
888+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
889889
@derivative(of: multipleSemanticResults)
890890
func vjpMultipleSemanticResults(_ x: inout Float) -> (
891891
value: Float, pullback: (inout Float) -> Void
892892
) { fatalError() }
893893

894894
func inoutVoid(_ x: Float, _ void: inout Void) -> Float {}
895-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
895+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
896896
@derivative(of: inoutVoid)
897897
func vjpInoutVoidParameter(_ x: Float, _ void: inout Void) -> (
898898
value: Float, pullback: (inout Float) -> Void

test/AutoDiff/Sema/differentiable_attr_type_checking.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ func two9(x: Float, y: Float) -> Float {
528528
func inout1(x: Float, y: inout Float) -> Void {
529529
let _ = x + y
530530
}
531-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
531+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
532532
@differentiable(reverse, wrt: y)
533533
func inout2(x: Float, y: inout Float) -> Float {
534534
let _ = x + y
@@ -670,11 +670,11 @@ final class FinalClass: Differentiable {
670670
@differentiable(reverse, wrt: y)
671671
func inoutVoid(x: Float, y: inout Float) {}
672672

673-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
673+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
674674
@differentiable(reverse)
675675
func multipleSemanticResults(_ x: inout Float) -> Float { x }
676676

677-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
677+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
678678
@differentiable(reverse, wrt: y)
679679
func swap(x: inout Float, y: inout Float) {}
680680

@@ -687,7 +687,7 @@ extension InoutParameters {
687687
@differentiable(reverse)
688688
static func staticMethod(_ lhs: inout Self, rhs: Self) {}
689689

690-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
690+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
691691
@differentiable(reverse)
692692
static func multipleSemanticResults(_ lhs: inout Self, rhs: Self) -> Self {}
693693
}
@@ -696,7 +696,7 @@ extension InoutParameters {
696696
@differentiable(reverse)
697697
mutating func mutatingMethod(_ other: Self) {}
698698

699-
// expected-error @+1 {{cannot differentiate functions with both an 'inout' parameter and a result}}
699+
// expected-error @+1 {{cannot differentiate functions with both a differentiable 'inout' parameter and a result}}
700700
@differentiable(reverse)
701701
mutating func mutatingMethod(_ other: Self) -> Self {}
702702
}

test/AutoDiff/Sema/differentiable_func_type.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ let _: @differentiable(_linear) (Float) -> NonDiffType
4040

4141
let _: @differentiable(_linear) (Float) -> Float
4242

43-
// expected-error @+1 {{'@differentiable' function type cannot have both an 'inout' parameter and a differentiable result}}
43+
// expected-error @+1 {{'@differentiable' function type cannot have both a differentiable 'inout' parameter and a result}}
4444
let _: @differentiable(reverse) (inout Float) -> Float
4545

46-
// expected-error @+1 {{'@differentiable' function type cannot have both an 'inout' parameter and a differentiable result}}
46+
// expected-error @+1 {{'@differentiable' function type cannot have both a differentiable 'inout' parameter and a result}}
4747
let _: @differentiable(_linear) (inout Float) -> Float
4848

4949
// expected-error @+1 {{result type '@differentiable(reverse) (U) -> Float' does not conform to 'Differentiable', but the enclosing function type is '@differentiable'}}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// RUN: %target-swift-frontend -emit-sil -verify %s
2+
3+
import _Differentiation
4+
5+
// expected-error @+1 {{result type 'Void' does not conform to 'Differentiable', but the enclosing function type is '@differentiable'}}
6+
typealias MyType = @differentiable(reverse) (inout @noDerivative Float, Float) -> Void
7+
8+
@differentiable(reverse)
9+
func myFunc(_ x: inout @noDerivative Float, _ q: Float) -> Void {}
10+
11+
print(myFunc as MyType)
12+
13+
// Original crash:
14+
// Assertion failed: (Index < Length && "Invalid index!"), function operator[], file ArrayRef.h, line 257.
15+
// Stack dump:
16+
// ...
17+
// 1. Swift version 5.7-dev (LLVM a9a5fb525c61dd0, Swift f69d528185a8bfe)
18+
// 2. Compiling with the current language version
19+
// 3. While evaluating request ExecuteSILPipelineRequest(Run pipelines { Mandatory Diagnostic Passes + Enabling Optimization Passes } on SIL for file)
20+
// 4. While running pass #46 SILModuleTransform "Differentiation".
21+
// 5. While canonicalizing `differentiable_function` SIL node %12 = differentiable_function [parameters 1] [results 0] %9 : $@callee_guaranteed (@inout Float, Float, Int) -> () // users: %23, %18, %13
22+
// 6. While ...in SIL function "@main".
23+
// Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
24+
// 0 swift-frontend 0x0000000105719dc0 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
25+
// 1 swift-frontend 0x0000000105718ef0 llvm::sys::RunSignalHandlers() + 128
26+
// 2 swift-frontend 0x000000010571a424 SignalHandler(int) + 304
27+
// 3 libsystem_platform.dylib 0x00000001bb5304e4 _sigtramp + 56
28+
// 4 libsystem_pthread.dylib 0x00000001bb518eb0 pthread_kill + 288
29+
// 5 libsystem_c.dylib 0x00000001bb456314 abort + 164
30+
// 6 libsystem_c.dylib 0x00000001bb45572c err + 0
31+
// 7 swift-frontend 0x0000000105a1bab8 swift::SILFunctionConventions::getSILArgumentConvention(unsigned int) const (.cold.4) + 0
32+
// 8 swift-frontend 0x00000001016a1f9c swift::SILFunctionConventions::getSILArgumentConvention(unsigned int) const + 192
33+
// 9 swift-frontend 0x0000000100ebc888 (anonymous namespace)::OperandOwnershipClassifier::visitFullApply(swift::FullApplySite) + 244
34+
// 10 swift-frontend 0x0000000100ebae70 swift::Operand::getOperandOwnership() const + 148
35+
// 11 swift-frontend 0x0000000100ebada0 swift::checkOperandOwnershipInvariants(swift::Operand const*) + 28
36+
// 12 swift-frontend 0x0000000100fe2cc8 swift::SILInstruction::verifyOperandOwnership() const + 444
37+
// 13 swift-frontend 0x00000001014f32f4 swift::autodiff::getOrCreateSubsetParametersThunkForLinearMap(swift::SILOptFunctionBuilder&, swift::SILFunction*, swift::CanTypeWrapper<swift::SILFunctionType>, swift::CanTypeWrapper<swift::SILFunctionType>, swift::CanTypeWrapper<swift::SILFunctionType>, swift::AutoDiffDerivativeFunctionKind, swift::AutoDiffConfig const&, swift::AutoDiffConfig const&, swift::autodiff::ADContext&) + 3800
38+
// 14 swift-frontend 0x00000001014f455c swift::autodiff::getOrCreateSubsetParametersThunkForDerivativeFunction(swift::SILOptFunctionBuilder&, swift::SILValue, swift::SILValue, swift::AutoDiffDerivativeFunctionKind, swift::AutoDiffConfig const&, swift::AutoDiffConfig const&, swift::autodiff::ADContext&) + 2828
39+
// 15 swift-frontend 0x00000001015f012c (anonymous namespace)::DifferentiationTransformer::promoteToDifferentiableFunction(swift::DifferentiableFunctionInst*, swift::SILBuilder&, swift::SILLocation, swift::autodiff::DifferentiationInvoker) + 7120
40+
// 16 swift-frontend 0x00000001015ecae0 (anonymous namespace)::DifferentiationTransformer::processDifferentiableFunctionInst(swift::DifferentiableFunctionInst*) + 452
41+
// 17 swift-frontend 0x00000001015eab14 (anonymous namespace)::Differentiation::run() + 1152
42+
// 18 swift-frontend 0x0000000101659548 swift::SILPassManager::runModulePass(unsigned int) + 840
43+
// 19 swift-frontend 0x000000010165eaa4 swift::SILPassManager::execute() + 628
44+
// 20 swift-frontend 0x0000000101656428 swift::SILPassManager::executePassPipelinePlan(swift::SILPassPipelinePlan const&) + 68
45+
// 21 swift-frontend 0x00000001016563c8 swift::ExecuteSILPipelineRequest::evaluate(swift::Evaluator&, swift::SILPipelineExecutionDescriptor) const + 52
46+
// 22 swift-frontend 0x000000010167c574 swift::SimpleRequest<swift::ExecuteSILPipelineRequest, std::__1::tuple<> (swift::SILPipelineExecutionDescriptor), (swift::RequestFlags)1>::evaluateRequest(swift::ExecuteSILPipelineRequest const&, swift::Evaluator&) + 28
47+
// 23 swift-frontend 0x0000000101664c2c llvm::Expected<swift::ExecuteSILPipelineRequest::OutputType> swift::Evaluator::getResultUncached<swift::ExecuteSILPipelineRequest>(swift::ExecuteSILPipelineRequest const&) + 252
48+
// 24 swift-frontend 0x0000000101656618 swift::executePassPipelinePlan(swift::SILModule*, swift::SILPassPipelinePlan const&, bool, swift::irgen::IRGenModule*) + 68
49+
// 25 swift-frontend 0x0000000101669014 swift::runSILDiagnosticPasses(swift::SILModule&) + 92
50+
// 26 swift-frontend 0x0000000100e81634 swift::CompilerInstance::performSILProcessing(swift::SILModule*) + 72
51+
// 27 swift-frontend 0x0000000100e273cc performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 676
52+
// 28 swift-frontend 0x0000000100e26db8 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1028
53+
// 29 swift-frontend 0x0000000100e28870 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 3012
54+
// 30 swift-frontend 0x0000000100d62830 swift::mainEntry(int, char const**) + 484
55+
// 31 dyld 0x00000001179d90f4 start + 520

0 commit comments

Comments
 (0)