From 4cfae806a6f9c0203ce44c4ce04df5ad66cdc8a2 Mon Sep 17 00:00:00 2001 From: Anders Leino Date: Fri, 10 Jan 2025 20:55:15 +0200 Subject: Add exhaustive associativity test for WGSL (#6056) This closes #6005. --- source/slang/slang-emit-c-like.cpp | 77 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'source/slang') 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) { -- cgit v1.2.3