Preprocessor: make C++ operator names as macro identifiers a compatible extension
authorAlp Toker <alp@nuanti.com>
Sat, 31 May 2014 16:32:22 +0000 (16:32 +0000)
committerAlp Toker <alp@nuanti.com>
Sat, 31 May 2014 16:32:22 +0000 (16:32 +0000)
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.

llvm-svn: 209978

clang/include/clang/Basic/DiagnosticLexKinds.td
clang/lib/Lex/PPDirectives.cpp
clang/test/Parser/MicrosoftExtensions.cpp
clang/test/Preprocessor/cxx_oper_keyword_ms_compat.cpp

index 01f5608..a32b902 100644 (file)
@@ -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<
index 46e8f07..a8dde08 100644 (file)
@@ -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++.
index 5f3c2a2..72d6c2e 100644 (file)
@@ -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
index dcf6908..8e1351e 100644 (file)
@@ -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.