summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index 43987132e..9f5c1dc2e 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -1293,15 +1293,17 @@ Type* SemanticsVisitor::tryGetDifferentialType(ASTBuilder* builder, Type* type)
bool SemanticsVisitor::canStructBeUsedAsSelfDifferentialType(AggTypeDecl* aggTypeDecl)
{
- // A struct can be used as its own differential type if all its members are differentiable
- // and their differential types are the same as the original types.
+ // A struct can be used as its own differential type if all its members are differentiable, and
+ // none of the member is decorated with "no_diff", and their differential types are the same as
+ // the original types.
//
bool canBeUsed = true;
for (auto varDecl : aggTypeDecl->getDirectMemberDeclsOfType<VarDecl>())
{
// Try to get the differential type of the member.
Type* diffType = tryGetDifferentialType(getASTBuilder(), varDecl->getType());
- if (!diffType || !diffType->equals(varDecl->getType()))
+ if (!diffType || !diffType->equals(varDecl->getType()) ||
+ varDecl->findModifier<NoDiffModifier>())
{
canBeUsed = false;
break;