/*      $NetBSD: lex_char.c,v 1.9 2024/02/02 19:07:58 rillig Exp $      */
# 3 "lex_char.c"

/*
* Tests for lexical analysis of character constants.
*
* C99 6.4.4.4 "Character constants"
*/

/* lint1-extra-flags: -X 351 */

void sink(char);

void
test(void)
{
       /* expect+1: error: empty character constant [73] */
       sink('');

       sink('a');

       sink('\0');

       /* UTF-8 */
       /* expect+2: warning: multi-character character constant [294] */
       /* expect+1: warning: conversion of 'int' to 'char' is out of range, arg #1 [295] */
       sink('รค');

       /* GCC extension */
       sink('\e');

       /* expect+1: warning: dubious escape \y [79] */
       sink('\y');

       /* since C99 */
       sink('\x12');

       /* octal */
       sink('\177');

       /* expect+1: error: empty character constant [73] */
       sink('');

       /* U+0007 alarm/bell */
       sink('\a');

       /* U+0008 backspace */
       sink('\b');

       /* U+0009 horizontal tabulation */
       sink('\t');

       /* U+000A line feed */
       sink('\n');

       /* U+000B vertical tabulation */
       sink('\v');

       /* U+000C form feed */
       sink('\f');

       /* U+000D carriage return */
       sink('\r');

       /* A double quote may be escaped or not, since C90. */
       sink('"');
       sink('\"');

       /* A question mark may be escaped or not, since C90. */
       sink('?');
       sink('\?');

       sink('\\');

       sink('\'');
}

/*
* The sequence backslash-newline is handled in an early stage of
* translation (C90 5.1.1.2 item 2, C99 5.1.1.2 item 2, C11 5.1.1.2 item 2),
* which allows it in character literals as well.  This doesn't typically
* occur in practice though.
*/
char ch = '\
\
\
\
\
x';