diff --git a/Source/LexerParser/cmExprParser.cxx b/Source/LexerParser/cmExprParser.cxx index 128e502cd0..d30d5cf75b 100644 --- a/Source/LexerParser/cmExprParser.cxx +++ b/Source/LexerParser/cmExprParser.cxx @@ -569,7 +569,7 @@ static const yytype_uint8 yyrline[] = { 0, 86, 86, 91, 94, 99, 102, 107, 110, 115, 118, 122, 128, 131, 135, 141, 144, 148, 152, 158, - 161, 164, 167, 172, 175 + 161, 164, 168, 173, 176 }; #endif @@ -1591,37 +1591,38 @@ yyreduce: case 21: /* unary: exp_MINUS unary */ #line 164 "cmExprParser.y" { - (yyval.Number) = - (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Neg((yyvsp[0].Number)); } -#line 1597 "cmExprParser.cxx" +#line 1598 "cmExprParser.cxx" break; case 22: /* unary: exp_NOT unary */ -#line 167 "cmExprParser.y" +#line 168 "cmExprParser.y" { (yyval.Number) = ~ (yyvsp[0].Number); } -#line 1605 "cmExprParser.cxx" +#line 1606 "cmExprParser.cxx" break; case 23: /* factor: exp_NUMBER */ -#line 172 "cmExprParser.y" +#line 173 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1613 "cmExprParser.cxx" +#line 1614 "cmExprParser.cxx" break; case 24: /* factor: exp_OPENPARENT exp exp_CLOSEPARENT */ -#line 175 "cmExprParser.y" +#line 176 "cmExprParser.y" { (yyval.Number) = (yyvsp[-1].Number); } -#line 1621 "cmExprParser.cxx" +#line 1622 "cmExprParser.cxx" break; -#line 1625 "cmExprParser.cxx" +#line 1626 "cmExprParser.cxx" default: break; } @@ -1845,7 +1846,7 @@ yyreturnlab: return yyresult; } -#line 180 "cmExprParser.y" +#line 181 "cmExprParser.y" /* End of grammar */ diff --git a/Source/LexerParser/cmExprParser.y b/Source/LexerParser/cmExprParser.y index 52ac337b5c..edd3bc50ce 100644 --- a/Source/LexerParser/cmExprParser.y +++ b/Source/LexerParser/cmExprParser.y @@ -162,7 +162,8 @@ unary: $$ = + $2; } | exp_MINUS unary { - $$ = - $2; + $$ = cmExpr_yyget_extra(yyscanner) + ->Neg($2); } | exp_NOT unary { $$ = ~ $2; diff --git a/Source/cmExprParserHelper.cxx b/Source/cmExprParserHelper.cxx index b8d509f6f2..8e2dcc6455 100644 --- a/Source/cmExprParserHelper.cxx +++ b/Source/cmExprParserHelper.cxx @@ -201,6 +201,11 @@ std::int64_t cmExprParserHelper::Mod(std::int64_t l, std::int64_t r) return l % r; } +std::int64_t cmExprParserHelper::Neg(std::int64_t x) +{ + return -x; +} + // The __has_builtin preprocessor check was added in Clang 2.6 and GCC 10. // The __builtin_X_overflow intrinsics were added in Clang 3.4 and GCC 5. #ifndef __has_builtin diff --git a/Source/cmExprParserHelper.h b/Source/cmExprParserHelper.h index f5ea832fc4..94c0b680bc 100644 --- a/Source/cmExprParserHelper.h +++ b/Source/cmExprParserHelper.h @@ -42,6 +42,7 @@ public: std::int64_t Mul(std::int64_t l, std::int64_t r); std::int64_t Div(std::int64_t l, std::int64_t r); std::int64_t Mod(std::int64_t l, std::int64_t r); + std::int64_t Neg(std::int64_t x); static bool AddOverflow(long l, long r, long* p); static bool AddOverflow(long long l, long long r, long long* p);