[PATCH] D61217: Fix PCH skipping to handle all Lexers

Mike Rice via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 26 17:07:20 PDT 2019


mikerice created this revision.
mikerice added reviewers: rnk, cfe-commits.

When skipping code at the start of a file during PCH use, Preprocessor::Lex is not used since it consumes all preprocessor directives until it returns a real token.  Using the specific Lexer (i.e. CurLexer->Lex) makes it possible to stop skipping after an #include or #pragma hdrstop.  Previously the skipping code was only handling CurLexer, now all will be handled correctly.

Fixes: llvm.org/PR41585


https://reviews.llvm.org/D61217

Files:
  lib/Lex/Preprocessor.cpp
  test/PCH/Inputs/pch-through-macro.h
  test/PCH/pch-through4.cpp
  test/PCH/pch-through4a.cpp


Index: lib/Lex/Preprocessor.cpp
===================================================================
--- lib/Lex/Preprocessor.cpp
+++ lib/Lex/Preprocessor.cpp
@@ -625,8 +625,23 @@
   bool UsingPragmaHdrStop = SkippingUntilPragmaHdrStop;
   Token Tok;
   while (true) {
-    bool InPredefines = (CurLexer->getFileID() == getPredefinesFileID());
-    CurLexer->Lex(Tok);
+    bool InPredefines =
+        (CurLexer && CurLexer->getFileID() == getPredefinesFileID());
+    switch (CurLexerKind) {
+    case CLK_Lexer:
+      CurLexer->Lex(Tok);
+     break;
+    case CLK_TokenLexer:
+      CurTokenLexer->Lex(Tok);
+      break;
+    case CLK_CachingLexer:
+      bool IsNewToken;
+      CachingLex(Tok, IsNewToken);
+      break;
+    case CLK_LexAfterModuleImport:
+      LexAfterModuleImport(Tok);
+      break;
+    }
     if (Tok.is(tok::eof) && !InPredefines) {
       ReachedMainFileEOF = true;
       break;
Index: test/PCH/pch-through4a.cpp
===================================================================
--- test/PCH/pch-through4a.cpp
+++ test/PCH/pch-through4a.cpp
@@ -0,0 +1,16 @@
+// expected-no-diagnostics
+// Create PCH with a through header.
+// RUN: %clang_cc1 -verify -I %S -emit-pch \
+// RUN: -pch-through-header=Inputs/pch-through1.h \
+// RUN:   -fms-extensions -o %t.pch -x c++-header %s
+
+// Create the PCH object
+// RUN: %clang_cc1 -verify -I %S -emit-obj -include-pch %t.pch \
+// RUN:   -pch-through-header=Inputs/pch-through1.h \
+// RUN:   -fms-extensions -o %t.obj -x c++ %s
+
+#define Source(x,y)
+#define InOut(size) Source(InOut, (size))
+void f(InOut(a) char *b, unsigned long a);
+#include "Inputs/pch-through1.h"
+int other;
Index: test/PCH/pch-through4.cpp
===================================================================
--- test/PCH/pch-through4.cpp
+++ test/PCH/pch-through4.cpp
@@ -0,0 +1,12 @@
+// expected-no-diagnostics
+// Create PCH with #pragma hdrstop processing.
+// RUN: %clang_cc1 -verify -I %S -emit-pch -pch-through-hdrstop-create \
+// RUN:   -fms-extensions -o %t.pch -x c++-header %s
+
+// Create the PCH object
+// RUN: %clang_cc1 -verify -I %S -emit-obj -include-pch %t.pch \
+// RUN:   -pch-through-hdrstop-create -fms-extensions -o %t.obj -x c++ %s
+
+#pragma once
+#include "Inputs/pch-through-macro.h"
+void f(InOut(a) char *b, unsigned long a);
Index: test/PCH/Inputs/pch-through-macro.h
===================================================================
--- test/PCH/Inputs/pch-through-macro.h
+++ test/PCH/Inputs/pch-through-macro.h
@@ -0,0 +1,3 @@
+#pragma once
+#define Source(x,y)
+#define InOut(size) Source(InOut, (size))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61217.196927.patch
Type: text/x-patch
Size: 2600 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190427/7d7ad78e/attachment-0001.bin>


More information about the cfe-commits mailing list