aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--queries/c/indents.scm8
-rw-r--r--tests/indent/c/issue-4525.c23
-rw-r--r--tests/indent/c_spec.lua16
3 files changed, 46 insertions, 1 deletions
diff --git a/queries/c/indents.scm b/queries/c/indents.scm
index 71f47ced1..4d1ba3940 100644
--- a/queries/c/indents.scm
+++ b/queries/c/indents.scm
@@ -6,9 +6,15 @@
(compound_literal_expression)
(initializer_list)
(init_declarator)
- (expression_statement)
] @indent.begin
+; With current indent logic, if we capture expression_statement with @indent.begin
+; It will be affected by _parent_ node with error subnodes deep down the tree
+; So narrow indent capture to check for error inside expression statement only,
+(expression_statement
+ (_) @indent.begin
+ ";" @indent.end)
+
(
ERROR
"for" "(" @indent.begin ";" ";" ")" @indent.end)
diff --git a/tests/indent/c/issue-4525.c b/tests/indent/c/issue-4525.c
new file mode 100644
index 000000000..35feccedc
--- /dev/null
+++ b/tests/indent/c/issue-4525.c
@@ -0,0 +1,23 @@
+#include <stdint.h>
+#include <inttypes.h>
+#include <stdio.h>
+
+char *a = "a" "b" "c" D;
+
+static int a, b, c;
+a = b = c = 0;
+
+static int d = 0, e = 0, f = 0;
+
+int main(void) {
+ printf("String" PRIu64 "\n", (uint64_t)0);
+ printf("String" AND_ERROR_NODE "and string");
+ fflush(stdout);
+ a = 0; b = 0; c = 0;
+ int x = 0; int y = 0; int z = 0;
+ foo(1, 2);
+ x++;
+ a = b
+ = c
+ = d;
+}
diff --git a/tests/indent/c_spec.lua b/tests/indent/c_spec.lua
index 4fcdb3ebf..4e2826a54 100644
--- a/tests/indent/c_spec.lua
+++ b/tests/indent/c_spec.lua
@@ -73,5 +73,21 @@ describe("indent C:", function()
for _, line in ipairs { 10, 12, 14 } do
runner:new_line("if_else.c", { on_line = line, text = "{}", indent = 4 })
end
+
+ for _, info in ipairs {
+ { 8, 0 },
+ { 10, 0 },
+ { 13, 4 },
+ { 14, 4 },
+ { 15, 4 },
+ { 16, 4 },
+ { 17, 4 },
+ { 18, 4 },
+ { 20, 8 },
+ { 21, 8 },
+ { 22, 4 },
+ } do
+ runner:new_line("issue-4525.c", { on_line = info[1], text = "x++;", indent = info[2] })
+ end
end)
end)