//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): // Similar to const-to-nodiff-function-diagnostic-improvement.slang, but with a CoopVec type // to reproduce a more realistic scenario. extension CoopVec : IDifferentiable { typealias Differential = CoopVec; }; [BackwardDerivativeOf(exp)] void exp_BackwardAutoDiff(inout DifferentialPair> p0, CoopVec.Differential dResult) { p0 = diffPair(p0.p, dResult * exp(p0.p)); } [Differentiable] CoopVec eval(CoopVec x) { // CHECK-NOT: ([[# @LINE+1]]): error 41020 return exp(x) - CoopVec(1.); } [Differentiable] CoopVec eval1(CoopVec x) { // test.slang(25): error 41020: derivative cannot be propagated through call to non-backward-differentiable function `CoopVec.$init`, use 'no_diff' to clarify intention. // CHECK: ([[# @LINE+1]]): error 41020 return exp(x) - CoopVec(x[0]); } RWStructuredBuffer output; [shader("compute")] [numthreads(1,1,1)] void computeMain(uint id : SV_DispatchThreadID) { var x = diffPair(CoopVec(2.0f), CoopVec(1.0f)); bwd_diff(eval)(x, CoopVec(1.0f)); output[0] = x.d[0]; var x1 = diffPair(CoopVec(2.0f), CoopVec(1.0f)); bwd_diff(eval1)(x1, CoopVec(1.0f)); output[1] = x1.d[1]; }