[PATCH] D142465: [clang][lex] Consolidate PPCallbacks::PragmaDirective parameters

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
KyleFromKitware added a project: clang.
Herald added subscribers: carlosgalvezp, shchenz, kbarton, nemanjai.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.
Herald added a project: clang-tools-extra.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142465

Files:
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
  clang/include/clang/Lex/PPCallbacks.h
  clang/lib/Lex/Pragma.cpp

Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -166,7 +166,7 @@
 /// rest of the pragma, passing it to the registered pragma handlers.
 void Preprocessor::HandlePragmaDirective(PragmaIntroducer Introducer) {
   if (Callbacks)
-Callbacks->PragmaDirective(Introducer.Loc, Introducer.Kind);
+Callbacks->PragmaDirective(Introducer);
 
   if (!PragmasEnabled)
 return;
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -183,9 +183,7 @@
   }
 
   /// Callback invoked when start reading any pragma directive.
-  virtual void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) {
-  }
+  virtual void PragmaDirective(PragmaIntroducer Introducer) {}
 
   /// Callback invoked when a \#pragma comment directive is read.
   virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
@@ -493,10 +491,9 @@
 Second->Ident(Loc, str);
   }
 
-  void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) override {
-First->PragmaDirective(Loc, Introducer);
-Second->PragmaDirective(Loc, Introducer);
+  void PragmaDirective(PragmaIntroducer Introducer) override {
+First->PragmaDirective(Introducer);
+Second->PragmaDirective(Introducer);
   }
 
   void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -6,24 +6,21 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -18,72 +18,61 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragm

[PATCH] D142030: [pp-trace] Print HashLoc/Introducer parameter

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 491747.
KyleFromKitware retitled this revision from "[pp-trace] Print HashLoc 
parameter" to "[pp-trace] Print HashLoc/Introducer parameter".
KyleFromKitware added a comment.

Printed Introducer parameter in Pragma methods.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-ident.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -8,6 +8,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
@@ -15,6 +16,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
@@ -22,6 +24,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:54"
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -20,36 +20,42 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:9"
 // CHECK-NEXT:   Kind: exestr
 // CHECK-NEXT:   Str: exestr comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:9"
 // CHECK-NEXT:   Kind: lib
 // CHECK-NEXT:   Str: lib comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:9"
 // CHECK-NEXT:   Kind: linker
 // CHECK-NEXT:   Str: linker comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\

[PATCH] D142470: [clang][lex] Add PragmaOnce callback to PPCallbacks

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
KyleFromKitware added a project: clang.
Herald added subscribers: shchenz, kbarton, nemanjai.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142470

Files:
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/Lex/Pragma.cpp


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,7 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer, Token 
&OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +416,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +994,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(PragmaIntroducer Introducer, Token &MarkTok);
   void HandlePragmaPoison();
   void HandlePragmaSystemHeader(Token &SysHeaderTok);
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -295,6 +295,9 @@
   virtual void PragmaAssumeNonNullEnd(PragmaIntroducer Introducer,
   SourceLocation Loc) {}
 
+  /// Callback invoked when a \#pragma once directive is read.
+  virtual void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) {}
+
   /// Called by Preprocessor::HandleMacroExpandedIdentifier when a
   /// macro invocation is found.
   virtual void MacroExpands(const Token &MacroNameTok,
@@ -609,6 +612,11 @@
 Second->PragmaAssumeNonNullEnd(Introducer, Loc);
   }
 
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override {
+First->PragmaOnce(Introducer, Loc);
+Second->PragmaOnce(Introducer, Loc);
+  }
+
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override {
 First->MacroExpands(MacroNameTok, MD, Range, Args);


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,7 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +416,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +994,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h

[PATCH] D142471: [pp-trace] Add PragmaOnce callback

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang-tools-extra.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
KyleFromKitware added a project: clang-tools-extra.
Herald added subscribers: kbarton, nemanjai.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142471

Files:
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck 
--strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' 
-extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  StringRef Str) override;
   void PragmaExecCharsetPop(PragmaIntroducer Introducer,
 SourceLocation Loc) override;
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override;
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override;
   void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
@@ -337,6 +337,13 @@
   appendArgument("Loc", Loc);
 }
 
+/// Callback invoked when a \#pragma once directive is read.
+void PPCallbacksTracker::PragmaOnce(PragmaIntroducer Introducer, 
SourceLocation Loc) {
+  beginCallback("PragmaOnce");
+  appendArgument("Introducer", Introducer);
+  appendArgument("Loc", Loc);
+}
+
 // Called by Preprocessor::HandleMacroExpandedIdentifier when a
 // macro invocation is found.
 void PPCallbacksTracker::MacroExpands(const Token &MacroNameTok,


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck --strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' -extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMain

[PATCH] D142465: [clang][lex] Consolidate PPCallbacks::PragmaDirective parameters

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 491772.
KyleFromKitware added a comment.

Rebased onto `main` for D141000 .


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142465/new/

https://reviews.llvm.org/D142465

Files:
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
  clang/include/clang/Lex/PPCallbacks.h
  clang/lib/Lex/Pragma.cpp

Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -166,7 +166,7 @@
 /// rest of the pragma, passing it to the registered pragma handlers.
 void Preprocessor::HandlePragmaDirective(PragmaIntroducer Introducer) {
   if (Callbacks)
-Callbacks->PragmaDirective(Introducer.Loc, Introducer.Kind);
+Callbacks->PragmaDirective(Introducer);
 
   if (!PragmasEnabled)
 return;
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -193,9 +193,7 @@
   }
 
   /// Callback invoked when start reading any pragma directive.
-  virtual void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) {
-  }
+  virtual void PragmaDirective(PragmaIntroducer Introducer) {}
 
   /// Callback invoked when a \#pragma comment directive is read.
   virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
@@ -511,10 +509,9 @@
 Second->Ident(Loc, str);
   }
 
-  void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) override {
-First->PragmaDirective(Loc, Introducer);
-Second->PragmaDirective(Loc, Introducer);
+  void PragmaDirective(PragmaIntroducer Introducer) override {
+First->PragmaDirective(Introducer);
+Second->PragmaDirective(Introducer);
   }
 
   void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -6,24 +6,21 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -18,72 +18,61 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT

[PATCH] D142030: [pp-trace] Print HashLoc/Introducer parameter

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 491774.
KyleFromKitware added a comment.

Rebased onto `main` for D141000 .


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-ident.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -8,6 +8,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
@@ -15,6 +16,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
@@ -22,6 +24,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:54"
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -20,36 +20,42 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:9"
 // CHECK-NEXT:   Kind: exestr
 // CHECK-NEXT:   Str: exestr comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:9"
 // CHECK-NEXT:   Kind: lib
 // CHECK-NEXT:   Str: lib comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:9"
 // CHECK-NEXT:   Kind: linker
 // CHECK-NEXT:   Str: linker comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:9"
 // CHECK-NEXT:   Kind: user
 // CHECK-NEXT:   Str: user comment
 // CHECK-NEXT: -

[PATCH] D142470: [clang][lex] Add PragmaOnce callback to PPCallbacks

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 491775.
KyleFromKitware added a comment.

Rebased onto `main` for D141000 .


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142470/new/

https://reviews.llvm.org/D142470

Files:
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/Lex/Pragma.cpp


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,7 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer, Token 
&OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +416,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +994,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(PragmaIntroducer Introducer, Token &MarkTok);
   void HandlePragmaPoison();
   void HandlePragmaSystemHeader(Token &SysHeaderTok);
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -305,6 +305,9 @@
   virtual void PragmaAssumeNonNullEnd(PragmaIntroducer Introducer,
   SourceLocation Loc) {}
 
+  /// Callback invoked when a \#pragma once directive is read.
+  virtual void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) {}
+
   /// Called by Preprocessor::HandleMacroExpandedIdentifier when a
   /// macro invocation is found.
   virtual void MacroExpands(const Token &MacroNameTok,
@@ -627,6 +630,11 @@
 Second->PragmaAssumeNonNullEnd(Introducer, Loc);
   }
 
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override {
+First->PragmaOnce(Introducer, Loc);
+Second->PragmaOnce(Introducer, Loc);
+  }
+
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override {
 First->MacroExpands(MacroNameTok, MD, Range, Args);


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,7 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +416,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +994,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
 

[PATCH] D142471: [pp-trace] Add PragmaOnce callback

2023-01-24 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 491776.
KyleFromKitware added a comment.

Rebased onto `main` for D141000 .


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142471/new/

https://reviews.llvm.org/D142471

Files:
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck 
--strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' 
-extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  StringRef Str) override;
   void PragmaExecCharsetPop(PragmaIntroducer Introducer,
 SourceLocation Loc) override;
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override;
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override;
   void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
@@ -337,6 +337,13 @@
   appendArgument("Loc", Loc);
 }
 
+/// Callback invoked when a \#pragma once directive is read.
+void PPCallbacksTracker::PragmaOnce(PragmaIntroducer Introducer, 
SourceLocation Loc) {
+  beginCallback("PragmaOnce");
+  appendArgument("Introducer", Introducer);
+  appendArgument("Loc", Loc);
+}
+
 // Called by Preprocessor::HandleMacroExpandedIdentifier when a
 // macro invocation is found.
 void PPCallbacksTracker::MacroExpands(const Token &MacroNameTok,


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck --strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' -extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/p

[PATCH] D142465: [clang][lex] Consolidate PPCallbacks::PragmaDirective parameters

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492573.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142465/new/

https://reviews.llvm.org/D142465

Files:
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
  clang/include/clang/Lex/PPCallbacks.h
  clang/lib/Lex/Pragma.cpp

Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -166,7 +166,7 @@
 /// rest of the pragma, passing it to the registered pragma handlers.
 void Preprocessor::HandlePragmaDirective(PragmaIntroducer Introducer) {
   if (Callbacks)
-Callbacks->PragmaDirective(Introducer.Loc, Introducer.Kind);
+Callbacks->PragmaDirective(Introducer);
 
   if (!PragmasEnabled)
 return;
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -193,9 +193,7 @@
   }
 
   /// Callback invoked when start reading any pragma directive.
-  virtual void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) {
-  }
+  virtual void PragmaDirective(PragmaIntroducer Introducer) {}
 
   /// Callback invoked when a \#pragma comment directive is read.
   virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
@@ -511,10 +509,9 @@
 Second->Ident(Loc, str);
   }
 
-  void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) override {
-First->PragmaDirective(Loc, Introducer);
-Second->PragmaDirective(Loc, Introducer);
+  void PragmaDirective(PragmaIntroducer Introducer) override {
+First->PragmaDirective(Introducer);
+Second->PragmaDirective(Introducer);
   }
 
   void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -6,24 +6,21 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -18,72 +18,61 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1"
-// CH

[PATCH] D142030: [pp-trace] Print HashLoc/Introducer parameter

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492575.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-ident.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -8,6 +8,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
@@ -15,6 +16,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
@@ -22,6 +24,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:54"
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -20,36 +20,42 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:9"
 // CHECK-NEXT:   Kind: exestr
 // CHECK-NEXT:   Str: exestr comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:9"
 // CHECK-NEXT:   Kind: lib
 // CHECK-NEXT:   Str: lib comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:9"
 // CHECK-NEXT:   Kind: linker
 // CHECK-NEXT:   Str: linker comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:9"
 // CHECK-NEXT:   Kind: user
 // CHECK-NEXT:   Str: user comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:9

[PATCH] D142470: [clang][lex] Add PragmaOnce callback to PPCallbacks

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492576.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142470/new/

https://reviews.llvm.org/D142470

Files:
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/Lex/Pragma.cpp


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,8 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer,
+Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +417,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +995,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(PragmaIntroducer Introducer, Token &MarkTok);
   void HandlePragmaPoison();
   void HandlePragmaSystemHeader(Token &SysHeaderTok);
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -305,6 +305,9 @@
   virtual void PragmaAssumeNonNullEnd(PragmaIntroducer Introducer,
   SourceLocation Loc) {}
 
+  /// Callback invoked when a \#pragma once directive is read.
+  virtual void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) {}
+
   /// Called by Preprocessor::HandleMacroExpandedIdentifier when a
   /// macro invocation is found.
   virtual void MacroExpands(const Token &MacroNameTok,
@@ -627,6 +630,11 @@
 Second->PragmaAssumeNonNullEnd(Introducer, Loc);
   }
 
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override {
+First->PragmaOnce(Introducer, Loc);
+Second->PragmaOnce(Introducer, Loc);
+  }
+
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override {
 First->MacroExpands(MacroNameTok, MD, Range, Args);


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,8 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer,
+Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +417,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +995,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(Pragma

[PATCH] D142471: [pp-trace] Add PragmaOnce callback

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492577.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142471/new/

https://reviews.llvm.org/D142471

Files:
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck 
--strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' 
-extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  StringRef Str) override;
   void PragmaExecCharsetPop(PragmaIntroducer Introducer,
 SourceLocation Loc) override;
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override;
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override;
   void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
@@ -337,6 +337,14 @@
   appendArgument("Loc", Loc);
 }
 
+/// Callback invoked when a \#pragma once directive is read.
+void PPCallbacksTracker::PragmaOnce(PragmaIntroducer Introducer,
+SourceLocation Loc) {
+  beginCallback("PragmaOnce");
+  appendArgument("Introducer", Introducer);
+  appendArgument("Loc", Loc);
+}
+
 // Called by Preprocessor::HandleMacroExpandedIdentifier when a
 // macro invocation is found.
 void PPCallbacksTracker::MacroExpands(const Token &MacroNameTok,


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck --strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' -extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  

[PATCH] D142673: [clang-tidy] Refactor HeaderGuardCheck to add HeaderGuardStyle

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang-tools-extra.
KyleFromKitware added a project: clang-tools-extra.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a reviewer: sscalpone.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

Having more than one check for header guards can potentially lead
to a conflict where different header guard checks suggest different
corrections. Refactor into a single HeaderGuardCheck that can
create one of multiple HeaderGuardStyle instances from a registry.
Refactor LLVMHeaderGuardCheck to extend this class.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142673

Files:
  clang-tools-extra/clang-tidy/ClangTidyModule.h
  clang-tools-extra/clang-tidy/llvm/CMakeLists.txt
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
  clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
@@ -3,6 +3,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/HeaderGuardCheck.h"
+#include "llvm/HeaderGuardStyle.h"
 #include "llvm/IncludeOrderCheck.h"
 #include "gtest/gtest.h"
 #include 
@@ -49,10 +50,18 @@
 }
 
 namespace {
+struct WithEndifCommentStyle : public LLVMHeaderGuardStyle {
+  WithEndifCommentStyle(readability::HeaderGuardCheck *Check)
+  : LLVMHeaderGuardStyle(Check) {}
+  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+};
+
 struct WithEndifComment : public LLVMHeaderGuardCheck {
   WithEndifComment(StringRef Name, ClangTidyContext *Context)
   : LLVMHeaderGuardCheck(Name, Context) {}
-  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
 };
 
 static std::string
Index: clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
===
--- /dev/null
+++ clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
@@ -0,0 +1,60 @@
+//===--- MacroHeaderGuardStyle.h - clang-tidy ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MACROHEADERGUARDSTYLE_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MACROHEADERGUARDSTYLE_H
+
+#include "HeaderGuardStyle.h"
+
+namespace clang::tidy::utils {
+class MacroHeaderGuardStyle : public HeaderGuardStyle {
+public:
+  MacroHeaderGuardStyle(readability::HeaderGuardCheck *Check)
+  : HeaderGuardStyle(Check) {}
+
+  /// Ensure that the provided header guard is a non-reserved identifier.
+  std::string sanitizeHeaderGuard(StringRef Guard);
+
+  /// Returns ``true`` if the check should suggest inserting a trailing comment
+  /// on the ``#endif`` of the header guard. It will use the same name as
+  /// returned by ``HeaderGuardCheck::getHeaderGuard``.
+  virtual bool shouldSuggestEndifComment(StringRef Filename);
+  /// Returns a replacement for the ``#endif`` line with a comment mentioning
+  /// \p HeaderGuard. The replacement should start with ``endif``.
+  virtual std::string formatEndIf(StringRef HeaderGuard);
+  /// Gets the canonical header guard for a file.
+  virtual std::string getHeaderGuard(StringRef Filename,
+ StringRef OldGuard = StringRef()) = 0;
+
+  void onHeaderGuard(Preprocessor *PP, StringRef FileName, const FileEntry *FE,
+ SourceLocation IfndefHash, SourceLocation Ifndef,
+ SourceLocation IfndefTo

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492579.
KyleFromKitware retitled this revision from "[clang-tidy] Add check to suggest 
use of #pragma once" to "[clang-tidy] Add header guard style to suggest use of 
#pragma once".
KyleFromKitware added a comment.

Refactored to use HeaderGuardStyle.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
  clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -1,6 +1,8 @@
 #include "ClangTidyTest.h"
 #include "readability/BracesAroundStatementsCheck.h"
+#include "readability/HeaderGuardCheck.h"
 #include "readability/NamespaceCommentCheck.h"
+#include "readability/PragmaOnceHeaderGuardStyle.h"
 #include "readability/SimplifyBooleanExprCheck.h"
 #include "gtest/gtest.h"
 
@@ -513,6 +515,71 @@
 nullptr, "input.cc", {"-Wno-error=return-type"}));
 }
 
+namespace {
+struct UsePragmaOnceCheck : readability::HeaderGuardCheck {
+  UsePragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+  : HeaderGuardCheck(Name, Context) {}
+
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
+};
+
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(PragmaOnceHeaderGuardStyleTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+runPragmaOnceCheck("void neither();\n", "neither.h",
+   StringRef("use #pragma once")));
+}
+
 } // namespace test
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
===
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
@@ -0,0 +1,22 @@
+.. title:: clang-tidy - modernize-use-pragma-once
+
+modernize-use-pragma-once
+=
+
+Adds ``#pragma once`` (a widely-supported compiler extension) to header files
+and removes header guards if they are used (``#ifndef`` / ``#define`` /
+``#endif``).
+
+Note that ``#pragma once`` cannot be correct in all possible use cases and has
+not been added to the C++ standard. Not all projects will wish to use it.
+
+Options
+---
+
+.. option:: HeaderFileExtensions
+
+   A c

[PATCH] D142121: [clang-tidy] Refactor common functionality of HeaderGuardCheck into HeaderGuardBase

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware abandoned this revision.
KyleFromKitware added a comment.

Closed in favor of D142673 .


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142121/new/

https://reviews.llvm.org/D142121

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142673: [clang-tidy] Refactor HeaderGuardCheck to add HeaderGuardStyle

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492633.
KyleFromKitware changed the edit policy from "All Users" to "Only User: 
KyleFromKitware (Kyle Edwards)".

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142673/new/

https://reviews.llvm.org/D142673

Files:
  clang-tools-extra/clang-tidy/ClangTidyModule.h
  clang-tools-extra/clang-tidy/llvm/CMakeLists.txt
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
@@ -3,6 +3,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/HeaderGuardCheck.h"
+#include "llvm/HeaderGuardStyle.h"
 #include "llvm/IncludeOrderCheck.h"
 #include "gtest/gtest.h"
 #include 
@@ -49,10 +50,18 @@
 }
 
 namespace {
+struct WithEndifCommentStyle : public LLVMHeaderGuardStyle {
+  WithEndifCommentStyle(readability::HeaderGuardCheck *Check)
+  : LLVMHeaderGuardStyle(Check) {}
+  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+};
+
 struct WithEndifComment : public LLVMHeaderGuardCheck {
   WithEndifComment(StringRef Name, ClangTidyContext *Context)
   : LLVMHeaderGuardCheck(Name, Context) {}
-  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
 };
 
 static std::string
Index: clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
===
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
@@ -0,0 +1,26 @@
+.. title:: clang-tidy - readability-header-guard
+
+readability-header-guard
+
+
+Finds and fixes header guards that do not adhere to a specified style.
+
+Options
+---
+
+.. option:: HeaderFileExtensions
+
+   A comma-separated list of filename extensions of header files (the filename
+   extensions should not include "." prefix). Default is "h,hh,hpp,hxx".
+   For header files without an extension, use an empty string (if there are no
+   other desired extensions) or leave an empty element in the list. E.g.,
+   "h,hh,hpp,hxx," (note the trailing comma).
+
+.. option:: Style
+
+   The name of a header guard style to select. The default is "llvm". Available
+   options are:
+
+   ``llvm``
+
+ Use the LLVM header guard style.
Index: clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
+++ clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
@@ -5,6 +5,10 @@
 
 Finds and fixes header guards that do not adhere to LLVM style.
 
+Note: this check is deprecated, it will be removed in :program:`clang-tidy`
+version 19. Please use the check `readability-header-guard`. with the ``llvm``
+style.
+
 Options
 ---
 
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -337,6 +337,7 @@
`readability-else-after-return `_, "Yes"
`readability-function-cognitive-complexity `_,
`readability-function-size `_,
+   `readability-header-guard `_,
`readability-identifier-length `_,
`readability-identifier-naming `_, "Yes"
`readability-implicit-bool-conversion `_, "Yes"
Index: clang-tools-extra/docs/ReleaseNotes.rst
===
--- clang-tools-extra/docs/ReleaseNo

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-01-26 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 492634.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -1,6 +1,8 @@
 #include "ClangTidyTest.h"
 #include "readability/BracesAroundStatementsCheck.h"
+#include "readability/HeaderGuardCheck.h"
 #include "readability/NamespaceCommentCheck.h"
+#include "readability/PragmaOnceHeaderGuardStyle.h"
 #include "readability/SimplifyBooleanExprCheck.h"
 #include "gtest/gtest.h"
 
@@ -513,6 +515,71 @@
 nullptr, "input.cc", {"-Wno-error=return-type"}));
 }
 
+namespace {
+struct UsePragmaOnceCheck : readability::HeaderGuardCheck {
+  UsePragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+  : HeaderGuardCheck(Name, Context) {}
+
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
+};
+
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(PragmaOnceHeaderGuardStyleTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+runPragmaOnceCheck("void neither();\n", "neither.h",
+   StringRef("use #pragma once")));
+}
+
 } // namespace test
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
+++ clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
@@ -24,3 +24,8 @@
``llvm``
 
  Use the LLVM header guard style.
+
+   ``pragma-once``
+
+ Use ``#pragma once`` instead of macro guards. Note that ``#pragma once``
+ is not part of the C++ standard, and may not work correctly in all cases.
Index: clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
===
--- clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
+++ clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
@@ -33,6 +33,7 @@
 #include "MisplacedArrayIndexCheck.h"
 #include "NamedParameterCheck.h"
 #include "NonConstParameterCheck.h"
+#include "PragmaOnceHeaderGuardStyle.h"
 #include "QualifiedAutoCheck.h"
 #include "Red

[PATCH] D142673: [clang-tidy] Refactor HeaderGuardCheck to add HeaderGuardStyle

2023-01-27 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142673#4086018 , @carlosgalvezp 
wrote:

> Note: I do not have possibility to add code comments - is there some too 
> strict permissions set for this patch? It has not happened to other patches.

I accidentally set the permissions too strict, I've fixed it here and on all my 
other diffs.

> I think the design choice in clang-tidy is that checks from different modules 
> should not depend on each other like this, that's why a common `utils` folder 
> exists.
> What is the difference between `llvm-header-guard` and 
> `readability-header-guard`? Could one be the alias of the other, possibly 
> with some added configuration options?

See the discussion in D142123 . We decided it 
would be best to have a single `readability-header-guard` which can select one 
of several different styles. `llvm-header-guard` temporarily exists as a 
deprecated alias to `readability-header-guard` with the `llvm` style selected, 
and will be removed in a future version.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142673/new/

https://reviews.llvm.org/D142673

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-01-31 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang-tools-extra.
KyleFromKitware added a project: clang-tools-extra.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142991

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidy.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang/include/clang/Basic/DiagnosticFrontendKinds.td

Index: clang/include/clang/Basic/DiagnosticFrontendKinds.td
===
--- clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -180,6 +180,7 @@
   "qualifier 'const' is needed for variables in address space '%0'">;
 
 def note_fixit_applied : Note<"FIX-IT applied suggested code changes">;
+def note_fixit_added_nolint : Note<"FIX-IT added NOLINT to suppress warning">;
 def note_fixit_in_macro : Note<
 "FIX-IT unable to apply suggested code changes in a macro">;
 def note_fixit_failed : Note<
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -138,6 +138,25 @@
 )"),
   cl::init(false), cl::cat(ClangTidyCategory));
 
+static cl::opt FixMode("fix-mode", cl::desc(R"(
+How to fix warnings:
+  - 'fixit' (default) applies fix-it if available
+  - 'nolint' adds a NOLINT comment to suppress the
+warning, prefixed with the value of the
+--nolint-prefix argument
+  - 'fixit-or-nolint' applies fix-it if available,
+otherwise adds a NOLINT comment like the 'nolint'
+option
+)"),
+cl::init("fixit"),
+cl::cat(ClangTidyCategory));
+
+static cl::opt NoLintPrefix("nolint-prefix", cl::desc(R"(
+Prefix to be added to NOLINT comments.
+)"),
+ cl::init(""),
+ cl::cat(ClangTidyCategory));
+
 static cl::opt FormatStyle("format-style", cl::desc(R"(
 Style for formatting code around applied fixes:
   - 'none' (default) turns off formatting
@@ -473,6 +492,19 @@
 return 1;
   }
 
+  FixType Type = FT_FixIt;
+  if (FixMode.getValue() == "fixit")
+Type = FT_FixIt;
+  else if (FixMode.getValue() == "nolint")
+Type = FT_NoLint;
+  else if (FixMode.getValue() == "fixit-or-nolint")
+Type = FT_FixItOrNoLint;
+  else {
+llvm::WithColor::error()
+<< "invalid value for --fix-type: '" << FixMode.getValue() << "'\n";
+return 1;
+  }
+
   llvm::IntrusiveRefCntPtr BaseFS(
   new vfs::OverlayFileSystem(vfs::getRealFileSystem()));
 
@@ -597,9 +629,9 @@
 
   ClangTidyContext Context(std::move(OwningOptionsProvider),
AllowEnablingAnalyzerAlphaCheckers);
-  std::vector Errors =
-  runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS,
-   FixNotes, EnableCheckProfile, ProfilePrefix);
+  std::vector Errors = runClangTidy(
+  Context, OptionsParser->getCompilations(), PathList, BaseFS, FixNotes,
+  Type, NoLintPrefix.getValue(), EnableCheckProfile, ProfilePrefix);
   bool FoundErrors = llvm::any_of(Errors, [](const ClangTidyError &E) {
 return E.DiagLevel == ClangTidyError::Error;
   });
@@ -613,7 +645,7 @@
 
   unsigned WErrorCount = 0;
 
-  handleErrors(Errors, Context, DisableFixes ? FB_NoFix : Behaviour,
+  handleErrors(Errors, Context, DisableFixes ? FB_NoFix : Behaviour, Type,
WErrorCount, BaseFS);
 
   if (!ExportFixes.empty() && !Errors.empty()) {
@@ -623,7 +655,7 @@
   llvm::errs() << "Error opening output file: " << EC.message() << '\n';
   return 1;
 }
-exportReplacements(FilePath.str(), Errors, OS);
+exportReplacements(FilePath.str(), Errors, OS, Type);
   }
 
   if (!Quiet) {
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
===
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -40,6 +40,7 @@
 
   bool IsWarningAsError;
   std::vector EnabledDiagnosticAliases;
+  llvm::StringMap NoLintReplacements;
 };
 
 /// Contains displayed and ignored diagnostic counters for a ClangTidy run.
@@ -240,12 +241,22 @@
   llvm::StringSet<> *OptionsCollector = nullptr;
 };
 
-/// Gets the Fix attached to \p Diagnostic.
+/// Controls how clang-tidy applies fixes.
+enum FixType {
+  /// Onl

[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-01-31 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 493681.
KyleFromKitware added a comment.

Fixed crash when warning doesn't have associated location.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142991/new/

https://reviews.llvm.org/D142991

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidy.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang/include/clang/Basic/DiagnosticFrontendKinds.td

Index: clang/include/clang/Basic/DiagnosticFrontendKinds.td
===
--- clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -180,6 +180,7 @@
   "qualifier 'const' is needed for variables in address space '%0'">;
 
 def note_fixit_applied : Note<"FIX-IT applied suggested code changes">;
+def note_fixit_added_nolint : Note<"FIX-IT added NOLINT to suppress warning">;
 def note_fixit_in_macro : Note<
 "FIX-IT unable to apply suggested code changes in a macro">;
 def note_fixit_failed : Note<
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -138,6 +138,25 @@
 )"),
   cl::init(false), cl::cat(ClangTidyCategory));
 
+static cl::opt FixMode("fix-mode", cl::desc(R"(
+How to fix warnings:
+  - 'fixit' (default) applies fix-it if available
+  - 'nolint' adds a NOLINT comment to suppress the
+warning, prefixed with the value of the
+--nolint-prefix argument
+  - 'fixit-or-nolint' applies fix-it if available,
+otherwise adds a NOLINT comment like the 'nolint'
+option
+)"),
+cl::init("fixit"),
+cl::cat(ClangTidyCategory));
+
+static cl::opt NoLintPrefix("nolint-prefix", cl::desc(R"(
+Prefix to be added to NOLINT comments.
+)"),
+ cl::init(""),
+ cl::cat(ClangTidyCategory));
+
 static cl::opt FormatStyle("format-style", cl::desc(R"(
 Style for formatting code around applied fixes:
   - 'none' (default) turns off formatting
@@ -473,6 +492,19 @@
 return 1;
   }
 
+  FixType Type = FT_FixIt;
+  if (FixMode.getValue() == "fixit")
+Type = FT_FixIt;
+  else if (FixMode.getValue() == "nolint")
+Type = FT_NoLint;
+  else if (FixMode.getValue() == "fixit-or-nolint")
+Type = FT_FixItOrNoLint;
+  else {
+llvm::WithColor::error()
+<< "invalid value for --fix-type: '" << FixMode.getValue() << "'\n";
+return 1;
+  }
+
   llvm::IntrusiveRefCntPtr BaseFS(
   new vfs::OverlayFileSystem(vfs::getRealFileSystem()));
 
@@ -597,9 +629,9 @@
 
   ClangTidyContext Context(std::move(OwningOptionsProvider),
AllowEnablingAnalyzerAlphaCheckers);
-  std::vector Errors =
-  runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS,
-   FixNotes, EnableCheckProfile, ProfilePrefix);
+  std::vector Errors = runClangTidy(
+  Context, OptionsParser->getCompilations(), PathList, BaseFS, FixNotes,
+  Type, NoLintPrefix.getValue(), EnableCheckProfile, ProfilePrefix);
   bool FoundErrors = llvm::any_of(Errors, [](const ClangTidyError &E) {
 return E.DiagLevel == ClangTidyError::Error;
   });
@@ -613,7 +645,7 @@
 
   unsigned WErrorCount = 0;
 
-  handleErrors(Errors, Context, DisableFixes ? FB_NoFix : Behaviour,
+  handleErrors(Errors, Context, DisableFixes ? FB_NoFix : Behaviour, Type,
WErrorCount, BaseFS);
 
   if (!ExportFixes.empty() && !Errors.empty()) {
@@ -623,7 +655,7 @@
   llvm::errs() << "Error opening output file: " << EC.message() << '\n';
   return 1;
 }
-exportReplacements(FilePath.str(), Errors, OS);
+exportReplacements(FilePath.str(), Errors, OS, Type);
   }
 
   if (!Quiet) {
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
===
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -40,6 +40,7 @@
 
   bool IsWarningAsError;
   std::vector EnabledDiagnosticAliases;
+  llvm::StringMap NoLintReplacements;
 };
 
 /// Contains displayed and ignored diagnostic counters for a ClangTidy run.
@@ -240,12 +241,22 @@
   llvm::StringSet<> *OptionsCollector = nullptr;
 };
 
-/// Gets the Fix attached to \p Diagnostic.
+/// Controls how clang-tidy applies fixes.
+enum FixType {
+  /// Only apply fix-its.
+  FT_FixIt,
+  /// Only add NOLINT lines.
+  FT_NoLint,
+  /// Add NOLINT if fix-it is not available.
+  FT_FixItOrNoLint
+};
+
+/// Gets the Fix attached to \p ClangTidyError.
 /// If the

[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-02-01 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 493969.
KyleFromKitware added a comment.

Added tests and fixed assertion error in release build.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142991/new/

https://reviews.llvm.org/D142991

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidy.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
  clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
  clang/include/clang/Basic/DiagnosticFrontendKinds.td

Index: clang/include/clang/Basic/DiagnosticFrontendKinds.td
===
--- clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -180,6 +180,7 @@
   "qualifier 'const' is needed for variables in address space '%0'">;
 
 def note_fixit_applied : Note<"FIX-IT applied suggested code changes">;
+def note_fixit_added_nolint : Note<"FIX-IT added NOLINT to suppress warning">;
 def note_fixit_in_macro : Note<
 "FIX-IT unable to apply suggested code changes in a macro">;
 def note_fixit_failed : Note<
Index: clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
@@ -0,0 +1,16 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-tidy %t.cpp -checks='-*,modernize-use-trailing-return-type,readability-identifier-length' -fix -fix-mode=nolint -nolint-prefix='FIXME: ' -export-fixes=%t.yaml -- > %t.msg 2>&1
+// RUN: FileCheck -input-file=%t.cpp %s
+// RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s
+// RUN: FileCheck -input-file=%t.yaml -check-prefix=CHECK-YAML %s
+
+// CHECK: /* FIXME: NOLINTNEXTLINE(modernize-use-trailing-return-type) */
+// CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+// CHECK-YAML: ReplacementText: "/* FIXME: NOLINTNEXTLINE(modernize-use-trailing-return-type) */\n"
+int func() {
+  // CHECK: /* FIXME: NOLINTNEXTLINE(readability-identifier-length) */
+  // CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+  // CHECK-YAML: ReplacementText: "  /* FIXME: NOLINTNEXTLINE(readability-identifier-length) */\n"
+  int i = 0;
+  return i;
+}
Index: clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
@@ -0,0 +1,17 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-tidy %t.cpp -checks='-*,modernize-use-trailing-return-type,readability-identifier-length' -fix -fix-mode=fixit-or-nolint -export-fixes=%t.yaml -- > %t.msg 2>&1
+// RUN: FileCheck -input-file=%t.cpp %s
+// RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s
+// RUN: FileCheck -input-file=%t.yaml -check-prefix=CHECK-YAML %s
+
+int func() {
+  // CHECK: auto func() -> int {
+  // CHECK-MESSAGES: note: FIX-IT applied suggested code changes
+  // CHECK-YAML: ReplacementText: auto
+  // CHECK-YAML: ReplacementText: ' -> int'
+  // CHECK: /* NOLINTNEXTLINE(readability-identifier-length) */
+  // CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+  // CHECK-YAML: ReplacementText: "  /* NOLINTNEXTLINE(readability-identifier-length) */\n"
+  int i = 0;
+  return i;
+}
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -138,6 +138,25 @@
 )"),
   cl::init(false), cl::cat(ClangTidyCategory));
 
+static cl::opt FixMode("fix-mode", cl::desc(R"(
+How to fix warnings:
+  - 'fixit' (default) applies fix-it if available
+  - 'nolint' adds a NOLINT comment to suppress the
+warning, prefixed with the value of the
+--nolint-prefix argument
+  - 'fixit-or-nolint' applies fix-it if available,
+otherwise adds a NOLINT comment like the 'nolint'
+option
+)"),
+cl::init("fixit"),
+cl::cat(ClangTidyCategory));
+
+static cl::opt NoLintPrefix("nolint-prefix", cl::desc(R"(
+Prefix to be added to NOLINT comments.
+)"),
+ cl::init(""),
+ cl::cat(ClangTidyCategory));
+
 static cl::opt FormatStyle("format-style", cl::desc(R"(
 Style for formatting code around applied fixes:
   - 'none' (default) turns off formatting
@@ -473,6 +492,19 @@
 return 1;
   }
 
+  FixType Type = FT_FixIt;
+  if (FixMode.getValue() == "fixit")
+Typ

[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-02-01 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang.
KyleFromKitware added a project: clang.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

And fix a few corner cases in which it returns the wrong answer.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143099

Files:
  clang/include/clang/Lex/Lexer.h
  clang/lib/Lex/Lexer.cpp
  clang/unittests/Lex/LexerTest.cpp


Index: clang/unittests/Lex/LexerTest.cpp
===
--- clang/unittests/Lex/LexerTest.cpp
+++ clang/unittests/Lex/LexerTest.cpp
@@ -660,4 +660,20 @@
   }
   EXPECT_TRUE(ToksView.empty());
 }
+
+TEST_F(LexerTest, FindBeginningOfLine) {
+  auto FindBeginningOfLineOffset = [](StringRef Buffer, unsigned int Offset) 
-> int {
+return Lexer::findBeginningOfLine(Buffer, Offset) - Buffer.data();
+  };
+
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 3), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 0), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 13), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 12), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 11), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\\\nint func2();", 14), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\r\nint func2();", 13), 14);
+  EXPECT_EQ(FindBeginningOfLineOffset("\nint func();", 4), 1);
+  EXPECT_EQ(FindBeginningOfLineOffset("\\\nint func();", 5), 0);
+}
 } // anonymous namespace
Index: clang/lib/Lex/Lexer.cpp
===
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp
@@ -492,19 +492,22 @@
 
 /// Returns the pointer that points to the beginning of line that contains
 /// the given offset, or null if the offset if invalid.
-static const char *findBeginningOfLine(StringRef Buffer, unsigned Offset) {
+const char *Lexer::findBeginningOfLine(StringRef Buffer, unsigned Offset) {
   const char *BufStart = Buffer.data();
   if (Offset >= Buffer.size())
 return nullptr;
 
   const char *LexStart = BufStart + Offset;
-  for (; LexStart != BufStart; --LexStart) {
+  while (true) {
 if (isVerticalWhitespace(LexStart[0]) &&
 !Lexer::isNewLineEscaped(BufStart, LexStart)) {
   // LexStart should point at first character of logical line.
   ++LexStart;
   break;
 }
+if (LexStart == BufStart)
+  break;
+--LexStart;
   }
   return LexStart;
 }
@@ -525,7 +528,7 @@
   // Back up from the current location until we hit the beginning of a line
   // (or the buffer). We'll relex from that point.
   const char *StrData = Buffer.data() + LocInfo.second;
-  const char *LexStart = findBeginningOfLine(Buffer, LocInfo.second);
+  const char *LexStart = Lexer::findBeginningOfLine(Buffer, LocInfo.second);
   if (!LexStart || LexStart == StrData)
 return Loc;
 
Index: clang/include/clang/Lex/Lexer.h
===
--- clang/include/clang/Lex/Lexer.h
+++ clang/include/clang/Lex/Lexer.h
@@ -595,6 +595,10 @@
   static StringRef getIndentationForLine(SourceLocation Loc,
  const SourceManager &SM);
 
+  /// Returns the pointer that points to the beginning of line that contains
+  /// the given offset, or null if the offset if invalid.
+  static const char *findBeginningOfLine(StringRef Buffer, unsigned Offset);
+
   /// Check if this is the first time we're lexing the input file.
   bool isFirstTimeLexingFile() const { return IsFirstTimeLexingFile; }
 


Index: clang/unittests/Lex/LexerTest.cpp
===
--- clang/unittests/Lex/LexerTest.cpp
+++ clang/unittests/Lex/LexerTest.cpp
@@ -660,4 +660,20 @@
   }
   EXPECT_TRUE(ToksView.empty());
 }
+
+TEST_F(LexerTest, FindBeginningOfLine) {
+  auto FindBeginningOfLineOffset = [](StringRef Buffer, unsigned int Offset) -> int {
+return Lexer::findBeginningOfLine(Buffer, Offset) - Buffer.data();
+  };
+
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 3), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 0), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 13), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 12), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 11), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\\\nint func2();", 14), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\r\nint func2();", 13), 14);
+  EXPECT_EQ(FindBeginningOfLineOffset("\nint func();", 4), 1);
+  EXPECT_EQ(FindBeginningOfLineOffset("\\\nint func();", 5), 0);
+}
 } // anonymous namespace
Index: clang/lib/Lex/Lexer.cpp
===
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp

[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-02-01 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494031.
KyleFromKitware added a comment.

Rebased onto D143099 .


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142991/new/

https://reviews.llvm.org/D142991

Files:
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidy.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
  clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
  clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
  clang/include/clang/Basic/DiagnosticFrontendKinds.td

Index: clang/include/clang/Basic/DiagnosticFrontendKinds.td
===
--- clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -180,6 +180,7 @@
   "qualifier 'const' is needed for variables in address space '%0'">;
 
 def note_fixit_applied : Note<"FIX-IT applied suggested code changes">;
+def note_fixit_added_nolint : Note<"FIX-IT added NOLINT to suppress warning">;
 def note_fixit_in_macro : Note<
 "FIX-IT unable to apply suggested code changes in a macro">;
 def note_fixit_failed : Note<
Index: clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-nolint.cpp
@@ -0,0 +1,18 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-tidy %t.cpp -checks='-*,modernize-use-trailing-return-type,readability-identifier-length' -fix -fix-mode=nolint -nolint-prefix='FIXME: ' -export-fixes=%t.yaml -- > %t.msg 2>&1
+// RUN: FileCheck -input-file=%t.cpp %s
+// RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s
+// RUN: FileCheck -input-file=%t.yaml -check-prefix=CHECK-YAML %s
+
+// CHECK: /* FIXME: NOLINTNEXTLINE(modernize-use-trailing-return-type) */
+// CHECK-NEXT: int func() {
+// CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+// CHECK-YAML: ReplacementText: "/* FIXME: NOLINTNEXTLINE(modernize-use-trailing-return-type) */\n"
+int func() {
+  // CHECK: /* FIXME: NOLINTNEXTLINE(readability-identifier-length) */
+  // CHECK-NEXT: int i = 0;
+  // CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+  // CHECK-YAML: ReplacementText: "  /* FIXME: NOLINTNEXTLINE(readability-identifier-length) */\n"
+  int i = 0;
+  return i;
+}
Index: clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/fix-mode-fixit-or-nolint.cpp
@@ -0,0 +1,18 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-tidy %t.cpp -checks='-*,modernize-use-trailing-return-type,readability-identifier-length' -fix -fix-mode=fixit-or-nolint -export-fixes=%t.yaml -- > %t.msg 2>&1
+// RUN: FileCheck -input-file=%t.cpp %s
+// RUN: FileCheck -input-file=%t.msg -check-prefix=CHECK-MESSAGES %s
+// RUN: FileCheck -input-file=%t.yaml -check-prefix=CHECK-YAML %s
+
+int func() {
+  // CHECK: auto func() -> int {
+  // CHECK-MESSAGES: note: FIX-IT applied suggested code changes
+  // CHECK-YAML: ReplacementText: auto
+  // CHECK-YAML: ReplacementText: ' -> int'
+  // CHECK: /* NOLINTNEXTLINE(readability-identifier-length) */
+  // CHECK-NEXT: int i = 0;
+  // CHECK-MESSAGES: note: FIX-IT added NOLINT to suppress warning
+  // CHECK-YAML: ReplacementText: "  /* NOLINTNEXTLINE(readability-identifier-length) */\n"
+  int i = 0;
+  return i;
+}
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -138,6 +138,25 @@
 )"),
   cl::init(false), cl::cat(ClangTidyCategory));
 
+static cl::opt FixMode("fix-mode", cl::desc(R"(
+How to fix warnings:
+  - 'fixit' (default) applies fix-it if available
+  - 'nolint' adds a NOLINT comment to suppress the
+warning, prefixed with the value of the
+--nolint-prefix argument
+  - 'fixit-or-nolint' applies fix-it if available,
+otherwise adds a NOLINT comment like the 'nolint'
+option
+)"),
+cl::init("fixit"),
+cl::cat(ClangTidyCategory));
+
+static cl::opt NoLintPrefix("nolint-prefix", cl::desc(R"(
+Prefix to be added to NOLINT comments.
+)"),
+ cl::init(""),
+ cl::cat(ClangTidyCategory));
+
 static cl::opt FormatStyle("format-style", cl::desc(R"(
 Style for formatting code around applied fixes:
   - 'none' (default) turns off formatting
@@ -473,6 +492,19 @@
 ret

[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-02-01 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494036.
KyleFromKitware added a comment.

Fixed formatting.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143099/new/

https://reviews.llvm.org/D143099

Files:
  clang/include/clang/Lex/Lexer.h
  clang/lib/Lex/Lexer.cpp
  clang/unittests/Lex/LexerTest.cpp


Index: clang/unittests/Lex/LexerTest.cpp
===
--- clang/unittests/Lex/LexerTest.cpp
+++ clang/unittests/Lex/LexerTest.cpp
@@ -660,4 +660,21 @@
   }
   EXPECT_TRUE(ToksView.empty());
 }
+
+TEST_F(LexerTest, FindBeginningOfLine) {
+  auto FindBeginningOfLineOffset = [](StringRef Buffer,
+  unsigned int Offset) -> int {
+return Lexer::findBeginningOfLine(Buffer, Offset) - Buffer.data();
+  };
+
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 3), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 0), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 13), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 12), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 11), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\\\nint func2();", 14), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\r\nint func2();", 13), 14);
+  EXPECT_EQ(FindBeginningOfLineOffset("\nint func();", 4), 1);
+  EXPECT_EQ(FindBeginningOfLineOffset("\\\nint func();", 5), 0);
+}
 } // anonymous namespace
Index: clang/lib/Lex/Lexer.cpp
===
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp
@@ -492,19 +492,22 @@
 
 /// Returns the pointer that points to the beginning of line that contains
 /// the given offset, or null if the offset if invalid.
-static const char *findBeginningOfLine(StringRef Buffer, unsigned Offset) {
+const char *Lexer::findBeginningOfLine(StringRef Buffer, unsigned Offset) {
   const char *BufStart = Buffer.data();
   if (Offset >= Buffer.size())
 return nullptr;
 
   const char *LexStart = BufStart + Offset;
-  for (; LexStart != BufStart; --LexStart) {
+  while (true) {
 if (isVerticalWhitespace(LexStart[0]) &&
 !Lexer::isNewLineEscaped(BufStart, LexStart)) {
   // LexStart should point at first character of logical line.
   ++LexStart;
   break;
 }
+if (LexStart == BufStart)
+  break;
+--LexStart;
   }
   return LexStart;
 }
@@ -525,7 +528,7 @@
   // Back up from the current location until we hit the beginning of a line
   // (or the buffer). We'll relex from that point.
   const char *StrData = Buffer.data() + LocInfo.second;
-  const char *LexStart = findBeginningOfLine(Buffer, LocInfo.second);
+  const char *LexStart = Lexer::findBeginningOfLine(Buffer, LocInfo.second);
   if (!LexStart || LexStart == StrData)
 return Loc;
 
Index: clang/include/clang/Lex/Lexer.h
===
--- clang/include/clang/Lex/Lexer.h
+++ clang/include/clang/Lex/Lexer.h
@@ -595,6 +595,10 @@
   static StringRef getIndentationForLine(SourceLocation Loc,
  const SourceManager &SM);
 
+  /// Returns the pointer that points to the beginning of line that contains
+  /// the given offset, or null if the offset if invalid.
+  static const char *findBeginningOfLine(StringRef Buffer, unsigned Offset);
+
   /// Check if this is the first time we're lexing the input file.
   bool isFirstTimeLexingFile() const { return IsFirstTimeLexingFile; }
 


Index: clang/unittests/Lex/LexerTest.cpp
===
--- clang/unittests/Lex/LexerTest.cpp
+++ clang/unittests/Lex/LexerTest.cpp
@@ -660,4 +660,21 @@
   }
   EXPECT_TRUE(ToksView.empty());
 }
+
+TEST_F(LexerTest, FindBeginningOfLine) {
+  auto FindBeginningOfLineOffset = [](StringRef Buffer,
+  unsigned int Offset) -> int {
+return Lexer::findBeginningOfLine(Buffer, Offset) - Buffer.data();
+  };
+
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 3), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func();", 0), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 13), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 12), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 11), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\\\nint func2();", 14), 0);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\r\nint func2();", 13), 14);
+  EXPECT_EQ(FindBeginningOfLineOffset("\nint func();", 4), 1);
+  EXPECT_EQ(FindBeginningOfLineOffset("\\\nint func();", 5), 0);
+}
 } // anonymous namespace
Index: clang/lib/Lex/Lexer.cpp
===
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp
@@ -492,19 +492,22 @@
 
 /// Returns the pointer that points to the beginning of line that con

[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-02-02 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added inline comments.



Comment at: clang/lib/Lex/Lexer.cpp:493-494
 
 /// Returns the pointer that points to the beginning of line that contains
 /// the given offset, or null if the offset if invalid.
+const char *Lexer::findBeginningOfLine(StringRef Buffer, unsigned Offset) {

cor3ntin wrote:
> Should we remove the comment here?
Other `Lexer` methods follow a similar pattern of having doc comments both in 
the header and in the implementation. I think we can leave it.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143099/new/

https://reviews.llvm.org/D143099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

@aaron.ballman @njames93 could you guys please take another look at this?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142465: [clang][lex] Consolidate PPCallbacks::PragmaDirective parameters

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494644.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142465/new/

https://reviews.llvm.org/D142465

Files:
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
  clang/include/clang/Lex/PPCallbacks.h
  clang/lib/Lex/Pragma.cpp

Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -166,7 +166,7 @@
 /// rest of the pragma, passing it to the registered pragma handlers.
 void Preprocessor::HandlePragmaDirective(PragmaIntroducer Introducer) {
   if (Callbacks)
-Callbacks->PragmaDirective(Introducer.Loc, Introducer.Kind);
+Callbacks->PragmaDirective(Introducer);
 
   if (!PragmasEnabled)
 return;
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -193,9 +193,7 @@
   }
 
   /// Callback invoked when start reading any pragma directive.
-  virtual void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) {
-  }
+  virtual void PragmaDirective(PragmaIntroducer Introducer) {}
 
   /// Callback invoked when a \#pragma comment directive is read.
   virtual void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
@@ -511,10 +509,9 @@
 Second->Ident(Loc, str);
   }
 
-  void PragmaDirective(SourceLocation Loc,
-   PragmaIntroducerKind Introducer) override {
-First->PragmaDirective(Loc, Introducer);
-Second->PragmaDirective(Loc, Introducer);
+  void PragmaDirective(PragmaIntroducer Introducer) override {
+First->PragmaDirective(Introducer);
+Second->PragmaDirective(Introducer);
   }
 
   void PragmaComment(SourceLocation Loc, const IdentifierInfo *Kind,
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -6,24 +6,21 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
 // CHECK-NEXT:   State: 0
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -18,72 +18,61 @@
 
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1"
-// CHECK-NEXT:   Introducer: PIK_HashPragma
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
-// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1"
-// CH

[PATCH] D142030: [pp-trace] Print HashLoc/Introducer parameter

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494646.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-ident.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
  clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-opencl.cpp
@@ -8,6 +8,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:26"
 // CHECK-NEXT:   Name: all
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:3:32"
@@ -15,6 +16,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:4:54"
@@ -22,6 +24,7 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaOpenCLExtension
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   NameLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:26"
 // CHECK-NEXT:   Name: cl_khr_int64_base_atomics
 // CHECK-NEXT:   StateLoc: "{{.*}}{{[/\\]}}pp-trace-pragma-opencl.cpp:5:54"
Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -20,36 +20,42 @@
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:3:9"
 // CHECK-NEXT:   Kind: compiler
 // CHECK-NEXT:   Str: compiler comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:4:9"
 // CHECK-NEXT:   Kind: exestr
 // CHECK-NEXT:   Str: exestr comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:5:9"
 // CHECK-NEXT:   Kind: lib
 // CHECK-NEXT:   Str: lib comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:6:9"
 // CHECK-NEXT:   Kind: linker
 // CHECK-NEXT:   Str: linker comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT: - Callback: PragmaComment
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:7:9"
 // CHECK-NEXT:   Kind: user
 // CHECK-NEXT:   Str: user comment
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:9

[PATCH] D142470: [clang][lex] Add PragmaOnce callback to PPCallbacks

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494647.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142470/new/

https://reviews.llvm.org/D142470

Files:
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/Lex/Pragma.cpp


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,8 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer,
+Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +417,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +995,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(PragmaIntroducer Introducer, Token &MarkTok);
   void HandlePragmaPoison();
   void HandlePragmaSystemHeader(Token &SysHeaderTok);
Index: clang/include/clang/Lex/PPCallbacks.h
===
--- clang/include/clang/Lex/PPCallbacks.h
+++ clang/include/clang/Lex/PPCallbacks.h
@@ -305,6 +305,9 @@
   virtual void PragmaAssumeNonNullEnd(PragmaIntroducer Introducer,
   SourceLocation Loc) {}
 
+  /// Callback invoked when a \#pragma once directive is read.
+  virtual void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) {}
+
   /// Called by Preprocessor::HandleMacroExpandedIdentifier when a
   /// macro invocation is found.
   virtual void MacroExpands(const Token &MacroNameTok,
@@ -627,6 +630,11 @@
 Second->PragmaAssumeNonNullEnd(Introducer, Loc);
   }
 
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override {
+First->PragmaOnce(Introducer, Loc);
+Second->PragmaOnce(Introducer, Loc);
+  }
+
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override {
 First->MacroExpands(MacroNameTok, MD, Range, Args);


Index: clang/lib/Lex/Pragma.cpp
===
--- clang/lib/Lex/Pragma.cpp
+++ clang/lib/Lex/Pragma.cpp
@@ -403,7 +403,8 @@
 }
 
 /// HandlePragmaOnce - Handle \#pragma once.  OnceTok is the 'once'.
-void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
+void Preprocessor::HandlePragmaOnce(PragmaIntroducer Introducer,
+Token &OnceTok) {
   // Don't honor the 'once' when handling the primary source file, unless
   // this is a prefix to a TU, which indicates we're generating a PCH file, or
   // when the main file is a header (e.g. when -xc-header is provided on the
@@ -416,6 +417,9 @@
   // Get the current file lexer we're looking at.  Ignore _Pragma 'files' etc.
   // Mark the file as a once-only file now.
   HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
+
+  if (Callbacks)
+Callbacks->PragmaOnce(Introducer, OnceTok.getLocation());
 }
 
 void Preprocessor::HandlePragmaMark(PragmaIntroducer Introducer,
@@ -991,7 +995,7 @@
   void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
 Token &OnceTok) override {
 PP.CheckEndOfDirective("pragma once");
-PP.HandlePragmaOnce(OnceTok);
+PP.HandlePragmaOnce(Introducer, OnceTok);
   }
 };
 
Index: clang/include/clang/Lex/Preprocessor.h
===
--- clang/include/clang/Lex/Preprocessor.h
+++ clang/include/clang/Lex/Preprocessor.h
@@ -2615,7 +2615,7 @@
   void HandlePragmaDirective(PragmaIntroducer Introducer);
 
 public:
-  void HandlePragmaOnce(Token &OnceTok);
+  void HandlePragmaOnce(PragmaIntroducer Introducer, Token &OnceTok);
   void HandlePragmaMark(Pragma

[PATCH] D142471: [pp-trace] Add PragmaOnce callback

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494648.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142471/new/

https://reviews.llvm.org/D142471

Files:
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck 
--strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' 
-extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: 
"{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  StringRef Str) override;
   void PragmaExecCharsetPop(PragmaIntroducer Introducer,
 SourceLocation Loc) override;
+  void PragmaOnce(PragmaIntroducer Introducer, SourceLocation Loc) override;
   void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD,
 SourceRange Range, const MacroArgs *Args) override;
   void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
@@ -337,6 +337,14 @@
   appendArgument("Loc", Loc);
 }
 
+/// Callback invoked when a \#pragma once directive is read.
+void PPCallbacksTracker::PragmaOnce(PragmaIntroducer Introducer,
+SourceLocation Loc) {
+  beginCallback("PragmaOnce");
+  appendArgument("Introducer", Introducer);
+  appendArgument("Loc", Loc);
+}
+
 // Called by Preprocessor::HandleMacroExpandedIdentifier when a
 // macro invocation is found.
 void PPCallbacksTracker::MacroExpands(const Token &MacroNameTok,


Index: clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-pragma-general.cpp
@@ -1,4 +1,4 @@
-// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' %s -- | FileCheck --strict-whitespace %s
+// RUN: pp-trace -callbacks '*,-FileChanged,-MacroDefined' -extra-arg-before=-xc++-header %s -- | FileCheck --strict-whitespace %s
 
 #pragma clang diagnostic push
 #pragma clang diagnostic pop
@@ -19,6 +19,8 @@
 { }
 }
 
+#pragma once
+
 // CHECK: ---
 // CHECK-NEXT: - Callback: PragmaDirective
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:3:1", Kind: PIK_HashPragma}
@@ -114,5 +116,10 @@
 // CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:1", Kind: PIK_HashPragma}
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:18:23"
 // CHECK-NEXT:   DebugType: captured
+// CHECK-NEXT: - Callback: PragmaDirective
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT: - Callback: PragmaOnce
+// CHECK-NEXT:   Introducer: {Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:1", Kind: PIK_HashPragma}
+// CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-general.cpp:22:9"
 // CHECK-NEXT: - Callback: EndOfMainFile
 // CHECK-NEXT: ...
Index: clang-tools-extra/pp-trace/PPCallbacksTracker.h
===
--- clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -135,6 +135,7 @@
  

[PATCH] D142673: [clang-tidy] Refactor HeaderGuardCheck to add HeaderGuardStyle

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494649.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142673/new/

https://reviews.llvm.org/D142673

Files:
  clang-tools-extra/clang-tidy/ClangTidyModule.h
  clang-tools-extra/clang-tidy/llvm/CMakeLists.txt
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
@@ -3,6 +3,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/HeaderGuardCheck.h"
+#include "llvm/HeaderGuardStyle.h"
 #include "llvm/IncludeOrderCheck.h"
 #include "gtest/gtest.h"
 #include 
@@ -49,10 +50,18 @@
 }
 
 namespace {
+struct WithEndifCommentStyle : public LLVMHeaderGuardStyle {
+  WithEndifCommentStyle(readability::HeaderGuardCheck *Check)
+  : LLVMHeaderGuardStyle(Check) {}
+  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+};
+
 struct WithEndifComment : public LLVMHeaderGuardCheck {
   WithEndifComment(StringRef Name, ClangTidyContext *Context)
   : LLVMHeaderGuardCheck(Name, Context) {}
-  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
 };
 
 static std::string
Index: clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
===
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
@@ -0,0 +1,26 @@
+.. title:: clang-tidy - readability-header-guard
+
+readability-header-guard
+
+
+Finds and fixes header guards that do not adhere to a specified style.
+
+Options
+---
+
+.. option:: HeaderFileExtensions
+
+   A comma-separated list of filename extensions of header files (the filename
+   extensions should not include "." prefix). Default is "h,hh,hpp,hxx".
+   For header files without an extension, use an empty string (if there are no
+   other desired extensions) or leave an empty element in the list. E.g.,
+   "h,hh,hpp,hxx," (note the trailing comma).
+
+.. option:: Style
+
+   The name of a header guard style to select. The default is "llvm". Available
+   options are:
+
+   ``llvm``
+
+ Use the LLVM header guard style.
Index: clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
+++ clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
@@ -5,6 +5,10 @@
 
 Finds and fixes header guards that do not adhere to LLVM style.
 
+Note: this check is deprecated, it will be removed in :program:`clang-tidy`
+version 19. Please use the check `readability-header-guard`. with the ``llvm``
+style.
+
 Options
 ---
 
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -339,6 +339,7 @@
`readability-else-after-return `_, "Yes"
`readability-function-cognitive-complexity `_,
`readability-function-size `_,
+   `readability-header-guard `_,
`readability-identifier-length `_,
`readability-identifier-naming `_, "Yes"
`readability-implicit-bool-conversion `_, "Yes"
Index: clang-tools-extra/docs/ReleaseNotes.rst
===
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -110,6 +110,11 @@
 
   Warns when lambda specify a 

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494650.
KyleFromKitware added a comment.

Updated with review feedback.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -1,6 +1,8 @@
 #include "ClangTidyTest.h"
 #include "readability/BracesAroundStatementsCheck.h"
+#include "readability/HeaderGuardCheck.h"
 #include "readability/NamespaceCommentCheck.h"
+#include "readability/PragmaOnceHeaderGuardStyle.h"
 #include "readability/SimplifyBooleanExprCheck.h"
 #include "gtest/gtest.h"
 
@@ -513,6 +515,97 @@
 nullptr, "input.cc", {"-Wno-error=return-type"}));
 }
 
+namespace {
+struct UsePragmaOnceCheck : readability::HeaderGuardCheck {
+  UsePragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+  : HeaderGuardCheck(Name, Context) {}
+
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
+};
+
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(PragmaOnceHeaderGuardStyleTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuardValue();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_VALUE_H\n"
+   "#define HEADER_GUARD_VALUE_H \\\n"
+   "1\n"
+   "\n"
+   "void headerGuardValue();\n"
+   "\n"
+   "#endif\n",
+   "header-guard-value.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+"#define DEFINED_HEADER_GUARD_H\n"
+"\n"
+"void definedHeaderGuard();\n"
+"\n"
+"#endif\n",
+runPragmaOnceCheck("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+   "#define DEFINED_HEADER_GUARD_H\n"
+   "\n"
+   "void definedHeaderGuard();\n"
+   "\n"
+   "#endif\n",
+   "defined-header-guard.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added inline comments.



Comment at: 
clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp:569-571
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"

aaron.ballman wrote:
> How about a test for:
> ```
> #if !defined(HEADER_GUARD_H)
> #define HEADER_GUARD_H 1
> 
> #endif
> ```
> and a test for what happens when there's no header guard or pragma once in 
> the file.
> How about a test for:
> ```
> #if !defined(HEADER_GUARD_H)
> #define HEADER_GUARD_H 1
> 
> #endif
> ```

Good catch. The case of `!defined()` was not being handled by the existing 
header guard check except to basically ignore it. The `#pragma once` check 
crashed on this case. I've updated it to also ignore the `!defined()` case.

> and a test for what happens when there's no header guard or pragma once in 
> the file.

I already have this, see the "neither" test at the bottom.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494652.
KyleFromKitware added a comment.

Updated documentation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -1,6 +1,8 @@
 #include "ClangTidyTest.h"
 #include "readability/BracesAroundStatementsCheck.h"
+#include "readability/HeaderGuardCheck.h"
 #include "readability/NamespaceCommentCheck.h"
+#include "readability/PragmaOnceHeaderGuardStyle.h"
 #include "readability/SimplifyBooleanExprCheck.h"
 #include "gtest/gtest.h"
 
@@ -513,6 +515,97 @@
 nullptr, "input.cc", {"-Wno-error=return-type"}));
 }
 
+namespace {
+struct UsePragmaOnceCheck : readability::HeaderGuardCheck {
+  UsePragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+  : HeaderGuardCheck(Name, Context) {}
+
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
+};
+
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(PragmaOnceHeaderGuardStyleTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuardValue();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_VALUE_H\n"
+   "#define HEADER_GUARD_VALUE_H \\\n"
+   "1\n"
+   "\n"
+   "void headerGuardValue();\n"
+   "\n"
+   "#endif\n",
+   "header-guard-value.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+"#define DEFINED_HEADER_GUARD_H\n"
+"\n"
+"void definedHeaderGuard();\n"
+"\n"
+"#endif\n",
+runPragmaOnceCheck("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+   "#define DEFINED_HEADER_GUARD_H\n"
+   "\n"
+   "void definedHeaderGuard();\n"
+   "\n"
+   "#endif\n",
+   "defined-header-guard.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+   

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494653.
KyleFromKitware added a comment.

Removed comma from documentation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/readability/PragmaOnceHeaderGuardStyle.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ReadabilityModuleTest.cpp
@@ -1,6 +1,8 @@
 #include "ClangTidyTest.h"
 #include "readability/BracesAroundStatementsCheck.h"
+#include "readability/HeaderGuardCheck.h"
 #include "readability/NamespaceCommentCheck.h"
+#include "readability/PragmaOnceHeaderGuardStyle.h"
 #include "readability/SimplifyBooleanExprCheck.h"
 #include "gtest/gtest.h"
 
@@ -513,6 +515,97 @@
 nullptr, "input.cc", {"-Wno-error=return-type"}));
 }
 
+namespace {
+struct UsePragmaOnceCheck : readability::HeaderGuardCheck {
+  UsePragmaOnceCheck(StringRef Name, ClangTidyContext *Context)
+  : HeaderGuardCheck(Name, Context) {}
+
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
+};
+
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(PragmaOnceHeaderGuardStyleTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuardValue();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_VALUE_H\n"
+   "#define HEADER_GUARD_VALUE_H \\\n"
+   "1\n"
+   "\n"
+   "void headerGuardValue();\n"
+   "\n"
+   "#endif\n",
+   "header-guard-value.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+"#define DEFINED_HEADER_GUARD_H\n"
+"\n"
+"void definedHeaderGuard();\n"
+"\n"
+"#endif\n",
+runPragmaOnceCheck("#if !defined(DEFINED_HEADER_GUARD_H)\n"
+   "#define DEFINED_HEADER_GUARD_H\n"
+   "\n"
+   "void definedHeaderGuard();\n"
+   "\n"
+   "#endif\n",
+   "defined-header-guard.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n

[PATCH] D142123: [clang-tidy] Add header guard style to suggest use of #pragma once

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

CI on all seven commits in this stack looks good.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142673: [clang-tidy] Refactor HeaderGuardCheck to add HeaderGuardStyle

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 494675.
KyleFromKitware added a comment.

Added virtual destructor to `HeaderGuardStyle`.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142673/new/

https://reviews.llvm.org/D142673

Files:
  clang-tools-extra/clang-tidy/ClangTidyModule.h
  clang-tools-extra/clang-tidy/llvm/CMakeLists.txt
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/llvm/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp
  clang-tools-extra/clang-tidy/readability/CMakeLists.txt
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.cpp
  clang-tools-extra/clang-tidy/readability/HeaderGuardCheck.h
  clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuardStyle.h
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.cpp
  clang-tools-extra/clang-tidy/utils/MacroHeaderGuardStyle.h
  clang-tools-extra/docs/ReleaseNotes.rst
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
  clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
  clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp
@@ -3,6 +3,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/HeaderGuardCheck.h"
+#include "llvm/HeaderGuardStyle.h"
 #include "llvm/IncludeOrderCheck.h"
 #include "gtest/gtest.h"
 #include 
@@ -49,10 +50,18 @@
 }
 
 namespace {
+struct WithEndifCommentStyle : public LLVMHeaderGuardStyle {
+  WithEndifCommentStyle(readability::HeaderGuardCheck *Check)
+  : LLVMHeaderGuardStyle(Check) {}
+  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+};
+
 struct WithEndifComment : public LLVMHeaderGuardCheck {
   WithEndifComment(StringRef Name, ClangTidyContext *Context)
   : LLVMHeaderGuardCheck(Name, Context) {}
-  bool shouldSuggestEndifComment(StringRef Filename) override { return true; }
+  std::unique_ptr createHeaderGuardStyle() override {
+return std::make_unique(this);
+  }
 };
 
 static std::string
Index: clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
===
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/readability/header-guard.rst
@@ -0,0 +1,26 @@
+.. title:: clang-tidy - readability-header-guard
+
+readability-header-guard
+
+
+Finds and fixes header guards that do not adhere to a specified style.
+
+Options
+---
+
+.. option:: HeaderFileExtensions
+
+   A comma-separated list of filename extensions of header files (the filename
+   extensions should not include "." prefix). Default is "h,hh,hpp,hxx".
+   For header files without an extension, use an empty string (if there are no
+   other desired extensions) or leave an empty element in the list. E.g.,
+   "h,hh,hpp,hxx," (note the trailing comma).
+
+.. option:: Style
+
+   The name of a header guard style to select. The default is "llvm". Available
+   options are:
+
+   ``llvm``
+
+ Use the LLVM header guard style.
Index: clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
+++ clang-tools-extra/docs/clang-tidy/checks/llvm/header-guard.rst
@@ -5,6 +5,10 @@
 
 Finds and fixes header guards that do not adhere to LLVM style.
 
+Note: this check is deprecated, it will be removed in :program:`clang-tidy`
+version 19. Please use the check `readability-header-guard`. with the ``llvm``
+style.
+
 Options
 ---
 
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -339,6 +339,7 @@
`readability-else-after-return `_, "Yes"
`readability-function-cognitive-complexity `_,
`readability-function-size `_,
+   `readability-header-guard `_,
`readability-identifier-length `_,
`readability-identifier-naming `_, "Yes"
`readability-implicit-bool-conversion `_, "Yes"
Index: clang-tools-extra/docs/ReleaseNotes.rst
===
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools

[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

I just tried this out on a somewhat larger scale - I built all of CMake with 
this flag enabled, and it found a number of clang-tidy violations and added 
`NOLINT` comments to silence them. Worked like a charm.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142991/new/

https://reviews.llvm.org/D142991

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142991: [clang-tidy] Add --fix-mode and --nolint-prefix options

2023-02-03 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

Though I did find that it inserted more than one `NOLINT` comment for a 
templated function, probably due to multiple warnings being issued for the same 
violation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142991/new/

https://reviews.llvm.org/D142991

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D141961: [clang][lex] Pass hash location to more PPCallbacks methods

2023-01-17 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
Herald added subscribers: kadircet, carlosgalvezp, shchenz, arphaman, kbarton, 
nemanjai.
Herald added a reviewer: ributzka.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a reviewer: dang.
Herald added projects: clang, clang-tools-extra.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141961

Files:
  clang-tools-extra/clang-include-fixer/find-all-symbols/FindAllMacros.cpp
  clang-tools-extra/clang-include-fixer/find-all-symbols/FindAllMacros.h
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/bugprone/MacroParenthesesCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp
  clang-tools-extra/clang-tidy/google/UpgradeGoogletestCaseCheck.cpp
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/clang-tidy/readability/DuplicateIncludeCheck.cpp
  clang-tools-extra/clang-tidy/readability/ElseAfterReturnCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantPreprocessorCheck.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
  clang-tools-extra/clangd/CollectMacros.h
  clang-tools-extra/clangd/Preamble.cpp
  clang-tools-extra/include-cleaner/lib/Record.cpp
  clang-tools-extra/modularize/PreprocessorTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/PPConditionalDirectiveRecord.h
  clang/include/clang/Lex/PreprocessingRecord.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/CodeGen/MacroPPCallbacks.cpp
  clang/lib/CodeGen/MacroPPCallbacks.h
  clang/lib/ExtractAPI/ExtractAPIConsumer.cpp
  clang/lib/Frontend/ASTUnit.cpp
  clang/lib/Frontend/PrintPreprocessedOutput.cpp
  clang/lib/Frontend/Rewrite/InclusionRewriter.cpp
  clang/lib/Index/IndexingAction.cpp
  clang/lib/Lex/PPConditionalDirectiveRecord.cpp
  clang/lib/Lex/PPDirectives.cpp
  clang/lib/Lex/PreprocessingRecord.cpp
  clang/tools/libclang/Indexing.cpp
  clang/unittests/Basic/SourceManagerTest.cpp
  clang/unittests/Lex/PPCallbacksTest.cpp

Index: clang/unittests/Lex/PPCallbacksTest.cpp
===
--- clang/unittests/Lex/PPCallbacksTest.cpp
+++ clang/unittests/Lex/PPCallbacksTest.cpp
@@ -75,13 +75,15 @@
 
   std::vector Results;
 
-  void If(SourceLocation Loc, SourceRange ConditionRange,
+  void If(SourceLocation HashLoc, SourceLocation Loc,
+  SourceRange ConditionRange,
   ConditionValueKind ConditionValue) override {
 Results.emplace_back(ConditionRange, ConditionValue);
   }
 
-  void Elif(SourceLocation Loc, SourceRange ConditionRange,
-ConditionValueKind ConditionValue, SourceLocation IfLoc) override {
+  void Elif(SourceLocation HashLoc, SourceLocation Loc,
+SourceRange ConditionRange, ConditionValueKind ConditionValue,
+SourceLocation IfLoc) override {
 Results.emplace_back(ConditionRange, ConditionValue);
   }
 };
Index: clang/unittests/Basic/SourceManagerTest.cpp
===
--- clang/unittests/Basic/SourceManagerTest.cpp
+++ clang/unittests/Basic/SourceManagerTest.cpp
@@ -510,15 +510,15 @@
 public:
   explicit MacroTracker(std::vector &Macros) : Macros(Macros) { }
 
-  void MacroDefined(const Token &MacroNameTok,
+  void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
 const MacroDirective *MD) override {
 Macros.push_back(MacroAction(MD->getLocation(),
  MacroNameTok.getIdentifierInfo()->getName(),
  MacroAction::kDefinition));
   }
-  void MacroUndefined(const Token &MacroNameTok,
+  void MacroUndefined(SourceLocation HashLoc, const Token &MacroNameTok,
   const MacroDefinition &MD,
-  const MacroDirective  *UD) override {
+  const MacroDirective *UD) override {
 Macros.push_back(
 MacroAction(UD ? UD->getLocation() : SourceLocation(),
 MacroNameTok.getIdentifierInfo()->getName(),
Index: clang/tools/libclang/Indexing.cpp
===
--- clang/tools/libclang/Indexing.cpp
+++ clang/tools/libclang/Indexing.cpp
@@ -272,11 +272,12 @@
   }
 
   /// MacroDefined - This hook is called whenever a macro definition is seen.
-  void MacroDefined(const Token &Id, const MacroDirective *MD) override {}
+  void MacroDefined(SourceLocation HashLoc, const Token &Id,
+const MacroDirectiv

[PATCH] D141961: [clang][lex] Pass hash location to more PPCallbacks methods

2023-01-17 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

WIP - currently updating the tests for `pp-trace` and in the process debugging 
an issue with the location of the `#endif` hash.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141961/new/

https://reviews.llvm.org/D141961

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D141961: [clang][lex] Pass hash location to more PPCallbacks methods

2023-01-18 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 490160.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141961/new/

https://reviews.llvm.org/D141961

Files:
  clang-tools-extra/clang-include-fixer/find-all-symbols/FindAllMacros.cpp
  clang-tools-extra/clang-include-fixer/find-all-symbols/FindAllMacros.h
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
  clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
  clang-tools-extra/clang-tidy/bugprone/MacroParenthesesCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp
  clang-tools-extra/clang-tidy/google/UpgradeGoogletestCaseCheck.cpp
  clang-tools-extra/clang-tidy/modernize/MacroToEnumCheck.cpp
  clang-tools-extra/clang-tidy/readability/DuplicateIncludeCheck.cpp
  clang-tools-extra/clang-tidy/readability/ElseAfterReturnCheck.cpp
  clang-tools-extra/clang-tidy/readability/RedundantPreprocessorCheck.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
  clang-tools-extra/clangd/CollectMacros.h
  clang-tools-extra/clangd/Preamble.cpp
  clang-tools-extra/include-cleaner/lib/Record.cpp
  clang-tools-extra/modularize/PreprocessorTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/pp-trace/PPCallbacksTracker.h
  clang/include/clang/Lex/PPCallbacks.h
  clang/include/clang/Lex/PPConditionalDirectiveRecord.h
  clang/include/clang/Lex/PreprocessingRecord.h
  clang/include/clang/Lex/Preprocessor.h
  clang/lib/CodeGen/MacroPPCallbacks.cpp
  clang/lib/CodeGen/MacroPPCallbacks.h
  clang/lib/ExtractAPI/ExtractAPIConsumer.cpp
  clang/lib/Frontend/ASTUnit.cpp
  clang/lib/Frontend/PrintPreprocessedOutput.cpp
  clang/lib/Frontend/Rewrite/InclusionRewriter.cpp
  clang/lib/Index/IndexingAction.cpp
  clang/lib/Lex/PPConditionalDirectiveRecord.cpp
  clang/lib/Lex/PPDirectives.cpp
  clang/lib/Lex/PreprocessingRecord.cpp
  clang/tools/libclang/Indexing.cpp
  clang/unittests/Basic/SourceManagerTest.cpp
  clang/unittests/Lex/PPCallbacksTest.cpp

Index: clang/unittests/Lex/PPCallbacksTest.cpp
===
--- clang/unittests/Lex/PPCallbacksTest.cpp
+++ clang/unittests/Lex/PPCallbacksTest.cpp
@@ -75,13 +75,15 @@
 
   std::vector Results;
 
-  void If(SourceLocation Loc, SourceRange ConditionRange,
+  void If(SourceLocation HashLoc, SourceLocation Loc,
+  SourceRange ConditionRange,
   ConditionValueKind ConditionValue) override {
 Results.emplace_back(ConditionRange, ConditionValue);
   }
 
-  void Elif(SourceLocation Loc, SourceRange ConditionRange,
-ConditionValueKind ConditionValue, SourceLocation IfLoc) override {
+  void Elif(SourceLocation HashLoc, SourceLocation Loc,
+SourceRange ConditionRange, ConditionValueKind ConditionValue,
+SourceLocation IfLoc) override {
 Results.emplace_back(ConditionRange, ConditionValue);
   }
 };
Index: clang/unittests/Basic/SourceManagerTest.cpp
===
--- clang/unittests/Basic/SourceManagerTest.cpp
+++ clang/unittests/Basic/SourceManagerTest.cpp
@@ -510,15 +510,15 @@
 public:
   explicit MacroTracker(std::vector &Macros) : Macros(Macros) { }
 
-  void MacroDefined(const Token &MacroNameTok,
+  void MacroDefined(SourceLocation HashLoc, const Token &MacroNameTok,
 const MacroDirective *MD) override {
 Macros.push_back(MacroAction(MD->getLocation(),
  MacroNameTok.getIdentifierInfo()->getName(),
  MacroAction::kDefinition));
   }
-  void MacroUndefined(const Token &MacroNameTok,
+  void MacroUndefined(SourceLocation HashLoc, const Token &MacroNameTok,
   const MacroDefinition &MD,
-  const MacroDirective  *UD) override {
+  const MacroDirective *UD) override {
 Macros.push_back(
 MacroAction(UD ? UD->getLocation() : SourceLocation(),
 MacroNameTok.getIdentifierInfo()->getName(),
Index: clang/tools/libclang/Indexing.cpp
===
--- clang/tools/libclang/Indexing.cpp
+++ clang/tools/libclang/Indexing.cpp
@@ -272,11 +272,12 @@
   }
 
   /// MacroDefined - This hook is called whenever a macro definition is seen.
-  void MacroDefined(const Token &Id, const MacroDirective *MD) override {}
+  void MacroDefined(SourceLocation HashLoc, const Token &Id,
+const MacroDirective *MD) override {}
 
   /// MacroUndefined - This hook is called whenever a macro #undef is seen.
   /// MI is released immediately following this callback.
-  void MacroUndefined(const Token &MacroNameTok,
+  void MacroUndefined(SourceLocation HashLoc, const Token &MacroNameTok,
   const MacroDefinition &MD,
   const MacroDirective *U

[PATCH] D142030: [pp-trace] Print HashLoc parameter

2023-01-18 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
Herald added subscribers: kbarton, nemanjai.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
@@ -32,6 +32,7 @@
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK:  - Callback: MacroDefined
 // CHECK:  - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:3:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -44,13 +45,16 @@
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT:   ConditionValue: CVK_True
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT: - Callback: MacroUndefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:7:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT: - Callback: Defined
@@ -58,15 +62,18 @@
 // CHECK-NEXT:   MacroDefinition: []
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT:   ConditionValue: CVK_False
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT: - Callback: SourceRangeSkipped
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:10:1"
 // CHECK-NEXT:   MacroNameTok: FUNCMACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -75,12 +82,15 @@
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:9", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:20"]
 // CHECK-NEXT:   Args: [1]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:12:1"
 // CHECK-NEXT:   MacroNameTok: X
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:13:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:14:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL2
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
Index: clang-tools-extra/test/pp-trace/pp-trace-include.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-include.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-include.cpp
@@ -81,6 +81,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level2A.h:1:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_2A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -89,6 +90,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level2A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level1A.h:2:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_1A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -127,6 +129

[PATCH] D142030: [pp-trace] Print HashLoc parameter

2023-01-18 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 490201.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
@@ -32,6 +32,7 @@
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK:  - Callback: MacroDefined
 // CHECK:  - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:3:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -44,13 +45,16 @@
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT:   ConditionValue: CVK_True
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT: - Callback: MacroUndefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:7:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT: - Callback: Defined
@@ -58,15 +62,18 @@
 // CHECK-NEXT:   MacroDefinition: []
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT:   ConditionValue: CVK_False
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT: - Callback: SourceRangeSkipped
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:10:1"
 // CHECK-NEXT:   MacroNameTok: FUNCMACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -75,12 +82,15 @@
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:9", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:20"]
 // CHECK-NEXT:   Args: [1]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:12:1"
 // CHECK-NEXT:   MacroNameTok: X
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:13:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:14:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL2
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
Index: clang-tools-extra/test/pp-trace/pp-trace-include.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-include.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-include.cpp
@@ -81,6 +81,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level2A.h:1:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_2A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -89,6 +90,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level2A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level1A.h:2:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_1A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -127,6 +129,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1B.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level2B.h:1:1"
 // CHECK-NEXT:   

[PATCH] D142030: [pp-trace] Print HashLoc parameter

2023-01-18 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 490206.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142030/new/

https://reviews.llvm.org/D142030

Files:
  clang-tools-extra/docs/pp-trace.rst
  clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
  clang-tools-extra/test/pp-trace/pp-trace-conditional.cpp
  clang-tools-extra/test/pp-trace/pp-trace-include.cpp
  clang-tools-extra/test/pp-trace/pp-trace-macro.cpp

Index: clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-macro.cpp
@@ -32,6 +32,7 @@
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK:  - Callback: MacroDefined
 // CHECK:  - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:3:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -44,13 +45,16 @@
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:19"]
 // CHECK-NEXT:   ConditionValue: CVK_True
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:6:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:5:2"
 // CHECK-NEXT: - Callback: MacroUndefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:7:1"
 // CHECK-NEXT:   MacroNameTok: MACRO
 // CHECK-NEXT:   MacroDefinition: [(local)]
 // CHECK-NEXT: - Callback: Defined
@@ -58,15 +62,18 @@
 // CHECK-NEXT:   MacroDefinition: []
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT: - Callback: If
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT:   ConditionRange: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:5", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:19"]
 // CHECK-NEXT:   ConditionValue: CVK_False
 // CHECK-NEXT: - Callback: Endif
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:1"
 // CHECK-NEXT:   Loc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"
 // CHECK-NEXT:   IfLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:2"
 // CHECK-NEXT: - Callback: SourceRangeSkipped
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:8:1", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:9:2"]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:10:1"
 // CHECK-NEXT:   MacroNameTok: FUNCMACRO
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
@@ -75,12 +82,15 @@
 // CHECK-NEXT:   Range: ["{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:9", "{{.*}}{{[/\\]}}pp-trace-macro.cpp:11:20"]
 // CHECK-NEXT:   Args: [1]
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:12:1"
 // CHECK-NEXT:   MacroNameTok: X
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:13:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}pp-trace-macro.cpp:14:1"
 // CHECK-NEXT:   MacroNameTok: X_IMPL2
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: MacroExpands
Index: clang-tools-extra/test/pp-trace/pp-trace-include.cpp
===
--- clang-tools-extra/test/pp-trace/pp-trace-include.cpp
+++ clang-tools-extra/test/pp-trace/pp-trace-include.cpp
@@ -81,6 +81,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level2A.h:1:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_2A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -89,6 +90,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level2A.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level1A.h:2:1"
 // CHECK-NEXT:   MacroNameTok: MACRO_1A
 // CHECK-NEXT:   MacroDirective: MD_Define
 // CHECK-NEXT: - Callback: FileChanged
@@ -127,6 +129,7 @@
 // CHECK-NEXT:   FileType: C_User
 // CHECK-NEXT:   PrevFID: "{{.*}}{{[/\\]}}Inputs/Level1B.h"
 // CHECK-NEXT: - Callback: MacroDefined
+// CHECK-NEXT:   HashLoc: "{{.*}}{{[/\\]}}Inputs/Level2B.h:1:1"
 // CHECK-NEXT:   

[PATCH] D142121: [clang-tidy] Refactor common functionality of HeaderGuardCheck into HeaderGuardBase

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang-tools-extra.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
KyleFromKitware added a project: clang-tools-extra.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142121

Files:
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuard.h
  clang-tools-extra/clang-tidy/utils/HeaderGuardBase.cpp
  clang-tools-extra/clang-tidy/utils/HeaderGuardBase.h

Index: clang-tools-extra/clang-tidy/utils/HeaderGuardBase.h
===
--- /dev/null
+++ clang-tools-extra/clang-tidy/utils/HeaderGuardBase.h
@@ -0,0 +1,93 @@
+//===--- HeaderGuard.h - clang-tidy -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARDBASE_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARDBASE_H
+
+#include "../ClangTidyCheck.h"
+#include "../utils/FileExtensionsUtils.h"
+
+#include 
+
+namespace clang {
+class MacroInfo;
+
+namespace tidy {
+namespace utils {
+
+/// Base class for header guard detection.
+/// The check supports these options:
+///   - `HeaderFileExtensions`: a semicolon-separated list of filename
+/// extensions of header files (The filename extension should not contain
+/// "." prefix). ";h;hh;hpp;hxx" by default.
+///
+/// For extension-less header files, using an empty string or leaving an
+/// empty string between ";" if there are other filename extensions.
+class HeaderGuardBase : public ClangTidyCheck {
+public:
+  HeaderGuardBase(StringRef Name, ClangTidyContext *Context)
+  : ClangTidyCheck(Name, Context),
+RawStringHeaderFileExtensions(Options.getLocalOrGlobal(
+"HeaderFileExtensions", utils::defaultHeaderFileExtensions())) {
+utils::parseFileExtensions(RawStringHeaderFileExtensions,
+   HeaderFileExtensions,
+   utils::defaultFileExtensionDelimiters());
+  }
+  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
+  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
+   Preprocessor *ModuleExpanderPP) override;
+
+  /// Returns ``true`` if the check should suggest fixing a header file if it
+  /// has an existing header guard.
+  virtual bool shouldFixIfHeaderGuard(StringRef Filename);
+
+  /// Returns ``true`` if the check should suggest fixing a header file if it
+  /// does not have an existing header guard.
+  virtual bool shouldFixIfNoHeaderGuard(StringRef Filename);
+
+  /// @brief Called when a header guard is detected.
+  /// @param PP Preprocessor.
+  /// @param FileName Name of the file.
+  /// @param FE FileEntry.
+  /// @param IfndefHash Location of '#' in '#ifndef'.
+  /// @param Ifndef Location of 'ifndef' in '#ifndef'.
+  /// @param IfndefToken Location of macro token in '#ifndef'.
+  /// @param DefineHash Location of '#' in '#define'.
+  /// @param Define Location of macro token in '#define'.
+  /// @param EndIfHash Location of '#' in '#endif'.
+  /// @param EndIf Location of 'endif' in '#endif'.
+  virtual void onHeaderGuard(Preprocessor *PP, StringRef FileName,
+ const FileEntry *FE, SourceLocation IfndefHash,
+ SourceLocation Ifndef, SourceLocation IfndefToken,
+ SourceLocation DefineHash, const Token &Define,
+ SourceLocation EndIfHash,
+ SourceLocation EndIf) = 0;
+
+  /// @brief Called when a header with no header guard is detected.
+  /// @param PP Preprocessor.
+  /// @param FileName Name of the file.
+  /// @param FE FileEntry.
+  /// @param StartLoc Location of the start of the file.
+  /// @param Macros List of macros in this file. Contains location of '#', macro
+  /// token, and macro info.
+  virtual void onGuardlessHeader(
+  Preprocessor *PP, StringRef FileName, const FileEntry *FE,
+  SourceLocation StartLoc,
+  const std::vector>
+  &Macros) = 0;
+
+protected:
+  std::string RawStringHeaderFileExtensions;
+  utils::FileExtensionsSet HeaderFileExtensions;
+};
+
+} // namespace utils
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARDBASE_H
Index: clang-tools-extra/clang-tidy/util

[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware created this revision.
KyleFromKitware added a reviewer: clang-tools-extra.
KyleFromKitware created this object with edit policy "Only User: 
KyleFromKitware (Kyle Edwards)".
KyleFromKitware added a project: clang-tools-extra.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a reviewer: njames93.
Herald added a project: All.
KyleFromKitware requested review of this revision.
Herald added a subscriber: cfe-commits.

Co-Authored-by: Igor-Mikhail-Valentin Glebov 


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
  clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
  clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.h
  clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
@@ -7,6 +7,7 @@
 //===--===//
 #include "ClangTidyTest.h"
 #include "modernize/IntegralLiteralExpressionMatcher.h"
+#include "modernize/UsePragmaOnceCheck.h"
 #include "clang/Lex/Lexer.h"
 #include "gtest/gtest.h"
 
@@ -272,6 +273,62 @@
 INSTANTIATE_TEST_SUITE_P(IntegralLiteralExpressionMatcherTests, SizeTest,
  ::testing::ValuesIn(SizeParams));
 
+namespace {
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(UsePragmaOnceCheckTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+runPragmaOnceCheck("void neither();\n", "neither.h",
+   StringRef("use #pragma once")));
+}
+
 } // namespace test
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.h
===
--- /dev/null
+++ clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.h
@@ -0,0 +1,47 @@
+//===--- UsePragmaOnceCheck.h - clang-tidy --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USEPRAGMAONCECHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USEPRAGMAONCECHECK_H
+
+#include "../utils/HeaderGuardBase.h"
+
+namespace clang {
+namespace tidy {
+namespace modernize {
+
+/// Check that suggests the use of #pragma once.
+/// The check supports these options:
+///   - `HeaderFileExtensions`: a semicolo

[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware updated this revision to Diff 490534.
KyleFromKitware added a comment.

Added documentation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

Files:
  clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
  clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
  clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.cpp
  clang-tools-extra/clang-tidy/modernize/UsePragmaOnceCheck.h
  clang-tools-extra/docs/clang-tidy/checks/list.rst
  clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
  clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
===
--- clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/ModernizeModuleTest.cpp
@@ -7,6 +7,7 @@
 //===--===//
 #include "ClangTidyTest.h"
 #include "modernize/IntegralLiteralExpressionMatcher.h"
+#include "modernize/UsePragmaOnceCheck.h"
 #include "clang/Lex/Lexer.h"
 #include "gtest/gtest.h"
 
@@ -272,6 +273,62 @@
 INSTANTIATE_TEST_SUITE_P(IntegralLiteralExpressionMatcherTests, SizeTest,
  ::testing::ValuesIn(SizeParams));
 
+namespace {
+std::string runPragmaOnceCheck(StringRef Code, const Twine &Filename,
+   std::optional ExpectedWarning,
+   std::map PathsToContent =
+   std::map()) {
+  std::vector Errors;
+  std::string Result = test::runCheckOnCode(
+  Code, &Errors, Filename, std::string("-xc++-header"), ClangTidyOptions{},
+  std::move(PathsToContent));
+  if (Errors.size() != (size_t)ExpectedWarning.has_value())
+return "invalid error count";
+  if (ExpectedWarning && *ExpectedWarning != Errors.back().Message.Message)
+return "expected: '" + ExpectedWarning->str() + "', saw: '" +
+   Errors.back().Message.Message + "'";
+  return Result;
+}
+} // namespace
+
+TEST(UsePragmaOnceCheckTest, AddPragmaOnce) {
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void headerGuard();\n"
+"\n",
+runPragmaOnceCheck("#ifndef HEADER_GUARD_H\n"
+   "#define HEADER_GUARD_H\n"
+   "\n"
+   "void headerGuard();\n"
+   "\n"
+   "#endif // HEADER_GUARD_H\n",
+   "header-guard.h",
+   StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void pragmaOnce();\n",
+runPragmaOnceCheck("#pragma once\n"
+   "\n"
+   "void pragmaOnce();\n",
+   "pragma-once.h", std::nullopt));
+  EXPECT_EQ("#pragma once\n"
+"\n"
+"void both();\n"
+"\n",
+runPragmaOnceCheck("#ifndef BOTH_H\n"
+   "#define BOTH_H\n"
+   "#pragma once\n"
+   "\n"
+   "void both();\n"
+   "\n"
+   "#endif // BOTH_H\n",
+   "both.h", StringRef("use #pragma once")));
+  EXPECT_EQ("#pragma once\n"
+"void neither();\n",
+runPragmaOnceCheck("void neither();\n", "neither.h",
+   StringRef("use #pragma once")));
+}
+
 } // namespace test
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
===
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/modernize/use-pragma-once.rst
@@ -0,0 +1,22 @@
+.. title:: clang-tidy - modernize-use-pragma-once
+
+modernize-use-pragma-once
+=
+
+Adds ``#pragma once`` (a widely-supported compiler extension) to header files
+and removes header guards if they are used (``#ifndef`` / ``#define`` /
+``#endif``).
+
+Note that ``#pragma once`` cannot be correct in all possible use cases and has
+not been added to the C++ standard. Not all projects will wish to use it.
+
+Options
+---
+
+.. option:: HeaderFileExtensions
+
+   A comma-separated list of filename extensions of header files (the filename
+   extensions should not include "." prefix). Default is "h,hh,hpp,hxx".
+   For header files without an extension, use an empty string (if there are no
+   other desired extensions) or leave an empty element in the list. E.g.,
+   "h,hh,hpp,hxx," (note the trailing comma).
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===
--- c

[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

We have this check in a custom clang-tidy module that runs on CMake's CI 
system. Other people 

 have also sought out such a check, and I figured it made sense to upstream it 
instead of keeping it stuck in our CI. Even though it's not standard, other 
people might still want to use it. Perhaps there's a better category for it 
than `modernize`?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142123#4066351 , @njames93 wrote:

> and peoples eagerness to blindly enable all checks (or all checks from a 
> module)

Perhaps there's some way we can have it disabled by default and not enabled 
unless they explicitly enable it (similar to `-Wall` vs 
`-Wextra`/`-Weverything`)?

I agree that it should not be standard, but it works in the vast majority of 
use cases. Drake  is another very 
large C++ project that uses `#pragma once` everywhere. The demand for `#pragma 
once` exists, as does the demand for a check to enforce it. If we don't land 
this in LLVM proper, where would be a better place for it?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142121: [clang-tidy] Refactor common functionality of HeaderGuardCheck into HeaderGuardBase

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

Yes, this is for D142123 . However, even if 
that doesn't land, I'd still like to land this. We use the code from D142123 
 in CMake's CI system, and getting it to work 
without this change resulted in a massive amount of code duplication. This 
refactoring would allow us to eliminate such duplication on our end.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142121/new/

https://reviews.llvm.org/D142121

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142123#4066460 , @aaron.ballman 
wrote:

> In D142123#4066447 , @lebedev.ri 
> wrote:
>
>> In D142123#4066351 , @njames93 
>> wrote:
>>
>>> 
>
> We're trying to figure out what the correct approach is (fwiw, I'd be opposed 
> to what's proposed as-is but would be fine with a tweaked proposal).

Thanks for clarifying this. I am absolutely open to tweaking this proposal 
(moving it to a different module, disabling it by default, etc.) My biggest 
concern is to upstream this functionality so that others can use it. I stuck it 
in `modernize` but would absolutely be happy to move it somewhere else.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In terms of a "generic check", there is already the `HeaderGuardCheck`, but 
that has to be extended to be specific to the project's naming convention. And 
I don't think there can be a generic check that converts `#pragma once` to a 
header guard - when it adds the header guard, what does it name it? It has to 
know the project's naming convention. If we want a check that replaces `#pragma 
once` with a header guard, our best bet would be modifying `HeaderGuardCheck` 
to do this, since it already does most of the needed work. However, such 
functionality is orthogonal to my proposal here.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142123#4066676 , @aaron.ballman 
wrote:

> It doesn't have to -- for example, we can name the guard based on the path to 
> the header. e.g., `foo/include/bar/baz.h` could use `FOO_INCLUDE_BAR_BAZ_H` 
> as the header guard.

But then this would conflict with `LLVMHeaderGuardCheck` - the LLVM check would 
suggest one thing and the generic check would suggest something different.

> It's orthogonal except for the design concerns. Basically, I don't think we 
> should have one check for "go to header guards" and another check for "go to 
> pragma once" -- IMO we should have one check to do either approach. @njames93 
> is correct that a common use case for clang-tidy is "enable all checks" so 
> having two checks that do opposite things gets awkward in practice.

See above - a generic check would also cause a conflict if they blindly enabled 
all checks. I think that no matter what we do here, enabling all checks is 
going to cause a conflict of some kind. The only way to avoid this is if we 
overhaul the existing `HeaderGuardCheck` and make its naming convention 
configurable by a configuration option as opposed to having to extend the C++ 
class to calculate the name.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142123#4066706 , @KyleFromKitware 
wrote:

> The only way to avoid this is if we overhaul the existing `HeaderGuardCheck` 
> and make its naming convention configurable by a configuration option as 
> opposed to having to extend the C++ class to calculate the name.

Actually, this might be realistic. We could add a new registry for header guard 
styles. So then instead of having separate checks named `llvm-header-guard` and 
such, we have a single check named `header-guard` which can then select between 
different header guard styles (`llvm`, `pragma-once`, etc.) Projects could even 
create their own custom guard styles and register them in this new registry.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-19 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

Basically, anything that extends `HeaderGuardCheck` (or `HeaderGuardBase` from 
D142121 ) is really just a fancy 
configuration option, rather than a separate check, and should be treated as 
such. My proposal is this:

1. Create a new base class called `HeaderGuardStyle` which controls all 
behavior that happens after a header guard or `#pragma once` is discovered, and 
create associated `llvm::Registry`
2. Modify `HeaderGuardCheck` to select a `HeaderGuardStyle` from the registry 
based on a configuration option
3. Create a class called `MacroHeaderGuardStyle` which extends 
`HeaderGuardStyle` and basically does what D142121 
 does now
4. Rename `LLVMHeaderGuardCheck` to `LLVMHeaderGuardStyle` and modify it to 
extend `MacroHeaderGuardStyle` and add it to the registry
5. Add `PragmaOnceHeaderGuardStyle` which extends `HeaderGuardStyle` and add it 
to the registry

The refactoring that I've done in D142121  is 
most of the way to being able to implement my above proposal. I just need to 
shift a few things around and add the new classes. @aaron.ballman if this 
proposal is good with you I'll get started on it.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D142123: [clang-tidy] Add check to suggest use of #pragma once

2023-01-21 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D142123#4071099 , @njames93 wrote:

> Can you just elaborate on what the registry is used for? Is the plan to 
> support potentially dynamically loading `HeaderGuardStyle` classes.

Yes.

> If thats the case, Then I'd argue we don't need the `HeaderGuardBase` check 
> class, We can just create a `HeaderGuardCheck` class that creates an instance 
> of the `HeaderGuardStyle` based on the configuration options.

Yes, that was my plan, sorry for not making that explicit. `HeaderGuardStyle` 
is supposed to be analogous to `HeaderGuardBase` and `MacroHeaderGuardStyle` is 
supposed to be analogous to `HeaderGuardCheck` from D142121 
.

> Then to maintain backwards compatibility the `llvm-header-guard` could be an 
> alias with the default style option set to `llvm` for example.

Sounds good. What should the default for regular `header-guard` be then?

> Also this goes for all your PRs, can you please upload them in future with 
> full context `git diff -U99` should do it. Makes revewing changes easier 
> and removes those `Context not available` message on phab

Will do.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142123/new/

https://reviews.llvm.org/D142123

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-03-30 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D143099#4233623 , @cor3ntin wrote:

> @KyleFromKitware oups, this fell under the cracks. I think I'm happy with is 
> as-is, do you need help landing it?

Yes, please.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143099/new/

https://reviews.llvm.org/D143099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-03-30 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added a comment.

In D143099#4233651 , @cor3ntin wrote:

> Sure.  Let me know what name and email address you would like used for the 
> patch attribution! Thanks

Kyle Edwards 

Is there some way I can set this in my profile settings so that this name and 
address is always used?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143099/new/

https://reviews.llvm.org/D143099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D143099: [clang][lex] Expose findBeginningOfLine()

2023-03-30 Thread Kyle Edwards via Phabricator via cfe-commits
KyleFromKitware added inline comments.



Comment at: clang/unittests/Lex/LexerTest.cpp:673
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 13), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 12), 13);
+  EXPECT_EQ(FindBeginningOfLineOffset("int func1();\nint func2();", 11), 0);

tahonermann wrote:
> I find this case interesting. I'm assuming it is intentional that an offset 
> that corresponds to an EOL character indicates that the offset of the 
> character following it be returned. That suggests some additional cases to 
> test:
> EXPECT_EQ(FindBeginningOfLineOffset("int func1();\n\n", 12), 13);
> EXPECT_EQ(FindBeginningOfLineOffset("int func1();\n", 12), 13);  // 13? 
> Or perhaps invalid?
> 
> My intuition is that an offset corresponding to an EOL character would result 
> in the offset of the line containing the EOL character being returned.
I did my best to preserve the existing behavior of the function while fixing a 
corner case that was obviously wrong. Should this be fixed as well?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143099/new/

https://reviews.llvm.org/D143099

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits