/* Copyright (C) 2000 Free Software Foundation, Inc. */ /* { dg-do run } */ /* { dg-options "-trigraphs" } */ /* Test lexing of strings and character constants. */ #ifndef __WCHAR_TYPE__ #define __WCHAR_TYPE__ int #endif typedef __WCHAR_TYPE__ wchar_t; extern int strcmp (const char *, const char *); extern int puts (const char *); extern void abort (void); #define err(str) do { puts(str); abort(); } while (0) /* Escaped newlines. */ const char *str1 = "s\ t\ \ r??/ 1"; const char x = '\ ??/ b'; /* Test escaped terminators. */ const char *term = "\"\\\"\\"; const char termc = '\''; const char *terms = "'"; /* Test wide strings and chars are lexed. */ const wchar_t wchar = L'w'; const wchar_t* wstring = L"wide string"; /* Test all 9 trigraphs embedded in a string. Test trigraphs do not survive an embedded backslash newline. Test trigraphs preceded by a '?' are still noticed. */ const char *t = "??/\????=??)??\ (??(??!??'??-???=???/ ?-"; int main (int argc, char *argv[]) { if (strcmp (str1, "str 1")) err ("str1"); if (x != 'b') err ("b"); /* We have to split the string up to avoid trigraph replacement here. Split the 2 trigraphs after both 1 and 2 ?s; just doing this exposed a bug in the initial release of the tokenized lexer. */ if (strcmp (t, "\\{}#]?" "?([|^~?#??" "-")) err ("Embedded trigraphs"); if (term[0] != '"' || term[1] != '\\' || term[2] != '"' || term[3] != '\\' || term[4] != '\0') err ("Escaped string terminators"); if (termc != terms[0]) err ("Escaped character constant terminator"); return 0; }