forked from OSchip/llvm-project
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 Differential Revision: https://reviews.llvm.org/D61217 llvm-svn: 359506
This commit is contained in:
parent
8306cb5702
commit
5550aa0023
|
@ -625,8 +625,23 @@ void Preprocessor::SkipTokensWhileUsingPCH() {
|
|||
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;
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
#define Source(x,y)
|
||||
#define InOut(size) Source(InOut, (size))
|
|
@ -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);
|
|
@ -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;
|
Loading…
Reference in New Issue