diff options
| author | Yong He <yonghe@outlook.com> | 2024-09-27 17:11:07 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-27 17:11:07 -0700 |
| commit | afb1405bf7974d714cee10fcce0c61fe28cd075d (patch) | |
| tree | f4016719071aefc7f8d353defd729c6a542612e9 /source/slang/slang-check-expr.cpp | |
| parent | f667593e77e18521b7f3bf4f339c2549b5e5eb1b (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.cpp | 20 |
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 { |
