xref: /netbsd-src/tests/usr.bin/xlint/lint1/lex_char.c (revision 183f84fe872ccaa5d671b1ae9610c95e0e166fae)
1*183f84feSrillig /*	$NetBSD: lex_char.c,v 1.9 2024/02/02 19:07:58 rillig Exp $	*/
23ce615ebSrillig # 3 "lex_char.c"
33ce615ebSrillig 
43ce615ebSrillig /*
53ce615ebSrillig  * Tests for lexical analysis of character constants.
63ce615ebSrillig  *
73ce615ebSrillig  * C99 6.4.4.4 "Character constants"
83ce615ebSrillig  */
93ce615ebSrillig 
10b2baa501Srillig /* lint1-extra-flags: -X 351 */
11b2baa501Srillig 
123ce615ebSrillig void sink(char);
133ce615ebSrillig 
143ce615ebSrillig void
test(void)153ce615ebSrillig test(void)
163ce615ebSrillig {
17c83f7defSrillig 	/* expect+1: error: empty character constant [73] */
183ce615ebSrillig 	sink('');
193ce615ebSrillig 
203ce615ebSrillig 	sink('a');
213ce615ebSrillig 
223ce615ebSrillig 	sink('\0');
233ce615ebSrillig 
243ce615ebSrillig 	/* UTF-8 */
25c83f7defSrillig 	/* expect+2: warning: multi-character character constant [294] */
26c83f7defSrillig 	/* expect+1: warning: conversion of 'int' to 'char' is out of range, arg #1 [295] */
273ce615ebSrillig 	sink('ä');
283ce615ebSrillig 
293ce615ebSrillig 	/* GCC extension */
303ce615ebSrillig 	sink('\e');
313ce615ebSrillig 
326f23d4dfSrillig 	/* expect+1: warning: dubious escape \y [79] */
336f23d4dfSrillig 	sink('\y');
346f23d4dfSrillig 
353ce615ebSrillig 	/* since C99 */
363ce615ebSrillig 	sink('\x12');
373ce615ebSrillig 
383ce615ebSrillig 	/* octal */
393ce615ebSrillig 	sink('\177');
403ce615ebSrillig 
41c83f7defSrillig 	/* expect+1: error: empty character constant [73] */
423ce615ebSrillig 	sink('');
430b52e712Srillig 
440b52e712Srillig 	/* U+0007 alarm/bell */
450b52e712Srillig 	sink('\a');
460b52e712Srillig 
470b52e712Srillig 	/* U+0008 backspace */
480b52e712Srillig 	sink('\b');
490b52e712Srillig 
500b52e712Srillig 	/* U+0009 horizontal tabulation */
510b52e712Srillig 	sink('\t');
520b52e712Srillig 
530b52e712Srillig 	/* U+000A line feed */
540b52e712Srillig 	sink('\n');
550b52e712Srillig 
560b52e712Srillig 	/* U+000B vertical tabulation */
570b52e712Srillig 	sink('\v');
580b52e712Srillig 
590b52e712Srillig 	/* U+000C form feed */
600b52e712Srillig 	sink('\f');
610b52e712Srillig 
620b52e712Srillig 	/* U+000D carriage return */
630b52e712Srillig 	sink('\r');
64*183f84feSrillig 
65*183f84feSrillig 	/* A double quote may be escaped or not, since C90. */
66*183f84feSrillig 	sink('"');
67*183f84feSrillig 	sink('\"');
68*183f84feSrillig 
69*183f84feSrillig 	/* A question mark may be escaped or not, since C90. */
70*183f84feSrillig 	sink('?');
71*183f84feSrillig 	sink('\?');
72*183f84feSrillig 
73*183f84feSrillig 	sink('\\');
74*183f84feSrillig 
75*183f84feSrillig 	sink('\'');
763ce615ebSrillig }
77aed8aa9fSrillig 
78aed8aa9fSrillig /*
7996d2220fSrillig  * The sequence backslash-newline is handled in an early stage of
8096d2220fSrillig  * translation (C90 5.1.1.2 item 2, C99 5.1.1.2 item 2, C11 5.1.1.2 item 2),
8196d2220fSrillig  * which allows it in character literals as well.  This doesn't typically
8296d2220fSrillig  * occur in practice though.
83aed8aa9fSrillig  */
84aed8aa9fSrillig char ch = '\
85aed8aa9fSrillig \
86aed8aa9fSrillig \
87aed8aa9fSrillig \
88aed8aa9fSrillig \
89aed8aa9fSrillig x';
90