diff options
author | Alp Toker <alp@nuanti.com> | 2014-05-21 06:13:51 +0000 |
---|---|---|
committer | Alp Toker <alp@nuanti.com> | 2014-05-21 06:13:51 +0000 |
commit | 4f6988e4874e78ff109af7053d7b98c2f591788b (patch) | |
tree | b3047b66733453298d7f63b35b29500e31a2c22c /test/Preprocessor | |
parent | d685fc0eccf468b6d16204965b92f7ed65ee62b2 (diff) | |
download | clang-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.cpp | 23 | ||||
-rw-r--r-- | test/Preprocessor/cxx_oper_keyword_ms_compat.cpp | 7 | ||||
-rw-r--r-- | test/Preprocessor/ifdef-recover.c | 13 | ||||
-rw-r--r-- | test/Preprocessor/ucn-pp-identifier.c | 6 |
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}} |