summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorAnders Leino <aleino@nvidia.com>2025-01-10 20:55:15 +0200
committerGitHub <noreply@github.com>2025-01-10 20:55:15 +0200
commit4cfae806a6f9c0203ce44c4ce04df5ad66cdc8a2 (patch)
treee11577f4a5d026cf9f0edb16f8c9728292bd0126 /source/slang
parent2b76466c4bc8a47bd4ac69994bafdbb2924272c2 (diff)
Add exhaustive associativity test for WGSL (#6056)
This closes #6005.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-emit-c-like.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index 7ed4d2e4c..b63b9118e 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -733,6 +733,83 @@ bool CLikeSourceEmitter::maybeEmitParens(EmitOpInfo& outerPrec, const EmitOpInfo
{
needParens = true;
}
+ // a ^ b * c => a ^ (b * c)
+ else if (
+ prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
+ outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitXor_Right)
+ {
+ needParens = true;
+ }
+ // a * b ^ c => (a * b) ^ c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitXor_Left)
+ {
+ needParens = true;
+ }
+ // a | b * c => a | (b * c)
+ else if (
+ prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
+ outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitOr_Right)
+ {
+ needParens = true;
+ }
+ // a * b | c => (a * b) | c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitOr_Left)
+ {
+ needParens = true;
+ }
+ // a & b * c => a & (b * c)
+ else if (
+ prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
+ outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitAnd_Right)
+ {
+ needParens = true;
+ }
+ // a * b & c => (a * b) & c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitAnd_Left)
+ {
+ needParens = true;
+ }
+ // a << b * c => a << (b * c)
+ else if (
+ prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
+ outerPrec.leftPrecedence == EPrecedence::kEPrecedence_Shift_Right)
+ {
+ needParens = true;
+ }
+ // a * b << c => (a * b) << c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Shift_Left)
+ {
+ needParens = true;
+ }
+ // a != b == c => (a != b) == c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Left)
+ {
+ needParens = true;
+ }
+ // a == b < c => a == (b < c)
+ else if (
+ prec.leftPrecedence == EPrecedence::kEPrecedence_Relational_Left &&
+ outerPrec.leftPrecedence == EPrecedence::kEPrecedence_Equality_Right)
+ {
+ needParens = true;
+ }
+ // a < b == c => (a < b) == c
+ else if (
+ prec.rightPrecedence == EPrecedence::kEPrecedence_Relational_Right &&
+ outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Left)
+ {
+ needParens = true;
+ }
if (needParens)
{