aboutsummaryrefslogtreecommitdiff
path: root/test/Preprocessor/ucn-allowed-chars.c
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-02-09 01:10:25 +0000
committerJordan Rose <jordan_rose@apple.com>2013-02-09 01:10:25 +0000
commited9c59f2ae338f6f70c1fed2ce7b0d8a5eb3ba1c (patch)
treec44416a4a19ee046bfff32e5688f7fe40e14b7aa /test/Preprocessor/ucn-allowed-chars.c
parentd523df6a143a97eea46916c6e31c8f2a0728bf28 (diff)
Properly validate UCNs for C99 and C++03 (both more restrictive than C(++)11).
Add warnings under -Wc++11-compat, -Wc++98-compat, and -Wc99-compat when a particular UCN is incompatible with a different standard, and -Wunicode when a UCN refers to a surrogate character in C++03. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174788 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Preprocessor/ucn-allowed-chars.c')
-rw-r--r--test/Preprocessor/ucn-allowed-chars.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/test/Preprocessor/ucn-allowed-chars.c b/test/Preprocessor/ucn-allowed-chars.c
new file mode 100644
index 0000000000..d49aa9cbb4
--- /dev/null
+++ b/test/Preprocessor/ucn-allowed-chars.c
@@ -0,0 +1,78 @@
+// RUN: %clang_cc1 %s -fsyntax-only -std=c99 -verify
+// RUN: %clang_cc1 %s -fsyntax-only -std=c11 -Wc99-compat -verify
+// RUN: %clang_cc1 %s -fsyntax-only -x c++ -std=c++03 -Wc++11-compat -verify
+// RUN: %clang_cc1 %s -fsyntax-only -x c++ -std=c++11 -Wc++98-compat -verify
+
+// Identifier characters
+extern char a\u01F6; // C11, C++11
+extern char a\u00AA; // C99, C11, C++11
+extern char a\u0384; // C++03, C11, C++11
+extern char a\u0E50; // C99, C++03, C11, C++11
+extern char a\uFFFF; // none
+
+
+
+
+
+// Identifier initial characters
+extern char \u0E50; // C++03, C11, C++11
+extern char \u0300; // disallowed initially in C11/C++11, always in C99/C++03
+
+
+
+
+
+
+
+
+// Disallowed everywhere
+#define A \u0000 // expected-error{{control character}}
+#define B \u001F // expected-error{{control character}}
+#define C \u007F // expected-error{{control character}}
+#define D \u009F // expected-error{{control character}}
+#define E \uD800 // C++03 allows UCNs representing surrogate characters!
+
+
+
+
+
+
+#if __cplusplus
+# if __cplusplus >= 201103L
+// C++11
+// expected-warning@7 {{using this character in an identifier is incompatible with C++98}}
+// expected-warning@8 {{using this character in an identifier is incompatible with C++98}}
+// expected-error@11 {{expected ';'}}
+// expected-error@19 {{expected unqualified-id}}
+// expected-error@33 {{invalid universal character}}
+
+# else
+// C++03
+// expected-error@7 {{expected ';'}}
+// expected-error@8 {{expected ';'}}
+// expected-error@11 {{expected ';'}}
+// expected-error@19 {{expected unqualified-id}}
+// expected-warning@33 {{universal character name refers to a surrogate character}}
+
+# endif
+#else
+# if __STDC_VERSION__ >= 201112L
+// C11
+// expected-warning@7 {{using this character in an identifier is incompatible with C99}}
+// expected-warning@9 {{using this character in an identifier is incompatible with C99}}
+// expected-error@11 {{expected ';'}}
+// expected-warning@18 {{starting an identifier with this character is incompatible with C99}}
+// expected-error@19 {{expected identifier}}
+// expected-error@33 {{invalid universal character}}
+
+# else
+// C99
+// expected-error@7 {{expected ';'}}
+// expected-error@9 {{expected ';'}}
+// expected-error@11 {{expected ';'}}
+// expected-error@18 {{expected identifier}}
+// expected-error@19 {{expected identifier}}
+// expected-error@33 {{invalid universal character}}
+
+# endif
+#endif