From 5d078d962e124e24ac7877cb29131dab794d7df9 Mon Sep 17 00:00:00 2001 From: Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> Date: Thu, 7 Sep 2023 20:04:41 -0400 Subject: Fix compiler crashing when `[BackwardDerivativeOf(fn)]` refers to an unresolved `fn` (#3191) * Fix compiler crashing on unresolved decl-ref * Update autodiff-custom-diff-unresolved.slang --------- Co-authored-by: Yong He --- source/slang/slang-check-decl.cpp | 5 +++++ .../autodiff-custom-diff-unresolved.slang | 23 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 tests/diagnostics/autodiff-custom-diff-unresolved.slang diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 1ebd50cbd..56b0a991b 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -7042,6 +7042,11 @@ namespace Slang { if (declRefExpr->declRef) visitor->ensureDecl(declRefExpr->declRef, DeclCheckState::TypesFullyResolved); + else + { + visitor->getSink()->diagnose(attr, Diagnostics::cannotResolveDerivativeFunction); + return; + } } else if (auto overloadedExpr = as(checkedFuncExpr)) { diff --git a/tests/diagnostics/autodiff-custom-diff-unresolved.slang b/tests/diagnostics/autodiff-custom-diff-unresolved.slang new file mode 100644 index 000000000..0ca055b59 --- /dev/null +++ b/tests/diagnostics/autodiff-custom-diff-unresolved.slang @@ -0,0 +1,23 @@ +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): + +// Simple check to see that the compiler returns an error message if the +// custom derivative definition points to an undefined function. +// + +void __d_f(float x, float.Differential dout) +{ +} + +[BackwardDerivative(__d_g)] +float f(float x) +{ + // CHECK: tests/diagnostics/autodiff-custom-diff-unresolved.slang([[@LINE-3]]): error 30015: undefined identifier '__d_g'. + // CHECK-NEXT: [BackwardDerivative(__d_g)] + return x * x; +} + +float main(float x) +{ + DifferentialPair dpx = diffPair(x, 1.f); + bwd_diff(f)(dpx, 1.f); +} \ No newline at end of file -- cgit v1.2.3