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 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