Commit a1de614ba for llama.cpp

commit a1de614ba37d0ee4028c82d71cbcfb47bf1c6938
Author: Sigbjørn Skjæret <sigbjorn.skjaeret@huggingface.co>
Date:   Sat Sep 26 08:56:48 2026 +0200

    jinja : support noncall test statements with arg (#29443)

    * support noncall test statements with arg

    * add tests

diff --git a/common/jinja/parser.cpp b/common/jinja/parser.cpp
index 1ddceede9..4ad5bb970 100644
--- a/common/jinja/parser.cpp
+++ b/common/jinja/parser.cpp
@@ -429,8 +429,15 @@ private:
             bool negate = false;
             if (is_identifier("not")) { ++current; negate = true; }
             auto test_id = parse_primary_expression();
-            // FIXME: tests can also be expressed like this: if x is eq 3
-            if (is(token::open_paren)) test_id = parse_call_expression(std::move(test_id));
+            if (is(token::open_paren)) {
+                test_id = parse_call_expression(std::move(test_id));
+            } else if (is(token::numeric_literal) || is(token::string_literal) || is(token::open_curly_bracket) || is(token::open_square_bracket) ||
+                    (is(token::identifier) && !is_identifier("and") && !is_identifier("or") && !is_identifier("else"))) {
+                size_t call_pos = current;
+                statements args;
+                args.push_back(std::move(parse_unary_expression()));
+                test_id = mk_stmt<call_expression>(call_pos, std::move(test_id), std::move(args));
+            }
             operand = mk_stmt<test_expression>(start_pos, std::move(operand), negate, std::move(test_id));
         }
         return operand;
diff --git a/tests/test-jinja.cpp b/tests/test-jinja.cpp
index cd8fa723c..064f5927b 100644
--- a/tests/test-jinja.cpp
+++ b/tests/test-jinja.cpp
@@ -1153,7 +1153,7 @@ static void test_tests(testing & t) {
     );

     test_template(t, "is not equalto",
-        "{{ 'yes' if 3 is not equalto(4) }}",
+        "{{ 'yes' if 3 is not equalto 4 }}",
         json::object(),
         "yes"
     );
@@ -1165,7 +1165,7 @@ static void test_tests(testing & t) {
     );

     test_template(t, "is gt",
-        "{{ 'yes' if 3 is gt(2) }}",
+        "{{ 'yes' if 3 is gt 2 }}",
         json::object(),
         "yes"
     );
@@ -1177,7 +1177,7 @@ static void test_tests(testing & t) {
     );

     test_template(t, "is lt",
-        "{{ 'yes' if 2 is lt(3) }}",
+        "{{ 'yes' if 2 is lt 3 }}",
         json::object(),
         "yes"
     );
@@ -1194,6 +1194,12 @@ static void test_tests(testing & t) {
         "yes"
     );

+    test_template(t, "is lt and gt",
+        "{{ 'yes' if x is lt 3 and x is gt 1 }}",
+        {{"x", 2}},
+        "yes"
+    );
+
     test_template(t, "is lower",
         "{{ 'yes' if 'lowercase' is lower }}",
         json::object(),
@@ -1248,6 +1254,12 @@ static void test_tests(testing & t) {
         "yes"
     );

+    test_template(t, "is integer or float",
+        "{{ 'yes' if x.y is integer or x.y is float else 'no' }}",
+        {{"x", {{"y", 1.1}}}},
+        "yes"
+    );
+
     test_template(t, "is sequence",
         "{{ 'yes' if x is sequence }}",
         {{"x", json::array({1, 2, 3})}},