xref: /llvm-project/clang/test/C/drs/dr324.c (revision fc7b8e71312f89986be1a7cc67377a2decfcf337)
1 /* RUN: rm -rf %t && mkdir %t
2    RUN: cp %s %t/dr324.c
3 
4    Note: this file (dr324.c) must be newer than the file used for the
5      dependency pragma (dep.c), otherwise we get an unrelated "current file is
6      older than dependency" warning. Touch dep.c first to make sure it's
7      always older.
8    RUN: touch %t/dep.c
9    RUN: touch %t/dr324.c
10 
11    RUN: %clang_cc1 -std=c89 -fsyntax-only -fms-extensions -pedantic -verify %t/dr324.c
12    RUN: %clang_cc1 -std=c99 -fsyntax-only -fms-extensions -pedantic -verify %t/dr324.c
13    RUN: %clang_cc1 -std=c11 -fsyntax-only -fms-extensions -pedantic -verify %t/dr324.c
14    RUN: %clang_cc1 -std=c17 -fsyntax-only -fms-extensions -pedantic -verify %t/dr324.c
15    RUN: %clang_cc1 -std=c2x -fsyntax-only -fms-extensions -pedantic -verify %t/dr324.c
16  */
17 
18 /* WG14 DR324: yes
19  * Tokenization obscurities
20  */
21 
22 /* We need to diagnose an unknown escape sequence in a string or character
23  * literal, but not within a header-name terminal.
24  */
25 const char *lit_str = "\y"; /* expected-warning {{unknown escape sequence '\y'}} */
26 char lit_char = '\y';       /* expected-warning {{unknown escape sequence '\y'}} */
27 
28 /* This gets trickier in a pragma where there are implementation-defined
29  * locations that may use a header-name production. The first pragma below
30  * is using \d but it's in a header-name use rather than a string-literal use.
31  * The second pragma is a string-literal and so the \d is invalid there.
32  */
33 #ifdef _WIN32
34 /* This test only makes sense on Windows targets, where the backslash is a valid
35  * path separator.
36  */
37 #pragma GCC dependency "oops\..\dep.c"
38 #endif
39 #pragma message("this has a \t tab escape and an invalid \d escape") /* expected-warning {{this has a 	 tab escape and an invalid d escape}}
40                                                                         expected-warning {{unknown escape sequence '\d'}}
41                                                                       */
42 
43 /*
44  * Note, this tests the behavior of a non-empty source file that ends with a
45  * partial preprocessing token such as an unterminated string or character
46  * literal. Thus, it is important that no code be added after this test case.
47  */
48 /* expected-error@+3 {{expected identifier or '('}}
49    expected-warning@+3 {{missing terminating ' character}}
50  */
51 't
52