From 0c36c1f7517749ee86dd6bbc7351947749dc2cb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Sat, 17 Jan 2026 18:00:56 +0100 Subject: [PATCH 1/2] fix lexing of float literals with sign --- common/jinja/lexer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/jinja/lexer.cpp b/common/jinja/lexer.cpp index 85eaa1a76b..a7876a42f8 100644 --- a/common/jinja/lexer.cpp +++ b/common/jinja/lexer.cpp @@ -259,6 +259,11 @@ lexer_result lexer::tokenize(const std::string & source) { // Check for numbers following the unary operator std::string num = consume_while(is_integer); + if (pos < src.size() && src[pos] == '.' && pos + 1 < src.size() && is_integer(src[pos + 1])) { + ++pos; // Consume '.' + std::string frac = consume_while(is_integer); + num += "." + frac; + } std::string value = std::string(1, ch) + num; token::type t = num.empty() ? token::unary_operator : token::numeric_literal; // JJ_DEBUG("consumed unary operator or numeric literal: '%s'", value.c_str()); From 56ea9e31bcb1bb92a9509ef6e41a5f3aca39acff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Sat, 17 Jan 2026 18:05:20 +0100 Subject: [PATCH 2/2] add test --- tests/test-jinja.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test-jinja.cpp b/tests/test-jinja.cpp index 7adb302ffb..0f49bdc84f 100644 --- a/tests/test-jinja.cpp +++ b/tests/test-jinja.cpp @@ -247,6 +247,12 @@ static void test_expressions(testing & t) { "Bob" ); + test_template(t, "negative float (not dot notation)", + "{{ -1.0 }}", + json::object(), + "-1.0" + ); + test_template(t, "bracket notation", "{{ user['name'] }}", {{"user", {{"name", "Bob"}}}},