diff options
author | Alp Toker <alp@nuanti.com> | 2014-05-31 16:32:22 +0000 |
---|---|---|
committer | Alp Toker <alp@nuanti.com> | 2014-05-31 16:32:22 +0000 |
commit | 5c0a1a44687cbca0cbb5d253e9ed8b457a6eb92e (patch) | |
tree | 5c6e7c35f6f5be5d0abef06d2d9c9288c1361314 | |
parent | 733637bbe91838e329b0bb272387637898923860 (diff) | |
download | clang-5c0a1a44687cbca0cbb5d253e9ed8b457a6eb92e.tar.gz clang-5c0a1a44687cbca0cbb5d253e9ed8b457a6eb92e.tar.bz2 clang-5c0a1a44687cbca0cbb5d253e9ed8b457a6eb92e.tar.xz |
Preprocessor: make C++ operator names as macro identifiers a compatible extension
With recent changes, this is now a compatible language extension and can be
safely enabled with -ms-extensions instead of requiring the full
-ms-compatibility MSVC drop-in mode. As such we can now also emit an extension
warning under -Wmicrosoft to help users port their code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209978 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticLexKinds.td | 2 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 11 | ||||
-rw-r--r-- | test/Parser/MicrosoftExtensions.cpp | 3 | ||||
-rw-r--r-- | test/Preprocessor/cxx_oper_keyword_ms_compat.cpp | 3 |
4 files changed, 13 insertions, 6 deletions
diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index 01f56089d9..a32b9025c1 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -501,6 +501,8 @@ def ext_pp_bad_paste_ms : ExtWarn< InGroup<DiagGroup<"invalid-token-paste">>; def err_pp_operator_used_as_macro_name : Error< "C++ operator %0 (aka %1) used as a macro name">; +def ext_pp_operator_used_as_macro_name : Extension< + "C++ operator %0 (aka %1) used as a macro name">, InGroup<Microsoft>; def err_pp_illegal_floating_literal : Error< "floating point literal in preprocessor expression">; def err_pp_line_requires_integer : Error< diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 46e8f07c51..a8dde086ba 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -145,11 +145,12 @@ bool Preprocessor::CheckMacroName(Token &MacroNameTok, char isDefineUndef) { if (!II->isCPlusPlusOperatorKeyword()) return Diag(MacroNameTok, diag::err_pp_macro_not_identifier); - if (!getLangOpts().MSVCCompat) - // C++ 2.5p2: Alternative tokens behave the same as its primary token - // except for their spellings. - Diag(MacroNameTok, diag::err_pp_operator_used_as_macro_name) - << II << MacroNameTok.getKind(); + // C++ 2.5p2: Alternative tokens behave the same as its primary token + // except for their spellings. + Diag(MacroNameTok, getLangOpts().MicrosoftExt + ? diag::ext_pp_operator_used_as_macro_name + : diag::err_pp_operator_used_as_macro_name) + << II << MacroNameTok.getKind(); // Allow #defining |and| and friends for Microsoft compatibility or // recovery when legacy C headers are included in C++. diff --git a/test/Parser/MicrosoftExtensions.cpp b/test/Parser/MicrosoftExtensions.cpp index 5f3c2a26fc..72d6c2ed58 100644 --- a/test/Parser/MicrosoftExtensions.cpp +++ b/test/Parser/MicrosoftExtensions.cpp @@ -426,3 +426,6 @@ void TestProperty() { sp.V11++; ++sp.V11; } + +//expected-warning@+1 {{C++ operator 'and' (aka '&&') used as a macro name}} +#define and foo diff --git a/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp b/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp index dcf6908c32..8e1351e347 100644 --- a/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp +++ b/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 %s -E -fms-compatibility +// RUN: %clang_cc1 %s -E -verify -fms-extensions +// expected-no-diagnostics bool f() { // Check that operators still work before redefining them. |