@@ -483,7 +483,9 @@ Expression ParseIn()
483
483
while ( _token . id != TokenId . CloseParen )
484
484
{
485
485
NextToken ( ) ;
486
- Expression right = ParsePrimary ( ) ;
486
+
487
+ //we need to parse unary expressions because otherwise 'in' clause will fail in use cases like 'in (-1, -1)' or 'in (!true)'
488
+ Expression right = ParseUnary ( ) ;
487
489
488
490
//check for direct type match
489
491
if ( identifier . Type != right . Type )
@@ -752,13 +754,11 @@ Expression ParseMultiplicative()
752
754
// -, !, not unary operators
753
755
Expression ParseUnary ( )
754
756
{
755
- if ( _token . id == TokenId . Minus || _token . id == TokenId . Exclamation ||
756
- TokenIdentifierIs ( "not" ) )
757
+ if ( _token . id == TokenId . Minus || _token . id == TokenId . Exclamation || TokenIdentifierIs ( "not" ) )
757
758
{
758
759
Token op = _token ;
759
760
NextToken ( ) ;
760
- if ( op . id == TokenId . Minus && ( _token . id == TokenId . IntegerLiteral ||
761
- _token . id == TokenId . RealLiteral ) )
761
+ if ( op . id == TokenId . Minus && ( _token . id == TokenId . IntegerLiteral || _token . id == TokenId . RealLiteral ) )
762
762
{
763
763
_token . text = "-" + _token . text ;
764
764
_token . pos = op . pos ;
@@ -870,12 +870,14 @@ Expression ParseIntegerLiteral()
870
870
ulong value ;
871
871
if ( ! ulong . TryParse ( text , out value ) )
872
872
throw ParseError ( Res . InvalidIntegerLiteral , text ) ;
873
+
873
874
NextToken ( ) ;
874
875
if ( ! string . IsNullOrEmpty ( qualifier ) )
875
876
{
876
877
if ( qualifier == "U" ) return CreateLiteral ( ( uint ) value , text ) ;
877
878
if ( qualifier == "L" ) return CreateLiteral ( ( long ) value , text ) ;
878
- else if ( qualifier == "UL" ) return CreateLiteral ( value , text ) ;
879
+
880
+ return CreateLiteral ( value , text ) ;
879
881
}
880
882
if ( value <= int . MaxValue ) return CreateLiteral ( ( int ) value , text ) ;
881
883
if ( value <= uint . MaxValue ) return CreateLiteral ( ( uint ) value , text ) ;
@@ -887,13 +889,14 @@ Expression ParseIntegerLiteral()
887
889
long value ;
888
890
if ( ! long . TryParse ( text , out value ) )
889
891
throw ParseError ( Res . InvalidIntegerLiteral , text ) ;
892
+
890
893
NextToken ( ) ;
891
894
if ( ! string . IsNullOrEmpty ( qualifier ) )
892
895
{
893
896
if ( qualifier == "L" )
894
897
return CreateLiteral ( value , text ) ;
895
- else
896
- throw ParseError ( Res . InvalidIntegerLiteral , qualifier ) ;
898
+
899
+ throw ParseError ( Res . MinusCannotBeAppliedToUnsignedInteger ) ;
897
900
}
898
901
899
902
if ( value <= int . MaxValue ) return CreateLiteral ( ( int ) value , text ) ;
0 commit comments