lsym_preprocessing.c revision 1.8
11.8Srillig/* $NetBSD: lsym_preprocessing.c,v 1.8 2023/05/11 19:01:35 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.8Srillig#if 0 /* if comment */ 831.8Srillig#else /* else comment */ 841.8Srillig#endif /* endif comment */ 851.5Srillig 861.8Srillig#if 0 /* outer if comment */ 871.5Srillig/* $ XXX: The indentation is removed, which can get confusing */ 881.8Srillig#if nested /* inner if comment */ 891.8Srillig#else /* inner else comment */ 901.8Srillig#endif /* inner endif comment */ 911.8Srillig#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.8Srillig//indent run-equals-input 2081.6Srillig 2091.6Srillig 2101.6Srillig/* 2111.6Srillig * Multi-line comments in preprocessing lines. 2121.6Srillig */ 2131.6Srillig//indent input 2141.6Srillig#define eol_comment // EOL 2151.6Srillig 2161.8Srillig#define no_wrap_comment /* line 1 2171.6Srillig * line 2 2181.6Srillig * line 3 2191.6Srillig */ 2201.6Srillig 2211.6Srillig#define fixed_comment /*- line 1 2221.6Srillig * line 2 2231.6Srillig * line 3 2241.6Srillig */ 2251.7Srillig 2261.7Srillig#define two_comments /* 1 */ /* 2 */ /*3*/ 2271.7Srillig#define three_comments /* first */ /* second */ /*third*/ 2281.6Srillig//indent end 2291.6Srillig 2301.8Srillig//indent run-equals-input 2311.7Srillig 2321.7Srillig 2331.7Srillig/* 2341.7Srillig * Do not touch multi-line macro definitions. 2351.7Srillig */ 2361.7Srillig//indent input 2371.7Srillig#define do_once(stmt) \ 2381.7Srilligdo { \ 2391.7Srillig stmt; \ 2401.7Srillig} while (/* constant condition */ false) 2411.6Srillig//indent end 2421.7Srillig 2431.7Srillig//indent run-equals-input 244