[clang] 113861b - Fix -Wcompound-token-split to give the same warnings under -E

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 31 20:59:38 PDT 2020


Author: Richard Smith
Date: 2020-08-31T20:59:20-07:00
New Revision: 113861b444610aebd1c05760a3e0ee6284f42211

URL: https://github.com/llvm/llvm-project/commit/113861b444610aebd1c05760a3e0ee6284f42211
DIFF: https://github.com/llvm/llvm-project/commit/113861b444610aebd1c05760a3e0ee6284f42211.diff

LOG: Fix -Wcompound-token-split to give the same warnings under -E
-frewrite-includes.

Remove the special-case (and highly implausible) diagnostic for a
compound token that crosses a file boundary, and instead model that case
the same as a compound token separated by whitespace, so that file
transitions and presumed file transitions behave the same way.

Added: 
    

Modified: 
    clang/include/clang/Basic/DiagnosticParseKinds.td
    clang/lib/Parse/Parser.cpp
    clang/test/Parser/compound-token-split.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 42da8bbad74f..0e51fef8659e 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -70,9 +70,6 @@ def subst_compound_token_kind : TextSubstitution<
 def warn_compound_token_split_by_macro : Warning<
   "%sub{subst_compound_token_kind}0,1,2,3 appear in 
diff erent "
   "macro expansion contexts">, InGroup<CompoundTokenSplitByMacro>;
-def warn_compound_token_split_by_file : Warning<
-  "%sub{subst_compound_token_kind}0,1,2,3 appear in 
diff erent source files">,
-  InGroup<CompoundTokenSplit>;
 def note_compound_token_split_second_token_here : Note<
   "%select{|second }0%1 token is here">;
 def warn_compound_token_split_by_whitespace : Warning<

diff  --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 70e6e74ade89..c72ffde8fc26 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -233,13 +233,12 @@ void Parser::checkCompoundToken(SourceLocation FirstTokLoc,
     return;
   SourceLocation SecondTokLoc = Tok.getLocation();
 
-  // We expect both tokens to come from the same FileID.
-  FileID FirstID = PP.getSourceManager().getFileID(FirstTokLoc);
-  FileID SecondID = PP.getSourceManager().getFileID(SecondTokLoc);
-  if (FirstID != SecondID) {
-    Diag(FirstTokLoc, (FirstTokLoc.isMacroID() || SecondTokLoc.isMacroID())
-                          ? diag::warn_compound_token_split_by_macro
-                          : diag::warn_compound_token_split_by_file)
+  // If either token is in a macro, we expect both tokens to come from the same
+  // macro expansion.
+  if ((FirstTokLoc.isMacroID() || SecondTokLoc.isMacroID()) &&
+      PP.getSourceManager().getFileID(FirstTokLoc) !=
+          PP.getSourceManager().getFileID(SecondTokLoc)) {
+    Diag(FirstTokLoc, diag::warn_compound_token_split_by_macro)
         << (FirstTokKind == Tok.getKind()) << FirstTokKind << Tok.getKind()
         << static_cast<int>(Op) << SourceRange(FirstTokLoc);
     Diag(SecondTokLoc, diag::note_compound_token_split_second_token_here)
@@ -249,7 +248,7 @@ void Parser::checkCompoundToken(SourceLocation FirstTokLoc,
   }
 
   // We expect the tokens to abut.
-  if (Tok.hasLeadingSpace()) {
+  if (Tok.hasLeadingSpace() || Tok.isAtStartOfLine()) {
     SourceLocation SpaceLoc = PP.getLocForEndOfToken(FirstTokLoc);
     if (SpaceLoc.isInvalid())
       SpaceLoc = FirstTokLoc;

diff  --git a/clang/test/Parser/compound-token-split.cpp b/clang/test/Parser/compound-token-split.cpp
index 0f1774a10714..6b77bf386087 100644
--- a/clang/test/Parser/compound-token-split.cpp
+++ b/clang/test/Parser/compound-token-split.cpp
@@ -1,8 +1,12 @@
 // RUN: %clang_cc1 %s -verify
 // RUN: %clang_cc1 %s -verify=expected,space -Wcompound-token-split
 
+// Ensure we get the same warnings after -frewrite-includes
+// RUN: %clang_cc1 %s -E -frewrite-includes -o %t
+// RUN: %clang_cc1 -x c++ %t -verify=expected,space -Wcompound-token-split
+
 #ifdef LSQUARE
-[ // expected-note {{second '[' token is here}}
+[
 #else
 
 #define VAR(type, name, init) type name = (init)
@@ -26,7 +30,7 @@ int f2() {
   return n;
 }
 
-[ // expected-warning-re {{{{^}}'[' tokens introducing attribute appear in 
diff erent source files}}
+[ // space-warning-re {{{{^}}'[' tokens introducing attribute are separated by whitespace}}
 #define LSQUARE
 #include __FILE__
   noreturn ]]  void g();


        


More information about the cfe-commits mailing list