Module Name:    src
Committed By:   rillig
Date:           Fri Mar 12 17:41:11 UTC 2021

Modified Files:
        src/tests/usr.bin/indent: token-binary_op.0 token-binary_op.0.pro
            token-binary_op.0.stdout

Log Message:
tests/indent: test tokenization of punctuation, mainly operators


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/indent/token-binary_op.0 \
    src/tests/usr.bin/indent/token-binary_op.0.pro \
    src/tests/usr.bin/indent/token-binary_op.0.stdout

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/token-binary_op.0
diff -u src/tests/usr.bin/indent/token-binary_op.0:1.1 src/tests/usr.bin/indent/token-binary_op.0:1.2
--- src/tests/usr.bin/indent/token-binary_op.0:1.1	Fri Mar 12 00:13:06 2021
+++ src/tests/usr.bin/indent/token-binary_op.0	Fri Mar 12 17:41:10 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: token-binary_op.0,v 1.1 2021/03/12 00:13:06 rillig Exp $ */
+/* $NetBSD: token-binary_op.0,v 1.2 2021/03/12 17:41:10 rillig Exp $ */
 /* $FreeBSD$ */
 
 /*
@@ -9,4 +9,102 @@
  * multiplication, or pointer dereference, or pointer type declaration.
  */
 
-/* TODO: Add some code to be formatted. */
+/* See C99 6.4.6 */
+void
+punctuators(void)
+{
+	int brackets = array[subscript];
+	int parentheses = function(argument);
+	int braces = { initializer };
+	int period = structure.member;
+	int arrow = structure->member;
+
+	++prefix_increment;
+	postfix_increment++;
+	--prefix_decrement;
+	postfix_decrement--;
+	int *address = &lvalue;
+	int bitwise_and = value & mask;
+	int product = factor * factor;
+	int dereferenced = *address;
+	int positive = +number;
+	int sum = number + number;
+	int negative = -number;
+	int difference = number - number;
+	bool negated = !condition;
+
+	int quotient = number / number;
+	int modulo = number % number;
+	int shifted_left = number << number;
+	int shifted_right = number >> number;
+	bool less_than = number < number;
+	bool greater_than = number > number;
+	bool less_equal = number <= number;
+	bool greater_equal = number >= number;
+	bool equal = number == number;
+	bool unequal = number != number;
+	int bitwise_exclusive_or = number ^ number;
+	int bitwise_or = number | number;
+	bool logical_and = condition && condition;
+	bool logical_or = condition || condition;
+
+	int conditional = condition ? number : number;
+
+	/* combined assignment operators */
+	number = (expression);
+	number *= number;
+	number /= number;
+	number %= number;
+	number += number;
+	number -= number;
+	number <<= number;
+	number >>= number;
+	number &= number;
+	number ^= number;
+	number |= number;
+
+	number = function(argument1, argument2);
+	number = function(argument), number;
+
+	/* digraphs */
+	number = array<:subscript:>;
+	number = (int)<% initializer %>;
+}
+
+void
+peculiarities(void)
+{
+	/*
+	 * When indent tokenizes some of the operators, it allows for
+	 * arbitrary repetitions of the operator character, followed by an
+	 * arbitrary amount of '='.  This is used for operators like '&&' or
+	 * '|||==='.
+	 *
+	 * Before 2021-03-07 22:11:01, the comment '//' was treated as an
+	 * operator as well, and so was the comment '/////', leading to
+	 * unexpected results; see comment-line-end.0 for more details.
+	 *
+	 * See lexi.c, lexi, "default:".
+	 */
+	if (a &&&&&&& b)
+		return;
+	if (a |||=== b)
+		return;
+
+	/*-
+	 * For '+' and '-', this does not work since the lexer has to
+	 * distinguish between '++' and '+' early.  The following sequence is
+	 * thus tokenized as:
+	 *
+	 *	ident		'a'
+	 *	postfix		'++'
+	 *	binary_op	'++'
+	 *	unary_op	'++'
+	 *	unary_op	'+'
+	 *	ident		'b'
+	 *
+	 * See lexi.c, lexi, "case '+':".
+	 */
+	if (a +++++++ b)
+		return;
+}
Index: src/tests/usr.bin/indent/token-binary_op.0.pro
diff -u src/tests/usr.bin/indent/token-binary_op.0.pro:1.1 src/tests/usr.bin/indent/token-binary_op.0.pro:1.2
--- src/tests/usr.bin/indent/token-binary_op.0.pro:1.1	Fri Mar 12 00:13:06 2021
+++ src/tests/usr.bin/indent/token-binary_op.0.pro	Fri Mar 12 17:41:10 2021
@@ -1,8 +1,4 @@
-/* $NetBSD: token-binary_op.0.pro,v 1.1 2021/03/12 00:13:06 rillig Exp $ */
+/* $NetBSD: token-binary_op.0.pro,v 1.2 2021/03/12 17:41:10 rillig Exp $ */
 /* $FreeBSD$ */
 
-/*
- * TODO: Explain the command line options of the test.
- */
-
-/* TODO: Add some command line options */
+-ldi0		/* do not align local variables in declarations */
Index: src/tests/usr.bin/indent/token-binary_op.0.stdout
diff -u src/tests/usr.bin/indent/token-binary_op.0.stdout:1.1 src/tests/usr.bin/indent/token-binary_op.0.stdout:1.2
--- src/tests/usr.bin/indent/token-binary_op.0.stdout:1.1	Fri Mar 12 00:13:06 2021
+++ src/tests/usr.bin/indent/token-binary_op.0.stdout	Fri Mar 12 17:41:10 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: token-binary_op.0.stdout,v 1.1 2021/03/12 00:13:06 rillig Exp $ */
+/* $NetBSD: token-binary_op.0.stdout,v 1.2 2021/03/12 17:41:10 rillig Exp $ */
 /* $FreeBSD$ */
 
 /*
@@ -9,4 +9,105 @@
  * multiplication, or pointer dereference, or pointer type declaration.
  */
 
-/* TODO: Add some code to be formatted. */
+/* See C99 6.4.6 */
+void
+punctuators(void)
+{
+	int brackets = array[subscript];
+	int parentheses = function(argument);
+/* $ XXX: The spaces around the initializer are gone. */
+	int braces = {initializer};
+	int period = structure.member;
+	int arrow = structure->member;
+
+	++prefix_increment;
+	postfix_increment++;
+	--prefix_decrement;
+	postfix_decrement--;
+	int *address = &lvalue;
+	int bitwise_and = value & mask;
+	int product = factor * factor;
+	int dereferenced = *address;
+	int positive = +number;
+	int sum = number + number;
+	int negative = -number;
+	int difference = number - number;
+	bool negated = !condition;
+
+	int quotient = number / number;
+	int modulo = number % number;
+	int shifted_left = number << number;
+	int shifted_right = number >> number;
+	bool less_than = number < number;
+	bool greater_than = number > number;
+	bool less_equal = number <= number;
+	bool greater_equal = number >= number;
+	bool equal = number == number;
+	bool unequal = number != number;
+	int bitwise_exclusive_or = number ^ number;
+	int bitwise_or = number | number;
+	bool logical_and = condition && condition;
+	bool logical_or = condition || condition;
+
+	int conditional = condition ? number : number;
+
+	/* combined assignment operators */
+	number = (expression);
+	number *= number;
+	number /= number;
+	number %= number;
+	number += number;
+	number -= number;
+	number <<= number;
+	number >>= number;
+	number &= number;
+	number ^= number;
+	number |= number;
+
+	number = function(argument1, argument2);
+	number = function(argument), number;
+
+	/* digraphs */
+/* $ XXX: indent is confused by the digraphs for '[' and ']'. */
+/* $ This probably doesn't matter since digraphs are not used in practice. */
+number = array <:subscript:>;
+	number = (int)<%initializer % >;
+}
+
+void
+peculiarities(void)
+{
+	/*
+	 * When indent tokenizes some of the operators, it allows for
+	 * arbitrary repetitions of the operator character, followed by an
+	 * arbitrary amount of '='.  This is used for operators like '&&' or
+	 * '|||==='.
+	 *
+	 * Before 2021-03-07 22:11:01, the comment '//' was treated as an
+	 * operator as well, and so was the comment '/////', leading to
+	 * unexpected results; see comment-line-end.0 for more details.
+	 *
+	 * See lexi.c, lexi, "default:".
+	 */
+	if (a &&&&&&& b)
+		return;
+	if (a |||=== b)
+		return;
+
+	/*-
+	 * For '+' and '-', this does not work since the lexer has to
+	 * distinguish between '++' and '+' early.  The following sequence is
+	 * thus tokenized as:
+	 *
+	 *	ident		'a'
+	 *	postfix		'++'
+	 *	binary_op	'++'
+	 *	unary_op	'++'
+	 *	unary_op	'+'
+	 *	ident		'b'
+	 *
+	 * See lexi.c, lexi, "case '+':".
+	 */
+	if (a++ ++ +++b)
+		return;
+}

Reply via email to