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)153ce615ebSrilligtest(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