1 /* $NetBSD: fmt_decl.c,v 1.60 2023/06/25 19:19:42 rillig Exp $ */
2
3 /*
4 * Tests for declarations of global variables, external functions, and local
5 * variables.
6 *
7 * See also:
8 * opt_di.c
9 */
10
11 /* See FreeBSD r303570 */
12
13 /*
14 * A type definition usually declares a single type, so there is no need to
15 * align the newly declared type name with the other variables.
16 */
17 //indent input
18 typedef void ( * function_ptr ) ( int * ) ;
19 //indent end
20
21 //indent run
22 typedef void (*function_ptr)(int *);
23 //indent end
24
25
26 /*
27 * In variable declarations, the names of the first declarators are indented
28 * by the amount given in '-di', which defaults to 16.
29 */
30 //indent input
31 extern void ( * function_pointer ) ( int * ) ;
32 extern void * pointer;
33 //indent end
34
35 //indent run
36 /* $ XXX: Why is the token 'function_pointer' not aligned with 'pointer'? */
37 extern void (*function_pointer)(int *);
38 extern void *pointer;
39 //indent end
40
41
42 //indent input
43 static const struct
44 {
45 double x;
46 double y, z;
47 } n[m + 1] =
48 {
49 {
50 .0,
51 .9,
52 5
53 }
54 };
55 //indent end
56
57 //indent run
58 static const struct
59 {
60 double x;
61 double y, z;
62 } n[m + 1] =
63 {
64 {
65 .0,
66 .9,
67 5
68 }
69 };
70 //indent end
71
72
73 //indent input
74 typedef struct Complex
75 {
76 double x;
77 double y;
78 } Complex;
79 //indent end
80
81 //indent run
82 typedef struct Complex
83 {
84 double x;
85 double y;
86 } Complex;
87 //indent end
88
89
90 /*
91 * Ensure that function definitions are reasonably indented. Before
92 * 2023-05-11, tokens were repeatedly read, and the line numbers were wrong.
93 */
94 //indent input
95 void
t1(char * a,int b,void (* fn)(void))96 t1 (char *a, int b,
97 void (*fn)(void))
98 {}
99 //indent end
100
101 //indent run
102 void
t1(char * a,int b,void (* fn)(void))103 t1(char *a, int b,
104 void (*fn)(void))
105 {
106 }
107 //indent end
108
109
110 /* See opt_bc.c. */
111 //indent input
t2(char * x,int y)112 void t2 (char *x, int y)
113 {
114 int a,
115 b,
116 c;
117 int
118 *d,
119 *e,
120 *f;
121 int (*g)(),
122 (*h)(),
123 (*i)();
124 int j,
125 k,
126 l;
127 int m
128 ,n
129 ,o
130 ;
131 int chars[ /* push the comma beyond column 74 ...... */ ], x;
132 }
133 //indent end
134
135 //indent run
136 void
t2(char * x,int y)137 t2(char *x, int y)
138 {
139 int a, b, c;
140 int
141 *d, *e, *f;
142 int (*g)(), (*h)(), (*i)();
143 int j, k, l;
144 int m
145 ,n
146 ,o
147 ;
148 int chars[/* push the comma beyond column 74 ...... */],
149 x;
150 }
151 //indent end
152
153
154 //indent input
155 const int int_minimum_size =
156 // $ FIXME: Missing indentation.
157 MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
158 //indent end
159
160 //indent run-equals-input
161
162
163 /*
164 * Ensure that the usual GCC-style function attributes are formatted in a
165 * sensible way.
166 */
167 //indent input
168 void single_param(int) __attribute__((__noreturn__)) ;
169 void function(const char *, ...) __attribute__((format(printf, 1, 2))) ;
170 //indent end
171
172 //indent run -di0
173 void single_param(int) __attribute__((__noreturn__));
174 void function(const char *, ...) __attribute__((format(printf, 1, 2)));
175 //indent end
176
177 //indent run
178 void single_param(int) __attribute__((__noreturn__));
179 void function(const char *, ...) __attribute__((format(printf, 1, 2)));
180 //indent end
181
182
183 //indent input
184 static
185 _attribute_printf(1, 2)
186 void
print_error(const char * fmt,...)187 print_error(const char *fmt,...)
188 {
189 }
190 //indent end
191
192 //indent run
193 static
194 _attribute_printf(1, 2)
195 void
print_error(const char * fmt,...)196 print_error(const char *fmt, ...)
197 {
198 }
199 //indent end
200
201
202 //indent input
203 static _attribute_printf(1, 2)
204 void
print_error(const char * fmt,...)205 print_error(const char *fmt,...)
206 {
207 }
208 //indent end
209
210 //indent run
211 static _attribute_printf(1, 2)
212 void
print_error(const char * fmt,...)213 print_error(const char *fmt, ...)
214 {
215 }
216 //indent end
217
218
219 //indent input
220 static void _attribute_printf(1, 2)
print_error(const char * fmt,...)221 print_error(const char *fmt,...)
222 {
223 }
224 //indent end
225
226 //indent run
227 static void
228 _attribute_printf(1, 2)
print_error(const char * fmt,...)229 print_error(const char *fmt, ...)
230 {
231 }
232 //indent end
233
234
235 /* See FreeBSD r309380 */
236 //indent input
237 static LIST_HEAD(, alq) ald_active;
238 static int ald_shutting_down = 0;
239 struct thread *ald_thread;
240 //indent end
241
242 //indent run
243 static LIST_HEAD(, alq) ald_active;
244 static int ald_shutting_down = 0;
245 struct thread *ald_thread;
246 //indent end
247
248
249 //indent input
250 static int
old_style_definition(a,b,c)251 old_style_definition(a, b, c)
252 struct thread *a;
253 int b;
254 double ***c;
255 {
256
257 }
258 //indent end
259
260 //indent run
261 static int
old_style_definition(a,b,c)262 old_style_definition(a, b, c)
263 struct thread *a;
264 int b;
265 double ***c;
266 {
267
268 }
269 //indent end
270
271
272 /*
273 * Demonstrate how variable declarations are broken into several lines when
274 * the line length limit is set quite low.
275 */
276 //indent input
277 struct s a,b;
278 struct s0 a,b;
279 struct s01 a,b;
280 struct s012 a,b;
281 struct s0123 a,b;
282 struct s01234 a,b;
283 struct s012345 a,b;
284 struct s0123456 a,b;
285 struct s01234567 a,b;
286 struct s012345678 a,b;
287 struct s0123456789 a,b;
288 struct s01234567890 a,b;
289 struct s012345678901 a,b;
290 struct s0123456789012 a,b;
291 struct s01234567890123 a,b;
292 //indent end
293
294 //indent run -l20 -di0
295 struct s a, b;
296 /* $ XXX: See process_comma, varname_len for why this line is broken. */
297 struct s0 a,
298 b;
299 struct s01 a,
300 b;
301 struct s012 a,
302 b;
303 struct s0123 a,
304 b;
305 struct s01234 a,
306 b;
307 struct s012345 a,
308 b;
309 struct s0123456 a,
310 b;
311 struct s01234567 a,
312 b;
313 struct s012345678 a,
314 b;
315 struct s0123456789 a,
316 b;
317 struct s01234567890 a,
318 b;
319 struct s012345678901 a,
320 b;
321 struct s0123456789012 a,
322 b;
323 struct s01234567890123 a,
324 b;
325 //indent end
326
327
328 //indent input
x(void)329 char * x(void)
330 {
331 type identifier;
332 type *pointer;
333 unused * value;
334 (void)unused * value;
335
336 dmax = (double)3 * 10.0;
337 dmin = (double)dmax * 10.0;
338 davg = (double)dmax * dmin;
339
340 return NULL;
341 }
342 //indent end
343
344 //indent run
345 char *
x(void)346 x(void)
347 {
348 type identifier;
349 type *pointer;
350 unused *value;
351 (void)unused * value;
352
353 dmax = (double)3 * 10.0;
354 dmin = (double)dmax * 10.0;
355 davg = (double)dmax * dmin;
356
357 return NULL;
358 }
359 //indent end
360
361
362 //indent input
363 int *
y(void)364 y(void) {
365
366 }
367
368 int
z(void)369 z(void) {
370
371 }
372 //indent end
373
374 //indent run
375 int *
y(void)376 y(void)
377 {
378
379 }
380
381 int
z(void)382 z(void)
383 {
384
385 }
386 //indent end
387
388
389 //indent input
390 int x;
391 int *y;
392 int * * * * z;
393 //indent end
394
395 //indent run
396 int x;
397 int *y;
398 int ****z;
399 //indent end
400
401
402 //indent input
main(void)403 int main(void) {
404 char (*f1)() = NULL;
405 char *(*f1)() = NULL;
406 char *(*f2)();
407 }
408 //indent end
409
410 /*
411 * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
412 * and third variable declaration in column 1. This bug has been introduced
413 * to NetBSD when FreeBSD indent was imported in 2019.
414 */
415 //indent run -ldi0
416 int
main(void)417 main(void)
418 {
419 char (*f1)() = NULL;
420 char *(*f1)() = NULL;
421 char *(*f2)();
422 }
423 //indent end
424
425 //indent run
426 int
main(void)427 main(void)
428 {
429 /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
430 char (*f1)() = NULL;
431 /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
432 char *(* f1)() = NULL;
433 /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
434 char *(* f2)();
435 }
436 //indent end
437
438
439 /*
440 * In some ancient time long before ISO C90, variable declarations with
441 * initializer could be written without '='. The C Programming Language from
442 * 1978 doesn't mention this form anymore.
443 *
444 * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
445 * unary operator.
446 */
447 //indent input
448 int a - 1;
449 {
450 int a - 1;
451 }
452 //indent end
453
454 //indent run -di0
455 int a - 1;
456 {
457 int a - 1;
458 }
459 //indent end
460
461
462 /*
463 * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
464 * of the '*' depended on the function name, which did not make sense. For
465 * function names that matched [A-Za-z]+, the '*' was placed correctly, for
466 * all other function names (containing [$0-9_]) the '*' was right-aligned on
467 * the declaration indentation, which defaults to 16.
468 */
469 //indent input
470 int *
f2(void)471 f2(void)
472 {
473 }
474
475 int *
yy(void)476 yy(void)
477 {
478 }
479
480 int *
int_create(void)481 int_create(void)
482 {
483 }
484 //indent end
485
486 //indent run-equals-input
487
488
489 /*
490 * Since 2019-04-04, the space between the '){' is missing.
491 */
492 //indent input
493 int *
function_name_____20________30________40________50(void)494 function_name_____20________30________40________50
495 (void)
496 {}
497 //indent end
498
499 /*
500 * Before 2023-05-11, indent moved the '{' right after the '(void)', without
501 * any space in between.
502 */
503 //indent run
function_name_____20________30________40________50(void)504 int *function_name_____20________30________40________50
505 (void)
506 {
507 }
508 //indent end
509
510
511 /*
512 * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
513 * names were preserved while others were silently discarded.
514 */
515 //indent input
516 int *
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(void)517 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
518 (void)
519 {}
520 //indent end
521
522 /*
523 * Before 2023-05-11, indent moved the '{' right after the '(void)', without
524 * any space in between.
525 */
526 //indent run
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(void)527 int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
528 (void)
529 {
530 }
531 //indent end
532
533
534 /*
535 * Before 1990, when C90 standardized function prototypes, a function
536 * declaration or definition did not contain a '*' that may have looked
537 * similar to the binary operator '*' because it was surrounded by two
538 * identifiers.
539 *
540 * As of 2021-11-21, indent interpreted the '*' in the function declaration in
541 * line 1 as a binary operator, even though the '*' was followed by a ','
542 * directly. This was not visible in the output though since indent never
543 * outputs a space before a comma.
544 *
545 * In the function declaration in line 2 and the function definition in line
546 * 5, indent interpreted the '*' as a binary operator as well and accordingly
547 * placed spaces around the '*'. On a very low syntactical analysis level,
548 * this may have made sense since the '*' was surrounded by words, but still
549 * the '*' is part of a declaration, where a binary operator does not make
550 * sense.
551 *
552 * Essentially, as of 2021, indent had missed the last 31 years of advances in
553 * the C programming language, in particular the invention of function
554 * prototypes. Instead, the workaround had been to require all type names to
555 * be specified via the options '-ta' and '-T'. This put the burden on the
556 * user instead of the implementer.
557 *
558 * Fixed in lexi.c 1.156 from 2021-11-25.
559 */
560 //indent input
561 void buffer_add(buffer *, char);
562 void buffer_add(buffer *buf, char ch);
563
564 void
buffer_add(buffer * buf,char ch)565 buffer_add(buffer *buf, char ch)
566 {
567 *buf->e++ = ch;
568 }
569 //indent end
570
571 //indent run
572 void buffer_add(buffer *, char);
573 // $ FIXME: There should be no space after the '*'.
574 void buffer_add(buffer * buf, char ch);
575
576 void
buffer_add(buffer * buf,char ch)577 buffer_add(buffer *buf, char ch)
578 {
579 *buf->e++ = ch;
580 }
581 //indent end
582
583
584 /*
585 * Before lexi.c 1.153 from 2021-11-25, indent did not recognize 'Token' as a
586 * type name and then messed up the positioning of the '{'.
587 */
588 //indent input
589 static Token
ToToken(bool cond)590 ToToken(bool cond)
591 {
592 }
593 //indent end
594
595 //indent run-equals-input -TToken
596
597 /* Since lexi.c 1.153 from 2021-11-25. */
598 //indent run-equals-input
599
600
601 /*
602 * Before indent.c 1.309 from 2023-05-23, indent easily got confused by unknown
603 * type names in struct declarations, as a ';' did not finish a declaration.
604 */
605 //indent input
606 typedef struct OpenDirs {
607 CachedDirList list;
608 HashTable /* of CachedDirListNode */ table;
609 } OpenDirs;
610 //indent end
611
612 //indent run-equals-input -THashTable
613
614 //indent run-equals-input
615
616
617 /*
618 * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
619 * type names, even in declarations that are syntactically unambiguous.
620 */
621 //indent input
622 static CachedDir *dot = NULL;
623 //indent end
624
625 //indent run-equals-input -TCachedDir
626
627 //indent run-equals-input
628
629
630 /*
631 * Before lexi.c 1.153 from 2021-11-25, indent easily got confused by unknown
632 * type names in declarations.
633 */
634 //indent input
635 static CachedDir *
CachedDir_New(const char * name)636 CachedDir_New(const char *name)
637 {
638 }
639 //indent end
640
641 //indent run-equals-input
642
643
644 /*
645 * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
646 * type names in declarations and generated 'CachedDir * dir' with an extra
647 * space.
648 */
649 //indent input
650 static CachedDir *
CachedDir_Ref(CachedDir * dir)651 CachedDir_Ref(CachedDir *dir)
652 {
653 }
654 //indent end
655
656 //indent run-equals-input
657
658
659 /*
660 * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
661 * type names in declarations and generated 'HashEntry * he' with an extra
662 * space.
663 *
664 * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
665 * of the line.
666 */
667 //indent input
668 static bool
HashEntry_KeyEquals(const HashEntry * he,Substring key)669 HashEntry_KeyEquals(const HashEntry *he, Substring key)
670 {
671 }
672 //indent end
673
674 //indent run-equals-input
675
676
677 /*
678 * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
679 * are in a declaration, instead it interpreted the first '*' as a binary
680 * operator, therefore generating 'CachedDir * *var' with an extra space.
681 */
682 //indent input
683 static void
CachedDir_Assign(CachedDir ** var,CachedDir * dir)684 CachedDir_Assign(CachedDir **var, CachedDir *dir)
685 {
686 }
687 //indent end
688
689 //indent run-equals-input -TCachedDir
690
691 //indent run-equals-input
692
693
694 /*
695 * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
696 * first one were indented as if they were statement continuations. This was
697 * caused by the token 'Shell' being identified as a word, not as a type name.
698 */
699 //indent input
700 static Shell shells[] = {
701 {
702 first,
703 second,
704 },
705 };
706 //indent end
707
708 //indent run-equals-input
709
710
711 /*
712 * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
713 * attribute macros that followed the function declaration. Its primitive
714 * heuristic between deciding between a function declaration and a function
715 * definition only looked for ')' immediately followed by ',' or ';'. This was
716 * sufficient for well-formatted code before 1990. With the addition of
717 * function prototypes and GCC attributes, the situation became more
718 * complicated, and it took indent 31 years to adapt to this new reality.
719 */
720 //indent input
721 static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
722 static void JobRestartJobs(void);
723 //indent end
724
725 //indent run
726 static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
727 static void JobRestartJobs(void);
728 //indent end
729
730
731 /*
732 * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
733 * tokens ')' and ';' in the function body. It wrongly regarded them as
734 * finishing a function declaration.
735 */
736 //indent input
737 MAKE_INLINE const char *
GNode_VarTarget(GNode * gn)738 GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
739 //indent end
740
741 /*
742 * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
743 * extra space.
744 *
745 * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
746 * name in line 1, together with the '{'.
747 */
748 //indent run
749 MAKE_INLINE const char *
GNode_VarTarget(GNode * gn)750 GNode_VarTarget(GNode *gn)
751 {
752 return GNode_ValueDirect(gn, TARGET);
753 }
754 //indent end
755
756 //indent run-equals-prev-output -TGNode
757
758
759 /*
760 * Ensure that '*' in declarations is interpreted (or at least formatted) as
761 * a 'pointer to' type derivation, not as a binary or unary operator.
762 */
763 //indent input
764 number *var = a * b;
765
766 void
function(void)767 function(void)
768 {
769 number *var = a * b;
770 }
771 //indent end
772
773 //indent run-equals-input -di0
774
775
776 /*
777 * In declarations, most occurrences of '*' are pointer type derivations.
778 * There are a few exceptions though. Some of these are hard to detect
779 * without knowing which identifiers are type names.
780 */
781 //indent input
782 char str[expr * expr];
783 char str[expr**ptr];
784 char str[*ptr**ptr];
785 char str[sizeof(expr * expr)];
786 char str[sizeof(int) * expr];
787 char str[sizeof(*ptr)];
788 char str[sizeof(type**)];
789 char str[sizeof(**ptr)];
790 //indent end
791
792 //indent run -di0
793 char str[expr * expr];
794 char str[expr * *ptr];
795 char str[*ptr * *ptr];
796 char str[sizeof(expr * expr)];
797 char str[sizeof(int) * expr];
798 char str[sizeof(*ptr)];
799 char str[sizeof(type **)];
800 char str[sizeof(**ptr)];
801 //indent end
802
803
804 /*
805 * Since lexi.c 1.158 from 2021-11-25, whether the function 'a' was considered
806 * a declaration or a definition depended on the preceding struct, in
807 * particular the length of the 'pn' line. This didn't make sense at all and
808 * was due to an out-of-bounds memory access.
809 *
810 * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
811 * Fixed in lexi.c 1.165 from 2021-11-27.
812 */
813 //indent input
814 struct {
815 } v = {
816 pn("ta"),
817 };
818
819 static void
a(char * fe)820 a(char *fe)
821 {
822 }
823
824 struct {
825 } v = {
826 pn("t"),
827 };
828
829 static void
a(char * fe)830 a(char *fe)
831 {
832 }
833 //indent end
834
835 //indent run -di0
836 struct {
837 } v = {
838 pn("ta"),
839 };
840
841 static void
a(char * fe)842 a(char *fe)
843 {
844 }
845
846 struct {
847 } v = {
848 pn("t"),
849 };
850
851 static void
a(char * fe)852 a(char *fe)
853 {
854 }
855 //indent end
856
857
858 /*
859 * Before NetBSD indent.c 1.178 from 2021-10-29, indent removed the blank
860 * before the '=', in the second and third of these function pointer
861 * declarations. This was because indent interpreted the prototype parameters
862 * 'int' and 'int, int' as type casts, which doesn't make sense at all. Fixing
863 * this properly requires large style changes since indent is based on simple
864 * heuristics all over. This didn't change in indent.c 1.178; instead, the
865 * rule for inserting a blank before a binary operator was changed to always
866 * insert a blank, except at the beginning of a line.
867 */
868 //indent input
869 char *(*fn)() = NULL;
870 char *(*fn)(int) = NULL;
871 char *(*fn)(int, int) = NULL;
872 //indent end
873
874 /* XXX: The parameter '(int)' is wrongly interpreted as a type cast. */
875 /* XXX: The parameter '(int, int)' is wrongly interpreted as a type cast. */
876 //indent run-equals-input -di0
877
878
879 /*
880 * Depending on whether there was a line break in the function header, the
881 * spaces around the '||' operator were erroneously removed.
882 */
883 //indent input
is_identifier_start(char ch)884 bool is_identifier_start(char ch)
885 {
886 return ch_isalpha(ch) || ch == '_';
887 }
888
889 bool
is_identifier_start(char ch)890 is_identifier_start(char ch)
891 {
892 return ch_isalpha(ch) || ch == '_';
893 }
894 //indent end
895
896 //indent run
897 bool
is_identifier_start(char ch)898 is_identifier_start(char ch)
899 {
900 return ch_isalpha(ch) || ch == '_';
901 }
902
903 bool
is_identifier_start(char ch)904 is_identifier_start(char ch)
905 {
906 return ch_isalpha(ch) || ch == '_';
907 }
908 //indent end
909
910
911 //indent input
912 void buf_add_chars(struct buffer *, const char *, size_t);
913
914 static inline bool
ch_isalnum(char ch)915 ch_isalnum(char ch)
916 {
917 return isalnum((unsigned char)ch) != 0;
918 }
919
920 static inline bool
ch_isalpha(char ch)921 ch_isalpha(char ch)
922 {
923 return isalpha((unsigned char)ch) != 0;
924 }
925 //indent end
926
927 //indent run -i4 -di0
928 // $ FIXME: 'buffer' is classified as 'word'.
929 // $
930 // $ FIXME: 'size_t' is classified as 'word'.
931 void buf_add_chars(struct buffer *, const char *, size_t);
932
933 static inline bool
ch_isalnum(char ch)934 ch_isalnum(char ch)
935 {
936 return isalnum((unsigned char)ch) != 0;
937 }
938
939 static inline bool
ch_isalpha(char ch)940 ch_isalpha(char ch)
941 {
942 return isalpha((unsigned char)ch) != 0;
943 }
944 //indent end
945
946 //indent run-equals-input -i4 -di0
947
948
949 //indent input
950 void __printflike(1, 2)
debug_printf(const char * fmt,...)951 debug_printf(const char *fmt, ...)
952 {
953 }
954 //indent end
955
956 //indent run
957 void
958 // $ FIXME: No line break here.
959 __printflike(1, 2)
debug_printf(const char * fmt,...)960 debug_printf(const char *fmt, ...)
961 {
962 }
963 //indent end
964
965
966 /*
967 * When a name is defined both as a function and as a macro, the name in the
968 * function definition must be enclosed in parentheses, to prevent the macro
969 * from being expanded. It is also possible to undefine the macro, but that is
970 * often not done in practice.
971 */
972 //indent input
973 void
974 (error_at)(int msgid, const pos_t *pos, ...)
975 {
976 }
977 //indent end
978
979 //indent run-equals-input
980
981
982 //indent input
983 struct a {
984 struct b {
985 struct c {
986 struct d1 {
987 int e;
988 } d1;
989 struct d2 {
990 int e;
991 } d2;
992 } c;
993 } b;
994 };
995 //indent end
996
997 //indent run-equals-input -di0
998
999
1000 //indent input
1001 static FILE *ArchFindMember(const char *, const char *,
1002 struct ar_hdr *, const char *);
1003
1004 bool
Job_CheckCommands(GNode * gn,void (* abortProc)(const char *,...))1005 Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1006 {
1007 }
1008
1009 static void MAKE_ATTR_PRINTFLIKE(5, 0)
ParseVErrorInternal(FILE * f,bool useVars,const GNode * gn,ParseErrorLevel level,const char * fmt,va_list ap)1010 ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1011 ParseErrorLevel level, const char *fmt, va_list ap)
1012 {
1013 }
1014
1015 typedef struct {
1016 const char *m_name;
1017 } mod_t;
1018 //indent end
1019
1020 //indent run -fbs -di0 -psl
1021 // $ Must be detected as a function declaration, not a definition.
1022 static FILE *ArchFindMember(const char *, const char *,
1023 struct ar_hdr *, const char *);
1024
1025 bool
Job_CheckCommands(GNode * gn,void (* abortProc)(const char *,...))1026 Job_CheckCommands(GNode *gn, void (*abortProc)(const char *, ...))
1027 {
1028 }
1029
1030 static void
1031 MAKE_ATTR_PRINTFLIKE(5, 0)
ParseVErrorInternal(FILE * f,bool useVars,const GNode * gn,ParseErrorLevel level,const char * fmt,va_list ap)1032 ParseVErrorInternal(FILE *f, bool useVars, const GNode *gn,
1033 ParseErrorLevel level, const char *fmt, va_list ap)
1034 {
1035 }
1036
1037 typedef struct {
1038 const char *m_name;
1039 } mod_t;
1040 //indent end
1041
1042
1043 //indent input
1044 int a[] = {1, 2},
1045 b[] = {1, 2};
1046 {
1047 int a[] = {1, 2},
1048 b[] = {1, 2};
1049 }
1050 //indent end
1051
1052 //indent run -di0
1053 int a[] = {1, 2},
1054 // $ FIXME: Missing indentation.
1055 b[] = {1, 2};
1056 {
1057 int a[] = {1, 2},
1058 // $ FIXME: Missing indentation.
1059 b[] = {1, 2};
1060 }
1061 //indent end
1062
1063
1064 /*
1065 * When a type occurs at the top level, it forces a line break before.
1066 */
1067 //indent input
die(void)1068 __attribute__((__dead__)) void die(void) {}
1069 //indent end
1070
1071 //indent run
1072 __attribute__((__dead__))
1073 void
die(void)1074 die(void)
1075 {
1076 }
1077 //indent end
1078
1079
1080 /*
1081 * In very rare cases, the type of a declarator might include literal tab
1082 * characters. This tab might affect the indentation of the declarator, but
1083 * only if it occurs before the declarator, and that is hard to achieve.
1084 */
1085 //indent input
1086 int arr[sizeof " "];
1087 //indent end
1088
1089 //indent run-equals-input
1090
1091
1092 /*
1093 * The '}' of an initializer is not supposed to end the statement, it only ends
1094 * the brace level of the initializer expression.
1095 */
1096 //indent input
1097 int multi_line[1][1][1] = {
1098 {
1099 {
1100 1
1101 },
1102 },
1103 };
1104 int single_line[2][1][1] = {{{1},},{{2}}};
1105 //indent end
1106
1107 //indent run -di0
1108 int multi_line[1][1][1] = {
1109 {
1110 {
1111 1
1112 },
1113 },
1114 };
1115 int single_line[2][1][1] = {{{1},}, {{2}}};
1116 //indent end
1117
1118
1119 /*
1120 * The '}' of an initializer is not supposed to end the statement, it only ends
1121 * the brace level of the initializer expression.
1122 */
1123 //indent input
1124 {
1125 int multi_line = {
1126 {
1127 {
1128 b
1129 },
1130 },
1131 };
1132 int single_line = {{{b},},{}};
1133 }
1134 //indent end
1135
1136 //indent run -di0
1137 {
1138 int multi_line = {
1139 {
1140 {
1141 b
1142 },
1143 },
1144 };
1145 int single_line = {{{b},}, {}};
1146 }
1147 //indent end
1148
1149
1150 /*
1151 * In initializers, multi-line expressions don't have their second line
1152 * indented, even though they should.
1153 */
1154 //indent input
1155 {
1156 multi_line = (int[]){
1157 {1
1158 +1},
1159 {1
1160 +1},
1161 {1
1162 +1},
1163 };
1164 }
1165 //indent end
1166
1167 //indent run
1168 {
1169 multi_line = (int[]){
1170 {1
1171 + 1},
1172 {1
1173 + 1},
1174 {1
1175 + 1},
1176 };
1177 }
1178 //indent end
1179
1180
1181 /*
1182 *
1183 */
1184 //indent input
1185 int
1186 old_style(a)
1187 struct {
1188 int member;
1189 } a;
1190 {
1191 stmt;
1192 }
1193 //indent end
1194
1195 //indent run-equals-input
1196