/* $NetBSD: lsym_comma.c,v 1.6 2023/05/13 06:52:48 rillig Exp $ */ /* * Tests for the token lsym_comma, which represents a ',' in these contexts: * * In an expression, the binary operator ',' evaluates its left operand before * its right operand, inserting a sequence point. * * In a declaration, a ',' separates the declarators. * * In a parameter list of a function type, a ',' separates the parameter * declarations. * * In a traditional function definition, a ',' separates the parameter names. * * In a prototype function definition, a ',' separates the parameter * declarations. * * In a function call expression, a ',' separates the arguments. * * In a macro definition, a ',' separates the parameter names. * * In a macro invocation, a ',' separates the arguments. * * In an initializer list, a ',' separates the initializer expressions. */ /* * The ',' is a binary operator with very low precedence. */ //indent input int comma_expression(void) { return 1, 3; return a = b, c = d; } //indent end //indent run-equals-input /* * In a declaration, a ',' separates the declarators. */ //indent input int decl, old_style(), prototype(const char *, double *); int a, b, c; //indent end //indent run-equals-input -di0 /* * In a parameter list of a function type, a ',' separates the parameter * declarations. */ //indent input double dbl_reduce(double init, const double *s, const double *e, double (*merge)(double, double)); double dbl_reduce(double, const double *, const double *, double (*)(double, double)); void debug_printf(const char *, ...); //indent end //indent run-equals-input -di0 /* * In a traditional function definition, a ',' separates the parameter names. */ //indent input double trad_dbl_reduce(init, s, e, merge) double init; double *s, *e; double (*merge)() { double x = init; while (s < e) x = merge(x, *s++); return x; } //indent end //indent run-equals-input -di0 /* * In a prototype function definition, a ',' separates the parameter * declarations. */ //indent input void dbl_reduce(double init, const double *s, const double *e, double (*merge)(double, double)) { double x = init; while (s < e) x = merge(x, *s++); return x; } //indent end //indent run-equals-input -di0 /* * In a function call expression, a ',' separates the arguments. */ //indent input void function(void) { function_call(arg1, arg2); (*indirect_function_call)(arg1, arg2); } //indent end //indent run-equals-input -di0 /* * In a macro definition, a ',' separates the parameter names. */ //indent input #define no_space(a,b) a ## b #define normal_space(a, b) a ## b #define wide_space(a , b) a ## b //indent end /* * Indent does not touch preprocessor directives, except for the spacing * between the '#' and the directive. */ //indent run-equals-input /* * In a macro invocation, a ',' separates the arguments. */ //indent input void function(void) { macro_invocation(arg1, arg2); empty_arguments(,,,); } //indent end //indent run-equals-input -di0 /* * In an initializer list, a ',' separates the initializer expressions. */ //indent input int arr[] = {1, 2, 3}; int arr[] = { 1, 2, 3, /* there may be a trailing comma */ }; //indent end //indent run-equals-input -di0 /* * If a ',' starts a line, indent doesn't put a space before it. This style is * uncommon and looks unbalanced since the '1' is not aligned to the other * numbers. */ //indent input int arr[] = { 1 ,2 ,3 }; //indent end //indent run-equals-input -di0