1 /* $NetBSD: lex_char.c,v 1.9 2024/02/02 19:07:58 rillig Exp $ */
2 # 3 "lex_char.c"
3
4 /*
5 * Tests for lexical analysis of character constants.
6 *
7 * C99 6.4.4.4 "Character constants"
8 */
9
10 /* lint1-extra-flags: -X 351 */
11
12 void sink(char);
13
14 void
test(void)15 test(void)
16 {
17 /* expect+1: error: empty character constant [73] */
18 sink('');
19
20 sink('a');
21
22 sink('\0');
23
24 /* UTF-8 */
25 /* expect+2: warning: multi-character character constant [294] */
26 /* expect+1: warning: conversion of 'int' to 'char' is out of range, arg #1 [295] */
27 sink('ä');
28
29 /* GCC extension */
30 sink('\e');
31
32 /* expect+1: warning: dubious escape \y [79] */
33 sink('\y');
34
35 /* since C99 */
36 sink('\x12');
37
38 /* octal */
39 sink('\177');
40
41 /* expect+1: error: empty character constant [73] */
42 sink('');
43
44 /* U+0007 alarm/bell */
45 sink('\a');
46
47 /* U+0008 backspace */
48 sink('\b');
49
50 /* U+0009 horizontal tabulation */
51 sink('\t');
52
53 /* U+000A line feed */
54 sink('\n');
55
56 /* U+000B vertical tabulation */
57 sink('\v');
58
59 /* U+000C form feed */
60 sink('\f');
61
62 /* U+000D carriage return */
63 sink('\r');
64
65 /* A double quote may be escaped or not, since C90. */
66 sink('"');
67 sink('\"');
68
69 /* A question mark may be escaped or not, since C90. */
70 sink('?');
71 sink('\?');
72
73 sink('\\');
74
75 sink('\'');
76 }
77
78 /*
79 * The sequence backslash-newline is handled in an early stage of
80 * translation (C90 5.1.1.2 item 2, C99 5.1.1.2 item 2, C11 5.1.1.2 item 2),
81 * which allows it in character literals as well. This doesn't typically
82 * occur in practice though.
83 */
84 char ch = '\
85 \
86 \
87 \
88 \
89 x';
90