diff options
| author | Anders Leino <aleino@nvidia.com> | 2025-01-10 20:55:15 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-10 20:55:15 +0200 |
| commit | 4cfae806a6f9c0203ce44c4ce04df5ad66cdc8a2 (patch) | |
| tree | e11577f4a5d026cf9f0edb16f8c9728292bd0126 /source/slang | |
| parent | 2b76466c4bc8a47bd4ac69994bafdbb2924272c2 (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.cpp | 77 |
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) { |
