lsym_preprocessing.c revision 1.5
11.5Srillig/* $NetBSD: lsym_preprocessing.c,v 1.5 2022/04/24 10:36:37 rillig Exp $ */
21.1Srillig
31.1Srillig/*
41.1Srillig * Tests for the token lsym_preprocessing, which represents a '#' that starts
51.1Srillig * a preprocessing line.
61.1Srillig *
71.5Srillig * #define
81.5Srillig * #ifdef
91.5Srillig * #include
101.5Srillig * #line
111.5Srillig * #pragma
121.5Srillig *
131.1Srillig * The whole preprocessing line is processed separately from the main source
141.1Srillig * code, without much tokenizing or parsing.
151.1Srillig */
161.1Srillig
171.1Srillig// TODO: test '#' in the middle of a non-preprocessing line
181.1Srillig// TODO: test stringify '#'
191.1Srillig// TODO: test token paste '##'
201.1Srillig
211.4Srillig//indent input
221.1Srillig// TODO: add input
231.4Srillig//indent end
241.1Srillig
251.4Srillig//indent run-equals-input
261.2Srillig
271.2Srillig
281.2Srillig/*
291.2Srillig * Whitespace in the following preprocessing directives is preserved.
301.2Srillig */
311.4Srillig//indent input
321.2Srillig#define space ' '		/* the 'define' is followed by a space */
331.2Srillig#define	tab '\t'		/* the 'define' is followed by a tab */
341.2Srillig#if   0				/* 3 spaces */
351.2Srillig#elif		0		/* 2 tabs */
361.2Srillig#elif	0	>	1	/* tabs between the tokens */
371.2Srillig#endif
381.4Srillig//indent end
391.2Srillig
401.4Srillig//indent run-equals-input
411.2Srillig
421.2Srillig// TODO: #define unfinished_string "...
431.2Srillig// TODO: #define unfinished_char '...
441.2Srillig// TODO: # 123 "file.h"
451.2Srillig// TODO: backslash-newline
461.2Srillig// TODO: block comment
471.2Srillig// TODO: line comment
481.5Srillig
491.5Srillig
501.5Srillig//indent input
511.5Srillig#include <system-header.h>
521.5Srillig#include "local-header.h"
531.5Srillig//indent end
541.5Srillig
551.5Srillig//indent run-equals-input
561.5Srillig
571.5Srillig
581.5Srillig/*
591.5Srillig * Nested conditional compilation.
601.5Srillig */
611.5Srillig//indent input
621.5Srillig#if 0
631.5Srillig#else
641.5Srillig#endif
651.5Srillig
661.5Srillig#if 0 /* if comment */
671.5Srillig#else /* else comment */
681.5Srillig#endif /* endif comment */
691.5Srillig
701.5Srillig#if 0 /* outer if comment */
711.5Srillig#  if nested /* inner if comment */
721.5Srillig#  else /* inner else comment */
731.5Srillig#  endif /* inner endif comment */
741.5Srillig#endif /* outer endif comment */
751.5Srillig//indent end
761.5Srillig
771.5Srillig//indent run
781.5Srillig#if 0
791.5Srillig#else
801.5Srillig#endif
811.5Srillig
821.5Srillig#if 0				/* if comment */
831.5Srillig#else				/* else comment */
841.5Srillig#endif				/* endif comment */
851.5Srillig
861.5Srillig#if 0				/* outer if comment */
871.5Srillig/* $ XXX: The indentation is removed, which can get confusing */
881.5Srillig#if nested			/* inner if comment */
891.5Srillig#else				/* inner else comment */
901.5Srillig#endif				/* inner endif comment */
911.5Srillig#endif				/* outer endif comment */
921.5Srillig//indent end
931.5Srillig
941.5Srillig
951.5Srillig//indent input
961.5Srillig#define multi_line_definition /* first line
971.5Srillig * middle
981.5Srillig * final line
991.5Srillig */ actual_value
1001.5Srillig//indent end
1011.5Srillig
1021.5Srillig//indent run-equals-input
1031.5Srillig
1041.5Srillig
1051.5Srillig/*
1061.5Srillig * Before indent.c 1.129 from 2021-10-08, indent mistakenly interpreted quotes
1071.5Srillig * in comments as starting a string literal. The '"' in the comment started a
1081.5Srillig * string, the next '"' finished the string, and the following '/' '*' was
1091.5Srillig * interpreted as the beginning of a comment. This comment lasted until the
1101.5Srillig * next '*' '/', which in this test is another preprocessor directive, solely
1111.5Srillig * for symmetry.
1121.5Srillig *
1131.5Srillig * The effect was that the extra space after d2 was not formatted, as that
1141.5Srillig * line was considered part of the comment.
1151.5Srillig */
1161.5Srillig//indent input
1171.5Srillig#define comment_in_string_literal "/* no comment "
1181.5Srilligint this_is_an_ordinary_line_again;
1191.5Srillig
1201.5Srilligint d1 ;
1211.5Srillig#define confuse_d /*"*/ "/*"
1221.5Srilligint d2 ;
1231.5Srillig#define resolve_d "*/"
1241.5Srilligint d3 ;
1251.5Srillig
1261.5Srilligint s1 ;
1271.5Srillig#define confuse_s /*'*/ '/*'
1281.5Srilligint s2 ;
1291.5Srillig#define resolve_s '*/'
1301.5Srilligint s3 ;
1311.5Srillig//indent end
1321.5Srillig
1331.5Srillig//indent run
1341.5Srillig#define comment_in_string_literal "/* no comment "
1351.5Srilligint		this_is_an_ordinary_line_again;
1361.5Srillig
1371.5Srilligint		d1;
1381.5Srillig#define confuse_d /*"*/ "/*"
1391.5Srilligint		d2;
1401.5Srillig#define resolve_d "*/"
1411.5Srilligint		d3;
1421.5Srillig
1431.5Srilligint		s1;
1441.5Srillig#define confuse_s /*'*/ '/*'
1451.5Srilligint		s2;
1461.5Srillig#define resolve_s '*/'
1471.5Srilligint		s3;
1481.5Srillig//indent end
1491.5Srillig
1501.5Srillig
1511.5Srillig/*
1521.5Srillig * A preprocessing directive inside an expression keeps the state about
1531.5Srillig * whether the next operator is unary or binary.
1541.5Srillig */
1551.5Srillig//indent input
1561.5Srilligint binary_plus = 3
1571.5Srillig#define intermediate 1
1581.5Srillig	+4;
1591.5Srilligint unary_plus =
1601.5Srillig#define intermediate 1
1611.5Srillig	+ 4;
1621.5Srillig//indent end
1631.5Srillig
1641.5Srillig//indent run
1651.5Srilligint		binary_plus = 3
1661.5Srillig#define intermediate 1
1671.5Srillig+ 4;
1681.5Srilligint		unary_plus =
1691.5Srillig#define intermediate 1
1701.5Srillig+4;
1711.5Srillig//indent end
1721.5Srillig
1731.5Srillig
1741.5Srillig/*
1751.5Srillig * Before io.c 1.135 from 2021-11-26, indent fixed malformed preprocessing
1761.5Srillig * lines that had arguments even though they shouldn't. It is not the task of
1771.5Srillig * an indenter to fix code, that's what a linter is for.
1781.5Srillig */
1791.5Srillig//indent input
1801.5Srillig#if 0
1811.5Srillig#elif 1
1821.5Srillig#else if 3
1831.5Srillig#endif 0
1841.5Srillig//indent end
1851.5Srillig
1861.5Srillig//indent run-equals-input
1871.5Srillig
1881.5Srillig
1891.5Srillig/*
1901.5Srillig * Existing comments are indented just like code comments.
1911.5Srillig *
1921.5Srillig * This means that the above wrong preprocessing lines (#else with argument)
1931.5Srillig * need to be fed through indent twice until they become stable. Since
1941.5Srillig * compilers issue warnings about these invalid lines, not much code still has
1951.5Srillig * these, making this automatic fix an edge case.
1961.5Srillig */
1971.5Srillig//indent input
1981.5Srillig#if 0		/* comment */
1991.5Srillig#else		/* comment */
2001.5Srillig#endif		/* comment */
2011.5Srillig
2021.5Srillig#if 0/* comment */
2031.5Srillig#else/* comment */
2041.5Srillig#endif/* comment */
2051.5Srillig//indent end
2061.5Srillig
2071.5Srillig//indent run
2081.5Srillig#if 0				/* comment */
2091.5Srillig#else				/* comment */
2101.5Srillig#endif				/* comment */
2111.5Srillig
2121.5Srillig#if 0				/* comment */
2131.5Srillig#else				/* comment */
2141.5Srillig#endif				/* comment */
2151.5Srillig//indent end
216