Skip to content

Commit 4cfae80

Browse files
authored
Add exhaustive associativity test for WGSL (shader-slang#6056)
This closes shader-slang#6005.
1 parent 2b76466 commit 4cfae80

File tree

3 files changed

+1297
-0
lines changed

3 files changed

+1297
-0
lines changed

source/slang/slang-emit-c-like.cpp

+77
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,83 @@ bool CLikeSourceEmitter::maybeEmitParens(EmitOpInfo& outerPrec, const EmitOpInfo
733733
{
734734
needParens = true;
735735
}
736+
// a ^ b * c => a ^ (b * c)
737+
else if (
738+
prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
739+
outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitXor_Right)
740+
{
741+
needParens = true;
742+
}
743+
// a * b ^ c => (a * b) ^ c
744+
else if (
745+
prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
746+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitXor_Left)
747+
{
748+
needParens = true;
749+
}
750+
// a | b * c => a | (b * c)
751+
else if (
752+
prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
753+
outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitOr_Right)
754+
{
755+
needParens = true;
756+
}
757+
// a * b | c => (a * b) | c
758+
else if (
759+
prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
760+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitOr_Left)
761+
{
762+
needParens = true;
763+
}
764+
// a & b * c => a & (b * c)
765+
else if (
766+
prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
767+
outerPrec.leftPrecedence == EPrecedence::kEPrecedence_BitAnd_Right)
768+
{
769+
needParens = true;
770+
}
771+
// a * b & c => (a * b) & c
772+
else if (
773+
prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
774+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_BitAnd_Left)
775+
{
776+
needParens = true;
777+
}
778+
// a << b * c => a << (b * c)
779+
else if (
780+
prec.leftPrecedence == EPrecedence::kEPrecedence_Multiplicative_Left &&
781+
outerPrec.leftPrecedence == EPrecedence::kEPrecedence_Shift_Right)
782+
{
783+
needParens = true;
784+
}
785+
// a * b << c => (a * b) << c
786+
else if (
787+
prec.rightPrecedence == EPrecedence::kEPrecedence_Multiplicative_Right &&
788+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Shift_Left)
789+
{
790+
needParens = true;
791+
}
792+
// a != b == c => (a != b) == c
793+
else if (
794+
prec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Right &&
795+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Left)
796+
{
797+
needParens = true;
798+
}
799+
// a == b < c => a == (b < c)
800+
else if (
801+
prec.leftPrecedence == EPrecedence::kEPrecedence_Relational_Left &&
802+
outerPrec.leftPrecedence == EPrecedence::kEPrecedence_Equality_Right)
803+
{
804+
needParens = true;
805+
}
806+
// a < b == c => (a < b) == c
807+
else if (
808+
prec.rightPrecedence == EPrecedence::kEPrecedence_Relational_Right &&
809+
outerPrec.rightPrecedence == EPrecedence::kEPrecedence_Equality_Left)
810+
{
811+
needParens = true;
812+
}
736813

737814
if (needParens)
738815
{

0 commit comments

Comments
 (0)