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 | b05e0b53b9dde9e3eb47f9e42fcd79cd6448f00e (patch) | |
tree | 4e356a69ec7bae6c0054907d029300f4c18c6080 /clang/test | |
parent | 161e4db52f657eac37d89e655c0772f98e97d989 (diff) | |
download | bcm5719-llvm-b05e0b53b9dde9e3eb47f9e42fcd79cd6448f00e.tar.gz bcm5719-llvm-b05e0b53b9dde9e3eb47f9e42fcd79cd6448f00e.zip |
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.
llvm-svn: 209276
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Parser/cxx11-user-defined-literals.cpp | 2 | ||||
-rw-r--r-- | clang/test/Preprocessor/cxx_oper_keyword.cpp | 23 | ||||
-rw-r--r-- | clang/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp | 7 | ||||
-rw-r--r-- | clang/test/Preprocessor/ifdef-recover.c | 13 | ||||
-rw-r--r-- | clang/test/Preprocessor/ucn-pp-identifier.c | 6 |
5 files changed, 40 insertions, 11 deletions
diff --git a/clang/test/Parser/cxx11-user-defined-literals.cpp b/clang/test/Parser/cxx11-user-defined-literals.cpp index a7446529aec..b89a5741865 100644 --- a/clang/test/Parser/cxx11-user-defined-literals.cpp +++ b/clang/test/Parser/cxx11-user-defined-literals.cpp @@ -139,7 +139,7 @@ void operator""_\u212e""_\u212f(unsigned long long) {} // expected-error {{diffe void operator""_℮""_℮(unsigned long long) {} // expected-note {{previous}} void operator""_\u212e""_\u212e(unsigned long long) {} // expected-error {{redefinition}} -#define ¢ *0.01 // expected-error {{macro names must be identifiers}} +#define ¢ *0.01 // expected-error {{macro name must be an identifier}} constexpr int operator""_¢(long double d) { return d * 100; } // expected-error {{non-ASCII}} constexpr int operator""_¢(unsigned long long n) { return n; } // expected-error {{non-ASCII}} static_assert(0.02_¢ == 2_¢, ""); // expected-error 2{{non-ASCII}} diff --git a/clang/test/Preprocessor/cxx_oper_keyword.cpp b/clang/test/Preprocessor/cxx_oper_keyword.cpp index 3fc246dd6c2..5a4653f1a7a 100644 --- a/clang/test/Preprocessor/cxx_oper_keyword.cpp +++ b/clang/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/clang/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp b/clang/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp index 1c6ef90c8b8..dcf6908c329 100644 --- a/clang/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp +++ b/clang/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/clang/test/Preprocessor/ifdef-recover.c b/clang/test/Preprocessor/ifdef-recover.c index 3d652dc604d..a6481359f43 100644 --- a/clang/test/Preprocessor/ifdef-recover.c +++ b/clang/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/clang/test/Preprocessor/ucn-pp-identifier.c b/clang/test/Preprocessor/ucn-pp-identifier.c index 6936ed92cb5..f045e38e94a 100644 --- a/clang/test/Preprocessor/ucn-pp-identifier.c +++ b/clang/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}} |