Module Name:    src
Committed By:   rillig
Date:           Sat Jun 17 22:09:25 UTC 2023

Modified Files:
        src/tests/usr.bin/indent: edge_cases.c lsym_comment.c lsym_funcname.c
            lsym_lparen_or_lbracket.c lsym_tag.c lsym_typedef.c lsym_unary_op.c
            lsym_word.c opt_T.c opt_bad.c opt_bbb.c opt_bc.c opt_cd.c opt_sc.c

Log Message:
tests/indent: add miscellaneous test cases found during clean up


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/indent/edge_cases.c
cvs rdiff -u -r1.21 -r1.22 src/tests/usr.bin/indent/lsym_comment.c
cvs rdiff -u -r1.6 -r1.7 src/tests/usr.bin/indent/lsym_funcname.c \
    src/tests/usr.bin/indent/lsym_word.c
cvs rdiff -u -r1.18 -r1.19 src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c
cvs rdiff -u -r1.9 -r1.10 src/tests/usr.bin/indent/lsym_tag.c
cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/indent/lsym_typedef.c \
    src/tests/usr.bin/indent/opt_bbb.c
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/indent/lsym_unary_op.c
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/indent/opt_T.c \
    src/tests/usr.bin/indent/opt_cd.c
cvs rdiff -u -r1.10 -r1.11 src/tests/usr.bin/indent/opt_bad.c
cvs rdiff -u -r1.12 -r1.13 src/tests/usr.bin/indent/opt_bc.c
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/indent/opt_sc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/indent/edge_cases.c
diff -u src/tests/usr.bin/indent/edge_cases.c:1.3 src/tests/usr.bin/indent/edge_cases.c:1.4
--- src/tests/usr.bin/indent/edge_cases.c:1.3	Sun Jun  4 18:58:30 2023
+++ src/tests/usr.bin/indent/edge_cases.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: edge_cases.c,v 1.3 2023/06/04 18:58:30 rillig Exp $ */
+/* $NetBSD: edge_cases.c,v 1.4 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for edge cases in the C programming language that indent does not
@@ -44,3 +44,135 @@ number = array <:subscript: >;
 
 /* TODO: test trigraphs, which are as unusual as digraphs */
 /* TODO: test digraphs and trigraphs in string literals, just for fun */
+
+
+/*
+ * The keywords 'break', 'continue', 'goto' and 'restrict' are ordinary words,
+ * they do not force a line break before.
+ */
+//indent input
+{
+	Whether to break or not to break, that is the question;
+
+	The people goto the shopping mall;
+
+	Begin at the beginning, then continue until you come to the end;
+	then stop;
+
+	Try to restrict yourself;
+}
+//indent end
+
+//indent run-equals-input -di0
+
+
+/*
+ * Try a bit of Perl code, just for fun, taken from pkgsrc/pkgtools/pkglint4.
+ *
+ * It works surprisingly well.
+ */
+//indent input
+package PkgLint::Line;
+
+use strict;
+use warnings;
+
+BEGIN {
+	import PkgLint::Util qw(
+		false true
+		assert
+	);
+}
+
+use enum qw(FNAME LINES TEXT PHYSLINES CHANGED BEFORE AFTER EXTRA);
+
+sub new($$$$) {
+	my ($class, $fname, $lines, $text, $physlines) = @_;
+	my ($self) = ([$fname, $lines, $text, $physlines, false, [], [], {}]);
+	bless($self, $class);
+	return $self;
+}
+
+sub fname($)		{ return shift()->[FNAME]; }
+
+# querying, getting and setting the extra values.
+sub has($$) {
+	my ($self, $name) = @_;
+	return exists($self->[EXTRA]->{$name});
+}
+//indent end
+
+//indent run -di0 -nfbs -npsl
+// $ Space after '::'.
+package PkgLint:: Line;
+
+use strict;
+use warnings;
+
+BEGIN {
+// $ Space after '::'.
+	import PkgLint:: Util qw(
+				 false true
+				 assert
+	);
+}
+
+// $ Space between 'qw' and '('.
+use enum qw (FNAME LINES TEXT PHYSLINES CHANGED BEFORE AFTER EXTRA);
+
+sub new($$$$) {
+// $ No space between 'my' and '('.
+	my($class, $fname, $lines, $text, $physlines) = @_;
+	my($self) = ([$fname, $lines, $text, $physlines, false, [], [], {
+// $ Line break between '{' and '}'.
+	}
+// $ Line break between '}' and ']'.
+	]);
+	bless($self, $class);
+	return $self;
+}
+
+sub fname($) {
+	return shift()->[FNAME];
+}
+
+// $ Preprocessing lines are mostly preserved.
+# querying, getting and setting the extra values.
+sub has($$) {
+	my($self, $name) = @_;
+	return exists($self->[EXTRA]->{
+// $ Line breaks between '{', '$name', '}' and ');'.
+		$name
+	}
+	);
+}
+// exit 1
+// error: Standard Input:17: Unbalanced parentheses
+// warning: Standard Input:17: Extra ']'
+// warning: Standard Input:17: Extra ')'
+// error: Standard Input:27: Unbalanced parentheses
+// warning: Standard Input:27: Extra ')'
+//indent end
+
+
+/*
+ * Try a piece of old-style JavaScript, just for fun, using '==' instead of the
+ * now recommended '==='.
+ */
+//indent input
+function join(delim, values)
+{
+	if (values.length == 0)
+		return '';
+	if (values.length == 1)
+		return values[0];
+	var result = '';
+	for (var i in values) {
+		result += delim;
+		result += values[i];
+	}
+	return result.substr(delim.length);
+}
+//indent end
+
+//indent run-equals-input -di0 -npsl

Index: src/tests/usr.bin/indent/lsym_comment.c
diff -u src/tests/usr.bin/indent/lsym_comment.c:1.21 src/tests/usr.bin/indent/lsym_comment.c:1.22
--- src/tests/usr.bin/indent/lsym_comment.c:1.21	Wed Jun 14 09:31:05 2023
+++ src/tests/usr.bin/indent/lsym_comment.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_comment.c,v 1.21 2023/06/14 09:31:05 rillig Exp $ */
+/* $NetBSD: lsym_comment.c,v 1.22 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_comment, which starts a comment.
@@ -1144,3 +1144,54 @@ int block;			/* comment line 1 comment l
 // $ FIXME: It's a comment, not code.
 /*/ comment ? or : not;		/* */
 //indent end
+
+
+/*
+ * The tokens '/' and '*' do not form a comment when they are separated by a
+ * space.
+ */
+//indent input
+int a = b / *c;
+// $ Indent can be tricked into treating '/' as a unary operator, thus turning
+// $ some operators into the start of a comment. This only works in
+// $ syntactically invalid text.
+int a = b + / * c;
+//indent end
+
+//indent run -di0
+int a = b / *c;
+// $ FIXME: Don't merge the two operators; there are enough situations where
+// $ indent has to guess whether an operator is unary or binary, and these
+// $ heuristics can go wrong.
+int a = b + /*c;
+//indent end
+
+
+/*
+ * Ensure that tab characters that are broken into separate lines are replaced
+ * with spaces; other tabs are preserved.
+ */
+//indent input
+/* word	word	word	word	word	word	word	word	word */
+//indent end
+
+//indent run -l38
+/*
+ * word	word	word	word	word
+ * word	word	word	word
+ */
+//indent end
+
+
+/* In no-wrap comments, every single newline is preserved. */
+//indent input
+/*-
+paragraph 1
+
+
+
+paragraph 2
+ */
+//indent end
+
+//indent run-equals-input

Index: src/tests/usr.bin/indent/lsym_funcname.c
diff -u src/tests/usr.bin/indent/lsym_funcname.c:1.6 src/tests/usr.bin/indent/lsym_funcname.c:1.7
--- src/tests/usr.bin/indent/lsym_funcname.c:1.6	Thu Jun 15 09:19:07 2023
+++ src/tests/usr.bin/indent/lsym_funcname.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_funcname.c,v 1.6 2023/06/15 09:19:07 rillig Exp $ */
+/* $NetBSD: lsym_funcname.c,v 1.7 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_funcname, which is the name of a function, but only
@@ -33,3 +33,32 @@ function_with_comment(void)
 //indent end
 
 //indent run-equals-input
+
+
+/*
+ * The heuristics for telling a function definition and a function declaration
+ * apart look at the remaining characters in a line but don't tokenize them.
+ * Due to that, a ');' in a comment influences the heuristics.
+ */
+//indent input
+// $ This ');' in the comment does not mark the end of the declaration.
+void heuristics_semicolon_comment(/* ); */) {}
+void heuristics_semicolon_no_comm(/* -- */) {}
+void heuristics_comma_comment(/* ), */) {}
+void heuristics_comma_no_comm(/* -- */) {}
+//indent end
+
+//indent run -di0
+void heuristics_semicolon_comment(/* ); */) {
+}
+void
+heuristics_semicolon_no_comm(/* -- */)
+{
+}
+void heuristics_comma_comment(/* ), */) {
+}
+void
+heuristics_comma_no_comm(/* -- */)
+{
+}
+//indent end
Index: src/tests/usr.bin/indent/lsym_word.c
diff -u src/tests/usr.bin/indent/lsym_word.c:1.6 src/tests/usr.bin/indent/lsym_word.c:1.7
--- src/tests/usr.bin/indent/lsym_word.c:1.6	Sun Apr 24 10:36:37 2022
+++ src/tests/usr.bin/indent/lsym_word.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_word.c,v 1.6 2022/04/24 10:36:37 rillig Exp $ */
+/* $NetBSD: lsym_word.c,v 1.7 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_word, which represents a constant, a string
@@ -14,6 +14,10 @@
 // TODO: Add more systematic tests.
 // TODO: Completely cover each state transition in lex_number_state.
 
+// TODO: Consider splitting this token into lsym_name and lsym_value, to
+// TODO: make it easier to skip tokens during lookahead, for example since
+// TODO: L"" is not an identifier but a string literal.
+
 //indent input
 // TODO: add input
 //indent end

Index: src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c
diff -u src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c:1.18 src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c:1.19
--- src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c:1.18	Fri Jun 16 23:07:52 2023
+++ src/tests/usr.bin/indent/lsym_lparen_or_lbracket.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_lparen_or_lbracket.c,v 1.18 2023/06/16 23:07:52 rillig Exp $ */
+/* $NetBSD: lsym_lparen_or_lbracket.c,v 1.19 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_lparen_or_lbracket, which represents a '(' or '['
@@ -355,3 +355,24 @@ int arr[] = {
 	['1'] = 2,
 };
 //indent end
+
+
+/* In an initializer, a '(' does not start a function definition. */
+//indent input
+{
+type var = {
+.CONCAT(a, b)
+= init,
+};
+}
+
+//indent end
+
+//indent run
+{
+	type		var = {
+		.CONCAT(a, b)
+		= init,
+	};
+}
+//indent end

Index: src/tests/usr.bin/indent/lsym_tag.c
diff -u src/tests/usr.bin/indent/lsym_tag.c:1.9 src/tests/usr.bin/indent/lsym_tag.c:1.10
--- src/tests/usr.bin/indent/lsym_tag.c:1.9	Thu Jun 15 10:34:12 2023
+++ src/tests/usr.bin/indent/lsym_tag.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_tag.c,v 1.9 2023/06/15 10:34:12 rillig Exp $ */
+/* $NetBSD: lsym_tag.c,v 1.10 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_tag, which represents one of the keywords
@@ -156,3 +156,24 @@ enum multi_line {
 //indent run-equals-input -ci4
 
 //indent run-equals-input -ci4 -nlp
+
+
+/*
+ * When 'typedef' or a tag is followed by a name, that name marks a type and a
+ * following '*' marks a pointer type.
+ */
+//indent input
+{
+	// $ Syntactically invalid but shows that '*' is not multiplication.
+	a = struct x * y;
+	a = (struct x * y)z;
+}
+//indent end
+
+//indent run
+{
+	// $ Everything before the '*' is treated as a declaration.
+	a = struct x   *y;
+	a = (struct x *y)z;
+}
+//indent end

Index: src/tests/usr.bin/indent/lsym_typedef.c
diff -u src/tests/usr.bin/indent/lsym_typedef.c:1.8 src/tests/usr.bin/indent/lsym_typedef.c:1.9
--- src/tests/usr.bin/indent/lsym_typedef.c:1.8	Fri Jun 16 12:30:45 2023
+++ src/tests/usr.bin/indent/lsym_typedef.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_typedef.c,v 1.8 2023/06/16 12:30:45 rillig Exp $ */
+/* $NetBSD: lsym_typedef.c,v 1.9 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_typedef, which represents the keyword 'typedef'
@@ -90,3 +90,24 @@ struct {
 //indent end
 
 //indent run-equals-input -di0
+
+
+/*
+ * When 'typedef' or a tag is followed by a name, that name marks a type and a
+ * following '*' marks a pointer type.
+ */
+//indent input
+{
+	// $ Syntactically invalid but shows that '*' is not multiplication.
+	a = typedef name * y;
+	a = (typedef x * y)z;
+}
+//indent end
+
+//indent run
+{
+	// $ Everything before the '*' is treated as a declaration.
+	a = typedef name *y;
+	a = (typedef x *y)z;
+}
+//indent end
Index: src/tests/usr.bin/indent/opt_bbb.c
diff -u src/tests/usr.bin/indent/opt_bbb.c:1.8 src/tests/usr.bin/indent/opt_bbb.c:1.9
--- src/tests/usr.bin/indent/opt_bbb.c:1.8	Sat May 20 11:19:17 2023
+++ src/tests/usr.bin/indent/opt_bbb.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_bbb.c,v 1.8 2023/05/20 11:19:17 rillig Exp $ */
+/* $NetBSD: opt_bbb.c,v 1.9 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the options '-bbb' and '-nbbb'.
@@ -65,3 +65,25 @@ function_definition(void)
 //indent end
 
 //indent run-equals-input -nbbb
+
+
+//indent input
+{
+label:				/* not a block comment */
+	stmt;			/* not a block comment */
+	/**
+	 * block comment
+	 */
+}
+//indent end
+
+//indent run -bbb
+{
+label:				/* not a block comment */
+	stmt;			/* not a block comment */
+
+	/**
+	 * block comment
+	 */
+}
+//indent end

Index: src/tests/usr.bin/indent/lsym_unary_op.c
diff -u src/tests/usr.bin/indent/lsym_unary_op.c:1.11 src/tests/usr.bin/indent/lsym_unary_op.c:1.12
--- src/tests/usr.bin/indent/lsym_unary_op.c:1.11	Fri Jun 16 12:55:57 2023
+++ src/tests/usr.bin/indent/lsym_unary_op.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_unary_op.c,v 1.11 2023/06/16 12:55:57 rillig Exp $ */
+/* $NetBSD: lsym_unary_op.c,v 1.12 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the token lsym_unary_op, which represents a unary operator.
@@ -92,3 +92,27 @@ unary_operators(void)
 //indent end
 
 //indent run-equals-input -di0
+
+
+/* All asterisks from a pointer type are merged into a single token. */
+//indent input
+{
+char*
+*
+*
+*x;
+char
+*
+*
+*
+*x;
+}
+//indent end
+
+//indent run
+{
+	char	    ****x;
+	char
+		    ****x;
+}
+//indent end

Index: src/tests/usr.bin/indent/opt_T.c
diff -u src/tests/usr.bin/indent/opt_T.c:1.4 src/tests/usr.bin/indent/opt_T.c:1.5
--- src/tests/usr.bin/indent/opt_T.c:1.4	Sun Apr 24 09:04:12 2022
+++ src/tests/usr.bin/indent/opt_T.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_T.c,v 1.4 2022/04/24 09:04:12 rillig Exp $ */
+/* $NetBSD: opt_T.c,v 1.5 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the option '-T', which specifies a single identifier that indent
@@ -33,3 +33,20 @@ int mult = (unknown_type_name) * arg;
 /* See the option -ta for handling these types. */
 int suff = (unknown_type_name_t) * arg;
 //indent end
+
+
+/*
+ * The keyword table has precedence over the custom-specified types; otherwise,
+ * the following lines would be declarations, and the declarators would be
+ * indented by 16.
+ */
+//indent input
+{
+	break x;
+	continue x;
+	goto x;
+	return x;
+}
+//indent end
+
+//indent run-equals-input -Tbreak -Tcontinue -Tgoto -Treturn
Index: src/tests/usr.bin/indent/opt_cd.c
diff -u src/tests/usr.bin/indent/opt_cd.c:1.4 src/tests/usr.bin/indent/opt_cd.c:1.5
--- src/tests/usr.bin/indent/opt_cd.c:1.4	Sun Apr 24 09:04:12 2022
+++ src/tests/usr.bin/indent/opt_cd.c	Sat Jun 17 22:09:24 2023
@@ -1,12 +1,46 @@
-/* $NetBSD: opt_cd.c,v 1.4 2022/04/24 09:04:12 rillig Exp $ */
+/* $NetBSD: opt_cd.c,v 1.5 2023/06/17 22:09:24 rillig Exp $ */
+
+/*
+ * Tests for the '-cd' option, which sets the column (not the indentation) for
+ * declarations.
+ */
 
 //indent input
-int aflag; /* Apply to all files. */
+int global_var; /* declaration comment */
+stmt; /* declaration comment, as the code in this line starts at indentation level 0 */
+
+{
+	int local_var	/* unfinished declaration */
+	;		/* finished declaration */
+	stmt;		/* statement */
+}
 //indent end
 
 //indent run -cd49
-int		aflag;				/* Apply to all files. */
+int		global_var;			/* declaration comment */
+stmt;						/* declaration comment, as the
+						 * code in this line starts at
+						 * indentation level 0 */
+
+{
+	int		local_var		/* unfinished declaration */
+// $ XXX: Why is the semicolon indented one column to the left?
+		       ;			/* finished declaration */
+	stmt;			/* statement */
+}
 //indent end
 
 /* If '-cd' is not given, it falls back to '-c'. */
-//indent run-equals-prev-output -c49
+//indent run -c49
+int		global_var;			/* declaration comment */
+stmt;						/* declaration comment, as the
+						 * code in this line starts at
+						 * indentation level 0 */
+
+{
+	int		local_var		/* unfinished declaration */
+// $ XXX: Why is the semicolon indented one column to the left?
+		       ;			/* finished declaration */
+	stmt;					/* statement */
+}
+//indent end

Index: src/tests/usr.bin/indent/opt_bad.c
diff -u src/tests/usr.bin/indent/opt_bad.c:1.10 src/tests/usr.bin/indent/opt_bad.c:1.11
--- src/tests/usr.bin/indent/opt_bad.c:1.10	Sun May 14 16:47:06 2023
+++ src/tests/usr.bin/indent/opt_bad.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_bad.c,v 1.10 2023/05/14 16:47:06 rillig Exp $ */
+/* $NetBSD: opt_bad.c,v 1.11 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the options '-bad' and '-nbad'.
@@ -165,3 +165,24 @@ initializer_with_blank(void)
 //indent end
 
 //indent run-equals-input -ldi0 -nbad
+
+
+//indent input
+{
+	int decl;
+	/* comment */
+	int decl;
+}
+//indent end
+
+//indent run -bad -di0
+{
+	int decl;
+// $ FIXME: This blank line is _between_ the declarations, not _after_ them.
+
+	/* comment */
+	int decl;
+// $ XXX: This blank line is unnecessary, it doesn't occur in practice, though.
+
+}
+//indent end

Index: src/tests/usr.bin/indent/opt_bc.c
diff -u src/tests/usr.bin/indent/opt_bc.c:1.12 src/tests/usr.bin/indent/opt_bc.c:1.13
--- src/tests/usr.bin/indent/opt_bc.c:1.12	Wed Jun 14 20:46:08 2023
+++ src/tests/usr.bin/indent/opt_bc.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_bc.c,v 1.12 2023/06/14 20:46:08 rillig Exp $ */
+/* $NetBSD: opt_bc.c,v 1.13 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the options '-bc' and '-nbc'.
@@ -149,3 +149,57 @@ int a, b, c;
 	const struct paren_level *prev = state.prev_ps.paren.item, *curr = ps.paren.item;
 }
 //indent end
+
+
+/*
+ * In struct or union declarations, the declarators are split onto separate
+ * lines, just like in ordinary declarations.
+ *
+ * In enum declarations and in initializers, no line breaks are added or
+ * removed.
+ */
+//indent input
+struct triple_struct {
+	int a, b, c;
+};
+union triple_union {
+	int a, b, c;
+};
+enum triple_enum {
+	triple_a, triple_b,
+
+	triple_c,
+};
+//indent end
+
+//indent run -bc
+struct triple_struct {
+	int		a,
+			b,
+			c;
+};
+union triple_union {
+	int		a,
+			b,
+			c;
+};
+enum triple_enum {
+	triple_a, triple_b,
+
+	triple_c,
+};
+//indent end
+
+//indent run -nbc
+struct triple_struct {
+	int		a, b, c;
+};
+union triple_union {
+	int		a, b, c;
+};
+enum triple_enum {
+	triple_a, triple_b,
+
+	triple_c,
+};
+//indent end

Index: src/tests/usr.bin/indent/opt_sc.c
diff -u src/tests/usr.bin/indent/opt_sc.c:1.7 src/tests/usr.bin/indent/opt_sc.c:1.8
--- src/tests/usr.bin/indent/opt_sc.c:1.7	Sun Apr 24 09:04:12 2022
+++ src/tests/usr.bin/indent/opt_sc.c	Sat Jun 17 22:09:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_sc.c,v 1.7 2022/04/24 09:04:12 rillig Exp $ */
+/* $NetBSD: opt_sc.c,v 1.8 2023/06/17 22:09:24 rillig Exp $ */
 
 /*
  * Tests for the options '-sc' and '-nsc'.
@@ -35,16 +35,16 @@ comment without asterisks
 */
 //indent end
 
-/* XXX: The additional '*' is debatable. */
 //indent run -sc
 /*
+// $ XXX: The additional '*' is debatable.
  * * This comment style is used by Lua.
  */
 //indent end
 
-/* This comment, as rewritten by indent, is not actually used by Lua. */
 //indent run -nsc
 /*
+// $ This comment, as rewritten by indent, is not actually used by Lua.
  * This comment style is used by Lua.
  */
 //indent end
@@ -62,3 +62,36 @@ comment without asterisks
 //indent run-equals-input -sc
 
 //indent run-equals-input -nsc
+
+
+/*
+ * Ensure that blank lines in comments are preserved. Multiple adjacent blank
+ * lines are preserved as well.
+ */
+//indent input
+/*
+paragraph 1
+
+
+paragraph 2
+*/
+//indent end
+
+//indent run -sc
+/*
+ * paragraph 1
+ *
+ *
+ * paragraph 2
+ */
+//indent end
+
+//indent run -nsc
+/*
+// $ XXX: paragraph 1 is indented, paragraph 2 isn't.
+ paragraph 1
+
+
+paragraph 2
+ */
+//indent end

Reply via email to