summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-09-27 17:11:07 -0700
committerGitHub <noreply@github.com>2024-09-27 17:11:07 -0700
commitafb1405bf7974d714cee10fcce0c61fe28cd075d (patch)
treef4016719071aefc7f8d353defd729c6a542612e9 /source/slang/slang-check-expr.cpp
parentf667593e77e18521b7f3bf4f339c2549b5e5eb1b (diff)
Fix l-value computation for subscript call. (#5177)
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index 1b9725a8c..bdf8721e9 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -436,6 +436,26 @@ namespace Slang
// of a GLSL buffer interface block which isn't marked as
// read_only
expr->type.isLeftValue = isMutableGLSLBufferBlockVarExpr(baseExpr) && (expr->type.hasReadOnlyOnTarget == false);
+
+ // Another exception is if we are accessing a property
+ // that provides a [nonmutating] setter.
+ if (!expr->type.isLeftValue &&
+ as<PropertyDecl>(declRef.getDecl()))
+ {
+ bool isLValue = false;
+ for (auto member : as<ContainerDecl>(declRef.getDecl())->members)
+ {
+ if (as<SetterDecl>(member) || as< RefAccessorDecl>(member))
+ {
+ if (member->findModifier<NonmutatingAttribute>())
+ {
+ isLValue = true;
+ }
+ break;
+ }
+ }
+ expr->type.isLeftValue = isLValue;
+ }
}
else
{