summaryrefslogtreecommitdiff
path: root/test/Preprocessor
diff options
context:
space:
mode:
authorAlp Toker <alp@nuanti.com>2014-05-21 06:13:51 +0000
committerAlp Toker <alp@nuanti.com>2014-05-21 06:13:51 +0000
commit4f6988e4874e78ff109af7053d7b98c2f591788b (patch)
treeb3047b66733453298d7f63b35b29500e31a2c22c /test/Preprocessor
parentd685fc0eccf468b6d16204965b92f7ed65ee62b2 (diff)
downloadclang-4f6988e4874e78ff109af7053d7b98c2f591788b.tar.gz
clang-4f6988e4874e78ff109af7053d7b98c2f591788b.tar.bz2
clang-4f6988e4874e78ff109af7053d7b98c2f591788b.tar.xz
Preprocessor: support defined() with operator names for MS compatibility
Also flesh out missing tests, improve diagnostic QOI and fix a couple of corner cases found in the process. Fixes PR10606. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209276 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Preprocessor')
-rw-r--r--test/Preprocessor/cxx_oper_keyword.cpp23
-rw-r--r--test/Preprocessor/cxx_oper_keyword_ms_compat.cpp7
-rw-r--r--test/Preprocessor/ifdef-recover.c13
-rw-r--r--test/Preprocessor/ucn-pp-identifier.c6
4 files changed, 39 insertions, 10 deletions
diff --git a/test/Preprocessor/cxx_oper_keyword.cpp b/test/Preprocessor/cxx_oper_keyword.cpp
index 3fc246dd6c..5a4653f1a7 100644
--- a/test/Preprocessor/cxx_oper_keyword.cpp
+++ b/test/Preprocessor/cxx_oper_keyword.cpp
@@ -1,7 +1,22 @@
-// RUN: not %clang_cc1 %s -E
-// RUN: %clang_cc1 %s -E -fno-operator-names
+// RUN: %clang_cc1 %s -E -verify -DOPERATOR_NAMES
+// RUN: %clang_cc1 %s -E -verify -fno-operator-names
-// Not valid in C++ unless -fno-operator-names is passed.
-#define and foo
+#ifndef OPERATOR_NAMES
+//expected-error@+3 {{token is not a valid binary operator in a preprocessor subexpression}}
+#endif
+// Valid because 'and' is a spelling of '&&'
+#if defined foo and bar
+#endif
+
+// Not valid in C++ unless -fno-operator-names is passed:
+#ifdef OPERATOR_NAMES
+//expected-error@+2 {{C++ operator 'and' cannot be used as a macro name}}
+#endif
+#define and foo
+#ifdef OPERATOR_NAMES
+//expected-error@+2 {{C++ operator 'and' cannot be used as a macro name}}
+#endif
+#if defined and
+#endif
diff --git a/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp b/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp
index 1c6ef90c8b..dcf6908c32 100644
--- a/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp
+++ b/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp
@@ -7,6 +7,13 @@ bool f() {
#endif
}
+#ifdef and
+#endif
+
+// The second 'and' is a valid C++ operator name for '&&'.
+#if defined and and defined(and)
+#endif
+
// All c++ keywords should be #define-able in ms mode.
// (operators like "and" aren't normally, the rest always is.)
#define and
diff --git a/test/Preprocessor/ifdef-recover.c b/test/Preprocessor/ifdef-recover.c
index 3d652dc604..a6481359f4 100644
--- a/test/Preprocessor/ifdef-recover.c
+++ b/test/Preprocessor/ifdef-recover.c
@@ -1,15 +1,22 @@
-/* RUN: not %clang_cc1 -E %s 2>&1 >/dev/null | grep error: | count 3
+/* RUN: %clang_cc1 -E -verify %s
*/
+/* expected-error@+1 {{macro name missing}} */
#ifdef
+#endif
+
+/* expected-error@+1 {{macro name must be an identifier}} */
+#ifdef !
+#endif
+/* expected-error@+1 {{macro name missing}} */
+#if defined
#endif
-/* End of function-like macro invocation in #ifdef */
/* PR1936 */
+/* expected-error@+2 {{unterminated function-like macro invocation}} expected-error@+2 {{expected value in expression}} expected-note@+1 {{macro 'f' defined here}} */
#define f(x) x
#if f(2
#endif
int x;
-
diff --git a/test/Preprocessor/ucn-pp-identifier.c b/test/Preprocessor/ucn-pp-identifier.c
index 6936ed92cb..f045e38e94 100644
--- a/test/Preprocessor/ucn-pp-identifier.c
+++ b/test/Preprocessor/ucn-pp-identifier.c
@@ -24,9 +24,9 @@
#endif
// Make sure we reject disallowed UCNs
-#define \ufffe // expected-error {{macro names must be identifiers}}
-#define \U10000000 // expected-error {{macro names must be identifiers}}
-#define \u0061 // expected-error {{character 'a' cannot be specified by a universal character name}} expected-error {{macro names must be identifiers}}
+#define \ufffe // expected-error {{macro name must be an identifier}}
+#define \U10000000 // expected-error {{macro name must be an identifier}}
+#define \u0061 // expected-error {{character 'a' cannot be specified by a universal character name}} expected-error {{macro name must be an identifier}}
// FIXME: Not clear what our behavior should be here; \u0024 is "$".
#define a\u0024 // expected-warning {{whitespace}}