@@ -4706,29 +4706,63 @@ namespace Slang
4706
4706
}
4707
4707
}
4708
4708
4709
+ static IRIntegerValue _foldIntegerPrefixOp (TokenType tokenType, IRIntegerValue value)
4710
+ {
4711
+ switch (tokenType)
4712
+ {
4713
+ case TokenType::OpNot: return !value;
4714
+ case TokenType::OpBitNot: return ~value;
4715
+ case TokenType::OpAdd: return value;
4716
+ case TokenType::OpSub: return -value;
4717
+ default :
4718
+ {
4719
+ SLANG_ASSERT (!" Unexpected op" );
4720
+ return value;
4721
+ }
4722
+ }
4723
+ }
4724
+
4725
+ static IRFloatingPointValue _foldFloatPrefixOp (TokenType tokenType, IRFloatingPointValue value)
4726
+ {
4727
+ switch (tokenType)
4728
+ {
4729
+ case TokenType::OpNot: return !value;
4730
+ case TokenType::OpAdd: return value;
4731
+ case TokenType::OpSub: return -value;
4732
+ default :
4733
+ {
4734
+ SLANG_ASSERT (!" Unexpected op" );
4735
+ return value;
4736
+ }
4737
+ }
4738
+ }
4739
+
4709
4740
static RefPtr<Expr> parsePrefixExpr (Parser* parser)
4710
4741
{
4711
- switch ( peekTokenType (parser) )
4742
+ auto tokenType = peekTokenType (parser);
4743
+ switch ( tokenType )
4712
4744
{
4713
4745
default :
4714
4746
return parsePostfixExpr (parser);
4715
4747
4748
+
4716
4749
case TokenType::OpInc:
4717
4750
case TokenType::OpDec:
4751
+ {
4752
+ RefPtr<PrefixExpr> prefixExpr = new PrefixExpr ();
4753
+ parser->FillPosition (prefixExpr.Ptr ());
4754
+ prefixExpr->FunctionExpr = parseOperator (parser);
4755
+
4756
+ auto arg = parsePrefixExpr (parser);
4757
+
4758
+ prefixExpr->Arguments .add (arg);
4759
+ return prefixExpr;
4760
+ }
4718
4761
case TokenType::OpNot:
4719
4762
case TokenType::OpBitNot:
4720
4763
case TokenType::OpAdd:
4721
- {
4722
- RefPtr<PrefixExpr> prefixExpr = new PrefixExpr ();
4723
- parser->FillPosition (prefixExpr.Ptr ());
4724
- prefixExpr->FunctionExpr = parseOperator (parser);
4725
- prefixExpr->Arguments .add (parsePrefixExpr (parser));
4726
- return prefixExpr;
4727
- }
4728
4764
case TokenType::OpSub:
4729
4765
{
4730
- // Special case prefix sub (aka neg), so if it's on a literal, it produces a new literal
4731
-
4732
4766
RefPtr<PrefixExpr> prefixExpr = new PrefixExpr ();
4733
4767
parser->FillPosition (prefixExpr.Ptr ());
4734
4768
prefixExpr->FunctionExpr = parseOperator (parser);
@@ -4739,7 +4773,7 @@ namespace Slang
4739
4773
{
4740
4774
RefPtr<IntegerLiteralExpr> newLiteral = new IntegerLiteralExpr (*intLit);
4741
4775
4742
- IRIntegerValue value = - newLiteral->value ;
4776
+ IRIntegerValue value = _foldIntegerPrefixOp (tokenType, newLiteral->value ) ;
4743
4777
4744
4778
// Need to get the basic type, so we can fit to underlying type
4745
4779
if (auto basicExprType = as<BasicExpressionType>(intLit->type .type ))
@@ -4753,13 +4787,14 @@ namespace Slang
4753
4787
else if (auto floatLit = as<FloatingPointLiteralExpr>(arg))
4754
4788
{
4755
4789
RefPtr<FloatingPointLiteralExpr> newLiteral = new FloatingPointLiteralExpr (*floatLit);
4756
- newLiteral->value = -newLiteral- >value ;
4790
+ newLiteral->value = _foldFloatPrefixOp (tokenType, floatLit- >value ) ;
4757
4791
return newLiteral;
4758
4792
}
4759
-
4793
+
4760
4794
prefixExpr->Arguments .add (arg);
4761
4795
return prefixExpr;
4762
4796
}
4797
+
4763
4798
break ;
4764
4799
}
4765
4800
}
0 commit comments