diff options
| author | Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> | 2025-02-11 03:08:27 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-11 19:08:27 +0800 |
| commit | 551bbb5fbd61b53253de8f6ba3303bb4d29f8c86 (patch) | |
| tree | 44b21ceefd66ac2b92c1b165fe280dcfe276cf65 /source/slang/slang-check-decl.cpp | |
| parent | 0b4e463aee4107b383067424007c6a995f1f9f87 (diff) | |
Add checking for differentiability of the primal substitute function. (#6277)
Co-authored-by: Yong He <yonghe@outlook.com>
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-decl.cpp')
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 2ce4f81f1..76074f551 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -12114,6 +12114,27 @@ static void checkDerivativeAttribute( imaginaryArguments.directions, imaginaryArguments.thisArg, imaginaryArguments.thisArgDirection); + + // For primal-substitute we'd also want to make sure that the differentiability + // level of the target is as high as the funcDecl itself + // + if (auto declRefExpr = as<DeclRefExpr>(attr->funcExpr)) + { + if (auto declRef = declRefExpr->declRef) + { + auto targetDiffLevel = visitor->getShared()->getFuncDifferentiableLevel( + declRef.as<FunctionDeclBase>().getDecl()); + auto currDiffLevel = visitor->getShared()->getFuncDifferentiableLevel(funcDecl); + if (targetDiffLevel < currDiffLevel) + { + visitor->getSink()->diagnose( + attr->loc, + Diagnostics::primalSubstituteTargetMustHaveHigherDifferentiabilityLevel, + declRefExpr->declRef.getDecl(), + funcDecl); + } + } + } } static void checkCudaKernelAttribute( |
