Effectively revert 33c3d8a916c / D33782
authorReid Kleckner <rnk@google.com>
Wed, 25 Aug 2021 18:34:00 +0000 (11:34 -0700)
committerReid Kleckner <rnk@google.com>
Wed, 25 Aug 2021 21:41:26 +0000 (14:41 -0700)
This change would treat the token `or` in system headers as an
identifier, and elsewhere as an operator. As reported in
llvm.org/pr42427, many users classify their third party library headers
as "system" headers to suppress warnings. There's no clean way to
separate Windows SDK headers from user headers.

Clang is still able to parse old Windows SDK headers if C++ operator
names are disabled. Traditionally this was controlled by
`-fno-operator-names`, but is now also enabled with `/permissive` since
D103773. This change will prevent `clang-cl` from parsing <query.h> from
the Windows SDK out of the box, but there are multiple ways to work
around that:
- Pass `/clang:-fno-operator-names`
- Pass `/permissive`
- Pass `-DQUERY_H_RESTRICTION_PERMISSIVE`

In all of these modes, the operator names will consistently be available
or not available, instead of depending on whether the code is in a
system header.

I added a release note for this, since it may break straightforward
users of the Windows SDK.

Fixes PR42427

Differential Revision: https://reviews.llvm.org/D108720

clang/docs/ReleaseNotes.rst
clang/lib/Lex/Preprocessor.cpp
clang/test/Headers/ms-cppoperkey.cpp [deleted file]
clang/test/Headers/ms-cppoperkey1.cpp [deleted file]
clang/test/Headers/ms-cppoperkey2.cpp [deleted file]

index 4ed7543..8bae1ed 100644 (file)
@@ -97,6 +97,12 @@ Attribute Changes in Clang
 Windows Support
 ---------------
 
+- An MSVC compatibility workaround for C++ operator names was removed. As a
+  result, the ``<query.h>`` Windows SDK header may not compile out of the box.
+  Users should use a recent SDK and pass ``-DQUERY_H_RESTRICTION_PERMISSIVE``
+  or pass ``/permissive`` to disable C++ operator names altogether. See
+  `PR42427 <https://llvm.org/pr42427>` for more info.
+
 C Language Changes in Clang
 ---------------------------
 
index d79637a..97615d8 100644 (file)
@@ -723,11 +723,7 @@ IdentifierInfo *Preprocessor::LookUpIdentifierInfo(Token &Identifier) const {
   // is cleaned to tok::identifier "B". After cleaning the token's length is
   // still 3 and the SourceLocation refers to the location of the backslash.
   Identifier.setIdentifierInfo(II);
-  if (getLangOpts().MSVCCompat && II->isCPlusPlusOperatorKeyword() &&
-      getSourceManager().isInSystemHeader(Identifier.getLocation()))
-    Identifier.setKind(tok::identifier);
-  else
-    Identifier.setKind(II->getTokenID());
+  Identifier.setKind(II->getTokenID());
 
   return II;
 }
diff --git a/clang/test/Headers/ms-cppoperkey.cpp b/clang/test/Headers/ms-cppoperkey.cpp
deleted file mode 100644 (file)
index ca56ee1..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: %clang_cc1 \
-// RUN:     -fms-compatibility -x c++-cpp-output \
-// RUN:     -ffreestanding -fsyntax-only -Werror \
-// RUN:     %s -verify
-// expected-no-diagnostics
-# 1 "t.cpp"
-# 1 "query.h" 1 3
-// MS header <query.h> uses operator keyword as field name.  
-// Compile without syntax errors.
-struct tagRESTRICTION
-  {
-   union _URes 
-     {
-       int or; // Note use of cpp operator token
-     } res;
-  };
diff --git a/clang/test/Headers/ms-cppoperkey1.cpp b/clang/test/Headers/ms-cppoperkey1.cpp
deleted file mode 100644 (file)
index c03efc9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: %clang_cc1 \
-// RUN:     -fms-compatibility -x c++-cpp-output \
-// RUN:     -ffreestanding -fsyntax-only -Werror \
-// RUN:     %s -verify
-
-
-# 1 "t.cpp"
-# 1 "query.h" 1 3 4
-// MS header <query.h> uses operator keyword as field name.  
-// Compile without syntax errors.
-struct tagRESTRICTION
-  {
-   union _URes 
-     {
-       int or; // Note use of cpp operator token
-     } res;
-  };
-   ;
-
-int aa ( int x)
-{
-  // In system header code, treat operator keyword as identifier.
-  if ( // expected-note{{to match this '('}}
-    x>1 or x<0) return 1; // expected-error{{expected ')'}}
-  else return 0;  
-}
-
diff --git a/clang/test/Headers/ms-cppoperkey2.cpp b/clang/test/Headers/ms-cppoperkey2.cpp
deleted file mode 100644 (file)
index 2afed36..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-// RUN: %clang_cc1  -triple x86_64-pc-win32 -fms-compatibility \
-// RUN:     -ffreestanding -fsyntax-only -Werror  %s -verify
-// RUN: %clang_cc1 \
-// RUN:     -ffreestanding -fsyntax-only -Werror  %s -verify
-// expected-no-diagnostics
-int bb ( int x)
-{
-  // In user code, treat operator keyword as operator keyword.
-  if ( x>1 or x<0) return 1;
-  else return 0;  
-}