fmt_decl.c revision 1.31 1 /* $NetBSD: fmt_decl.c,v 1.31 2021/11/27 19:21:42 rillig Exp $ */
2 /* $FreeBSD: head/usr.bin/indent/tests/declarations.0 334478 2018-06-01 09:41:15Z pstef $ */
3
4 /*
5 * Tests for declarations of global variables, external functions, and local
6 * variables.
7 *
8 * See also:
9 * opt_di.c
10 */
11
12 /* See FreeBSD r303570 */
13
14 /*
15 * A type definition usually declares a single type, so there is no need to
16 * align the newly declared type name with the other variables.
17 */
18 #indent input
19 typedef void ( * function_ptr ) ( int * ) ;
20 #indent end
21
22 #indent run
23 typedef void (*function_ptr)(int *);
24 #indent end
25
26
27 /*
28 * In variable declarations, the names of the first declarators are indented
29 * by the amount given in '-di', which defaults to 16.
30 */
31 #indent input
32 extern void ( * function_pointer ) ( int * ) ;
33 extern void * pointer;
34 #indent end
35
36 #indent run
37 /* $ XXX: Why is the token 'function_pointer' not aligned with 'pointer'? */
38 extern void (*function_pointer)(int *);
39 extern void *pointer;
40 #indent end
41
42
43 #indent input
44 static const struct
45 {
46 double x;
47 double y, z;
48 } n[m + 1] =
49 {
50 {
51 .0,
52 .9,
53 5
54 }
55 };
56 #indent end
57
58 #indent run
59 static const struct {
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 double x;
84 double y;
85 } Complex;
86 #indent end
87
88
89 /*
90 * As of 2021-11-07, indent parses the following function definition as these
91 * tokens:
92 *
93 * line 1: type_outside_parentheses "void"
94 * line 1: newline "\n"
95 * line 2: funcname "t1"
96 * line 2: newline "\n" repeated, see search_stmt
97 * line 3: funcname "t1" XXX: wrong line_no
98 * line 3: lparen_or_lbracket "("
99 * line 3: type_in_parentheses "char"
100 * line 3: unary_op "*"
101 * line 3: word "a"
102 * line 3: comma ","
103 * line 3: type_in_parentheses "int"
104 * line 3: word "b"
105 * line 3: comma ","
106 * line 3: newline "\n"
107 * line 4: type_in_parentheses "void"
108 * line 4: lparen_or_lbracket "("
109 * line 4: unary_op "*"
110 * line 4: word "fn"
111 * line 4: rparen_or_rbracket ")"
112 * line 4: lparen_or_lbracket "("
113 * line 4: type_in_parentheses "void"
114 * line 4: rparen_or_rbracket ")"
115 * line 4: rparen_or_rbracket ")"
116 * line 4: newline "\n"
117 * line 5: lbrace "{"
118 * line 5: lbrace "{" repeated, see search_stmt
119 * line 5: newline "\n" FIXME: there is no newline in the source
120 * line 6: rbrace "}"
121 * line 6: eof "\n"
122 */
123 #indent input
124 void
125 t1 (char *a, int b,
126 void (*fn)(void))
127 {}
128 #indent end
129
130 #indent run
131 void
132 t1(char *a, int b,
133 void (*fn)(void))
134 {
135 }
136 #indent end
137
138
139 /* See opt_bc.c. */
140 #indent input
141 void t2 (char *x, int y)
142 {
143 int a,
144 b,
145 c;
146 int
147 *d,
148 *e,
149 *f;
150 int (*g)(),
151 (*h)(),
152 (*i)();
153 int j,
154 k,
155 l;
156 int m
157 ,n
158 ,o
159 ;
160 int chars[ /* push the comma beyond column 74 .... */ ], x;
161 }
162 #indent end
163
164 #indent run
165 void
166 t2(char *x, int y)
167 {
168 int a, b, c;
169 int
170 *d, *e, *f;
171 int (*g)(), (*h)(), (*i)();
172 int j, k, l;
173 int m
174 ,n
175 ,o
176 ;
177 int chars[ /* push the comma beyond column 74 .... */ ],
178 x;
179 }
180 #indent end
181
182
183 #indent input
184 const int int_minimum_size =
185 MAXALIGN(offsetof(int, test)) + MAXIMUM_ALIGNOF;
186 #indent end
187
188 #indent run-equals-input
189
190
191 /*
192 * Ensure that the usual GCC-style function attributes are formatted in a
193 * sensible way.
194 */
195 #indent input
196 void function(const char *, ...) __attribute__((format(printf, 1, 2)));
197 #indent end
198
199 /* FIXME: missing space before '__attribute__' */
200 #indent run -di0
201 void function(const char *, ...)__attribute__((format(printf, 1, 2)));
202 #indent end
203
204 /* FIXME: missing space before '__attribute__' */
205 #indent run
206 void function(const char *, ...)__attribute__((format(printf, 1, 2)));
207 #indent end
208
209
210 #indent input
211 static
212 _attribute_printf(1, 2)
213 void
214 print_error(const char *fmt,...)
215 {
216 }
217 #indent end
218
219 #indent run
220 static
221 _attribute_printf(1, 2)
222 void
223 print_error(const char *fmt, ...)
224 {
225 }
226 #indent end
227
228
229 #indent input
230 static _attribute_printf(1, 2)
231 void
232 print_error(const char *fmt,...)
233 {
234 }
235 #indent end
236
237 #indent run
238 static _attribute_printf(1, 2)
239 void
240 print_error(const char *fmt, ...)
241 {
242 }
243 #indent end
244
245
246 #indent input
247 static void _attribute_printf(1, 2)
248 print_error(const char *fmt,...)
249 {
250 }
251 #indent end
252
253 #indent run
254 static void
255 _attribute_printf(1, 2)
256 print_error(const char *fmt, ...)
257 {
258 }
259 #indent end
260
261
262 /* See FreeBSD r309380 */
263 #indent input
264 static LIST_HEAD(, alq) ald_active;
265 static int ald_shutting_down = 0;
266 struct thread *ald_thread;
267 #indent end
268
269 #indent run
270 static LIST_HEAD(, alq) ald_active;
271 static int ald_shutting_down = 0;
272 struct thread *ald_thread;
273 #indent end
274
275
276 #indent input
277 static int
278 old_style_definition(a, b, c)
279 struct thread *a;
280 int b;
281 double ***c;
282 {
283
284 }
285 #indent end
286
287 #indent run
288 static int
289 old_style_definition(a, b, c)
290 struct thread *a;
291 int b;
292 double ***c;
293 {
294
295 }
296 #indent end
297
298
299 /*
300 * Demonstrate how variable declarations are broken into several lines when
301 * the line length limit is set quite low.
302 */
303 #indent input
304 struct s a,b;
305 struct s0 a,b;
306 struct s01 a,b;
307 struct s012 a,b;
308 struct s0123 a,b;
309 struct s01234 a,b;
310 struct s012345 a,b;
311 struct s0123456 a,b;
312 struct s01234567 a,b;
313 struct s012345678 a,b;
314 struct s0123456789 a,b;
315 struct s01234567890 a,b;
316 struct s012345678901 a,b;
317 struct s0123456789012 a,b;
318 struct s01234567890123 a,b;
319 #indent end
320
321 #indent run -l20 -di0
322 struct s a, b;
323 /* $ XXX: See process_comma, varname_len for why this line is broken. */
324 struct s0 a,
325 b;
326 /* $ XXX: The indentation of the second line is wrong. The variable names */
327 /* $ XXX: 'a' and 'b' should be in the same column; the word 'struct' is */
328 /* $ XXX: missing in the calculation for the indentation. */
329 struct s01 a,
330 b;
331 struct s012 a,
332 b;
333 struct s0123 a,
334 b;
335 struct s01234 a,
336 b;
337 struct s012345 a,
338 b;
339 struct s0123456 a,
340 b;
341 struct s01234567 a,
342 b;
343 struct s012345678 a,
344 b;
345 struct s0123456789 a,
346 b;
347 struct s01234567890 a,
348 b;
349 struct s012345678901 a,
350 b;
351 struct s0123456789012 a,
352 b;
353 struct s01234567890123 a,
354 b;
355 #indent end
356
357
358 #indent input
359 char * x(void)
360 {
361 type identifier;
362 type *pointer;
363 unused * value;
364 (void)unused * value;
365
366 dmax = (double)3 * 10.0;
367 dmin = (double)dmax * 10.0;
368 davg = (double)dmax * dmin;
369
370 return NULL;
371 }
372 #indent end
373
374 #indent run
375 char *
376 x(void)
377 {
378 type identifier;
379 type *pointer;
380 unused *value;
381 (void)unused * value;
382
383 dmax = (double)3 * 10.0;
384 dmin = (double)dmax * 10.0;
385 davg = (double)dmax * dmin;
386
387 return NULL;
388 }
389 #indent end
390
391
392 #indent input
393 int *
394 y(void) {
395
396 }
397
398 int
399 z(void) {
400
401 }
402 #indent end
403
404 #indent run
405 int *
406 y(void)
407 {
408
409 }
410
411 int
412 z(void)
413 {
414
415 }
416 #indent end
417
418
419 #indent input
420 int x;
421 int *y;
422 int * * * * z;
423 #indent end
424
425 #indent run
426 int x;
427 int *y;
428 int ****z;
429 #indent end
430
431
432 #indent input
433 int main(void) {
434 char (*f1)() = NULL;
435 char *(*f1)() = NULL;
436 char *(*f2)();
437 }
438 #indent end
439
440 /*
441 * Before NetBSD io.c 1.103 from 2021-10-27, indent wrongly placed the second
442 * and third variable declaration in column 1. This bug has been introduced
443 * to NetBSD when FreeBSD indent was imported in 2019.
444 */
445 #indent run -ldi0
446 int
447 main(void)
448 {
449 char (*f1)() = NULL;
450 char *(*f1)() = NULL;
451 char *(*f2)();
452 }
453 #indent end
454
455 #indent run
456 int
457 main(void)
458 {
459 /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
460 char (*f1)() = NULL;
461 /* $ XXX: Not really pretty, the name 'f1' should be aligned, if at all. */
462 char *(* f1)() = NULL;
463 /* $ XXX: Not really pretty, the name 'f2' should be aligned, if at all. */
464 char *(* f2)();
465 }
466 #indent end
467
468
469 /*
470 * In some ancient time long before ISO C90, variable declarations with
471 * initializer could be written without '='. The C Programming Language from
472 * 1978 doesn't mention this form anymore.
473 *
474 * Before NetBSD lexi.c 1.123 from 2021-10-31, indent treated the '-' as a
475 * unary operator.
476 */
477 #indent input
478 int a - 1;
479 {
480 int a - 1;
481 }
482 #indent end
483
484 #indent run -di0
485 int a - 1;
486 {
487 int a - 1;
488 }
489 #indent end
490
491
492 /*
493 * Between 2019-04-04 and before lexi.c 1.146 from 2021-11-19, the indentation
494 * of the '*' depended on the function name, which did not make sense. For
495 * function names that matched [A-Za-z]+, the '*' was placed correctly, for
496 * all other function names (containing [$0-9_]) the '*' was right-aligned on
497 * the declaration indentation, which defaults to 16.
498 */
499 #indent input
500 int *
501 f2(void)
502 {
503 }
504
505 int *
506 yy(void)
507 {
508 }
509
510 int *
511 int_create(void)
512 {
513 }
514 #indent end
515
516 #indent run-equals-input
517
518
519 /*
520 * Since 2019-04-04, the space between the '){' is missing.
521 */
522 #indent input
523 int *
524 function_name_____20________30________40________50
525 (void)
526 {}
527 #indent end
528
529 /* FIXME: The space between '){' is missing. */
530 #indent run
531 int *function_name_____20________30________40________50
532 (void){
533 }
534 #indent end
535
536
537 /*
538 * Since 2019-04-04 and before lexi.c 1.144 from 2021-11-19, some function
539 * names were preserved while others were silently discarded.
540 */
541 #indent input
542 int *
543 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
544 (void)
545 {}
546 #indent end
547
548 #indent run
549 int *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
550 (void){
551 }
552 #indent end
553
554
555 /*
556 * Before 1990, when C90 standardized function prototypes, a function
557 * declaration or definition did not contain a '*' that may have looked
558 * similar to the binary operator '*' because it was surrounded by two
559 * identifiers.
560 *
561 * As of 2021-11-21, indent interpreted the '*' in the function declaration in
562 * line 1 as a binary operator, even though the '*' was followed by a ','
563 * directly. This was not visible in the output though since indent never
564 * outputs a space before a comma.
565 *
566 * In the function declaration in line 2 and the function definition in line
567 * 5, indent interpreted the '*' as a binary operator as well and accordingly
568 * placed spaces around the '*'. On a very low syntactical analysis level,
569 * this may have made sense since the '*' was surrounded by words, but still
570 * the '*' is part of a declaration, where a binary operator does not make
571 * sense.
572 *
573 * Essentially, as of 2021, indent had missed the last 31 years of advances in
574 * the C programming language, in particular the invention of function
575 * prototypes. Instead, the workaround had been to require all type names to
576 * be specified via the options '-ta' and '-T'. This put the burden on the
577 * user instead of the implementer.
578 *
579 * Fixed in lexi.c 1.156 from 2021-11-25.
580 */
581 #indent input
582 void buffer_add(buffer *, char);
583 void buffer_add(buffer *buf, char ch);
584
585 void
586 buffer_add(buffer *buf, char ch)
587 {
588 *buf->e++ = ch;
589 }
590 #indent end
591
592 /* Before lexi.c 1.156 from 2021-11-25, indent generated 'buffer * buf'. */
593 #indent run
594 void buffer_add(buffer *, char);
595 /* $ FIXME: space after '*' */
596 void buffer_add(buffer * buf, char ch);
597
598 void
599 buffer_add(buffer *buf, char ch)
600 {
601 *buf->e++ = ch;
602 }
603 #indent end
604
605
606 /*
607 * Indent gets easily confused by type names it does not know about.
608 */
609 #indent input
610 static Token
611 ToToken(bool cond)
612 {
613 }
614 #indent end
615
616 #indent run-equals-input -TToken
617 /* Since lexi.c 1.153 from 2021-11-25. */
618 #indent run-equals-input
619
620
621 /*
622 * Indent gets easily confused by unknown type names in struct declarations.
623 */
624 #indent input
625 typedef struct OpenDirs {
626 CachedDirList list;
627 HashTable /* of CachedDirListNode */ table;
628 } OpenDirs;
629 #indent end
630
631 /* FIXME: The word 'HashTable' must not be aligned like a member name. */
632 #indent run
633 typedef struct OpenDirs {
634 CachedDirList list;
635 HashTable /* of CachedDirListNode */ table;
636 } OpenDirs;
637 #indent end
638
639 #indent run-equals-input -THashTable
640
641
642 /*
643 * Indent gets easily confused by unknown type names, even in declarations
644 * that are syntactically unambiguous.
645 */
646 #indent input
647 static CachedDir *dot = NULL;
648 #indent end
649
650 #indent run-equals-input -TCachedDir
651 /* Since lexi.c 1.153 from 2021-11-25. */
652 #indent run-equals-input
653
654
655 /*
656 * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
657 * type names in declarations and generated 'HashEntry * he' with an extra
658 * space.
659 */
660 #indent input
661 static CachedDir *
662 CachedDir_New(const char *name)
663 {
664 }
665 #indent end
666
667 /* Since lexi.c 1.153 from 2021-11-25. */
668 #indent run-equals-input
669
670
671 /*
672 * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
673 * type names in declarations and generated 'CachedDir * dir' with an extra
674 * space.
675 */
676 #indent input
677 static CachedDir *
678 CachedDir_Ref(CachedDir *dir)
679 {
680 }
681 #indent end
682
683 #indent run-equals-input
684
685
686 /*
687 * Before lexi.c 1.156 from 2021-11-25, indent easily got confused by unknown
688 * type names in declarations and generated 'HashEntry * he' with an extra
689 * space.
690 *
691 * Before lexi.c 1.153 from 2021-11-25, indent also placed the '{' at the end
692 * of the line.
693 */
694 #indent input
695 static bool
696 HashEntry_KeyEquals(const HashEntry *he, Substring key)
697 {
698 }
699 #indent end
700
701 #indent run-equals-input
702
703
704 /*
705 * Before lexi.c 1.156 from 2021-11-25, indent didn't notice that the two '*'
706 * are in a declaration, instead it interpreted the first '*' as a binary
707 * operator, therefore generating 'CachedDir * *var' with an extra space.
708 */
709 #indent input
710 static void
711 CachedDir_Assign(CachedDir **var, CachedDir *dir)
712 {
713 }
714 #indent end
715
716 #indent run-equals-input
717 #indent run-equals-input -TCachedDir
718
719
720 /*
721 * Before lexi.c 1.153 from 2021-11-25, all initializer expressions after the
722 * first one were indented as if they would be statement continuations. This
723 * was because the token 'Shell' was identified as a word, not as a type name.
724 */
725 #indent input
726 static Shell shells[] = {
727 {
728 first,
729 second,
730 },
731 };
732 #indent end
733
734 /* Since lexi.c 1.153 from 2021-11-25. */
735 #indent run-equals-input
736
737
738 /*
739 * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by function
740 * attribute macros that followed the function declaration. Its primitive
741 * heuristic between deciding between a function declaration and a function
742 * definition only looked for ')' immediately followed by ',' or ';'. This was
743 * sufficient for well-formatted code before 1990. With the addition of
744 * function prototypes and GCC attributes, the situation became more
745 * complicated, and it took indent 31 years to adapt to this new reality.
746 */
747 #indent input
748 static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
749 static void JobRestartJobs(void);
750 #indent end
751
752 #indent run
753 /* $ FIXME: Missing space before 'MAKE_ATTR_DEAD'. */
754 static void JobInterrupt(bool, int)MAKE_ATTR_DEAD;
755 static void JobRestartJobs(void);
756 #indent end
757
758
759 /*
760 * Before lexi.c 1.158 from 2021-11-25, indent easily got confused by the
761 * tokens ')' and ';' in the function body. It wrongly regarded them as
762 * finishing a function declaration.
763 */
764 #indent input
765 MAKE_INLINE const char *
766 GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
767 #indent end
768
769 /*
770 * Before lexi.c 1.156 from 2021-11-25, indent generated 'GNode * gn' with an
771 * extra space.
772 *
773 * Before lexi.c 1.158 from 2021-11-25, indent wrongly placed the function
774 * name in line 1, together with the '{'.
775 */
776 #indent run
777 MAKE_INLINE const char *
778 GNode_VarTarget(GNode *gn)
779 {
780 return GNode_ValueDirect(gn, TARGET);
781 }
782 #indent end
783
784 #indent run-equals-prev-output -TGNode
785
786
787 /*
788 * Ensure that '*' in declarations is interpreted (or at least formatted) as
789 * a 'pointer to' type derivation, not as a binary or unary operator.
790 */
791 #indent input
792 number *var = a * b;
793
794 void
795 function(void)
796 {
797 number *var = a * b;
798 }
799 #indent end
800
801 #indent run-equals-input -di0
802
803
804 /*
805 * In declarations, most occurrences of '*' are pointer type derivations.
806 * There are a few exceptions though. Some of these are hard to detect
807 * without knowing which identifiers are type names.
808 */
809 #indent input
810 char str[expr * expr];
811 char str[expr**ptr];
812 char str[*ptr**ptr];
813 char str[sizeof(expr * expr)];
814 char str[sizeof(int) * expr];
815 char str[sizeof(*ptr)];
816 char str[sizeof(type**)];
817 char str[sizeof(**ptr)];
818 #indent end
819
820 #indent run -di0
821 char str[expr * expr];
822 char str[expr * *ptr];
823 char str[*ptr * *ptr];
824 char str[sizeof(expr * expr)];
825 char str[sizeof(int) * expr];
826 char str[sizeof(*ptr)];
827 /* $ FIXME: should be 'type **' */
828 char str[sizeof(type * *)];
829 char str[sizeof(**ptr)];
830 #indent end
831
832
833 /*
834 * FIXME: Whether or not the function 'a' is a declaration or a definition
835 * depends on the preceding struct, in particular the length of the 'pn'
836 * line. This doesn't make sense at all and looks like an out-of-bounds memory
837 * access.
838 *
839 * Since lexi.c 1.158 from 2021-11-25.
840 * Seen amongst others in args.c 1.72, function add_typedefs_from_file.
841 */
842 #indent input
843 struct {
844 } v = {
845 pn("ta"),
846 };
847
848 static void
849 a(char *fe)
850 {
851 }
852
853 struct {
854 } v = {
855 pn("t"),
856 };
857
858 static void
859 a(char *fe)
860 {
861 }
862 #indent end
863
864 #indent run -di0
865 struct {
866 } v = {
867 pn("ta"),
868 };
869
870 static void
871 a(char *fe){
872 }
873
874 struct {
875 } v = {
876 pn("t"),
877 };
878
879 static void
880 a(char *fe)
881 {
882 }
883 #indent end
884