[PATCH] D147928: [clang] Keep multiple-include optimization for null directives
Elliot Goodrich via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 19 00:46:08 PDT 2023
IncludeGuardian updated this revision to Diff 514849.
IncludeGuardian added a comment.
Replace `ResetReadToken` with `SetReadToken` to avoid a conditional
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D147928/new/
https://reviews.llvm.org/D147928
Files:
clang/include/clang/Lex/MultipleIncludeOpt.h
clang/lib/Lex/PPDirectives.cpp
clang/test/Preprocessor/multiple-inclusion-opt.cpp
clang/test/Preprocessor/multiple-inclusion-opt.h
Index: clang/test/Preprocessor/multiple-inclusion-opt.h
===================================================================
--- /dev/null
+++ clang/test/Preprocessor/multiple-inclusion-opt.h
@@ -0,0 +1,18 @@
+# // null directive and comments before include guard
+
+#ifndef MULTIPLE_INCLUSION_OPT
+
+int foo();
+
+// The position of the define should not matter
+#define MULTIPLE_INCLUSION_OPT
+
+int bar();
+
+#endif
+
+#
+#
+/* Two null directives
+ and a multiline comment
+ after the #endif */
Index: clang/test/Preprocessor/multiple-inclusion-opt.cpp
===================================================================
--- /dev/null
+++ clang/test/Preprocessor/multiple-inclusion-opt.cpp
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -E -P -H %s 2>&1 | grep "multiple-inclusion-opt.h" | count 1
+
+#include "multiple-inclusion-opt.h"
+#include "multiple-inclusion-opt.h"
+#include "multiple-inclusion-opt.h"
+#include "multiple-inclusion-opt.h"
+#include "multiple-inclusion-opt.h"
Index: clang/lib/Lex/PPDirectives.cpp
===================================================================
--- clang/lib/Lex/PPDirectives.cpp
+++ clang/lib/Lex/PPDirectives.cpp
@@ -1177,6 +1177,10 @@
switch (Result.getKind()) {
case tok::eod:
+ // Ignore the null directive with regards to the multiple-include
+ // optimization, i.e. allow the null directive to appear outside of the
+ // include guard and still enable the multiple-include optimization.
+ CurPPLexer->MIOpt.SetReadToken(ReadAnyTokensBeforeDirective);
return; // null directive.
case tok::code_completion:
setCodeCompletionReached();
Index: clang/include/clang/Lex/MultipleIncludeOpt.h
===================================================================
--- clang/include/clang/Lex/MultipleIncludeOpt.h
+++ clang/include/clang/Lex/MultipleIncludeOpt.h
@@ -108,6 +108,12 @@
ImmediatelyAfterTopLevelIfndef = false;
}
+ /// SetReadToken - Set whether the value of 'ReadAnyTokens'. Called to
+ /// override when encountering tokens outside of the include guard that have
+ /// no effect if the file in question is is included multiple times (e.g. the
+ /// null directive).
+ void SetReadToken(bool Value) { ReadAnyTokens = Value; }
+
/// ExpandedMacro - When a macro is expanded with this lexer as the current
/// buffer, this method is called to disable the MIOpt if needed.
void ExpandedMacro() { DidMacroExpansion = true; }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147928.514849.patch
Type: text/x-patch
Size: 2432 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230419/c9a9ace3/attachment.bin>
More information about the cfe-commits
mailing list