1*67e74705SXin Li //===--- Pragma.cpp - Pragma registration and handling --------------------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the PragmaHandler/PragmaTable interfaces and implements
11*67e74705SXin Li // pragma related methods of the Preprocessor class.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li
15*67e74705SXin Li #include "clang/Lex/Pragma.h"
16*67e74705SXin Li #include "clang/Basic/FileManager.h"
17*67e74705SXin Li #include "clang/Basic/SourceManager.h"
18*67e74705SXin Li #include "clang/Lex/HeaderSearch.h"
19*67e74705SXin Li #include "clang/Lex/LexDiagnostic.h"
20*67e74705SXin Li #include "clang/Lex/LiteralSupport.h"
21*67e74705SXin Li #include "clang/Lex/MacroInfo.h"
22*67e74705SXin Li #include "clang/Lex/Preprocessor.h"
23*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
24*67e74705SXin Li #include "llvm/ADT/StringSwitch.h"
25*67e74705SXin Li #include "llvm/ADT/StringExtras.h"
26*67e74705SXin Li #include "llvm/Support/CrashRecoveryContext.h"
27*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
28*67e74705SXin Li #include <algorithm>
29*67e74705SXin Li using namespace clang;
30*67e74705SXin Li
31*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
32*67e74705SXin Li
33*67e74705SXin Li // Out-of-line destructor to provide a home for the class.
~PragmaHandler()34*67e74705SXin Li PragmaHandler::~PragmaHandler() {
35*67e74705SXin Li }
36*67e74705SXin Li
37*67e74705SXin Li //===----------------------------------------------------------------------===//
38*67e74705SXin Li // EmptyPragmaHandler Implementation.
39*67e74705SXin Li //===----------------------------------------------------------------------===//
40*67e74705SXin Li
EmptyPragmaHandler(StringRef Name)41*67e74705SXin Li EmptyPragmaHandler::EmptyPragmaHandler(StringRef Name) : PragmaHandler(Name) {}
42*67e74705SXin Li
HandlePragma(Preprocessor & PP,PragmaIntroducerKind Introducer,Token & FirstToken)43*67e74705SXin Li void EmptyPragmaHandler::HandlePragma(Preprocessor &PP,
44*67e74705SXin Li PragmaIntroducerKind Introducer,
45*67e74705SXin Li Token &FirstToken) {}
46*67e74705SXin Li
47*67e74705SXin Li //===----------------------------------------------------------------------===//
48*67e74705SXin Li // PragmaNamespace Implementation.
49*67e74705SXin Li //===----------------------------------------------------------------------===//
50*67e74705SXin Li
~PragmaNamespace()51*67e74705SXin Li PragmaNamespace::~PragmaNamespace() {
52*67e74705SXin Li llvm::DeleteContainerSeconds(Handlers);
53*67e74705SXin Li }
54*67e74705SXin Li
55*67e74705SXin Li /// FindHandler - Check to see if there is already a handler for the
56*67e74705SXin Li /// specified name. If not, return the handler for the null identifier if it
57*67e74705SXin Li /// exists, otherwise return null. If IgnoreNull is true (the default) then
58*67e74705SXin Li /// the null handler isn't returned on failure to match.
FindHandler(StringRef Name,bool IgnoreNull) const59*67e74705SXin Li PragmaHandler *PragmaNamespace::FindHandler(StringRef Name,
60*67e74705SXin Li bool IgnoreNull) const {
61*67e74705SXin Li if (PragmaHandler *Handler = Handlers.lookup(Name))
62*67e74705SXin Li return Handler;
63*67e74705SXin Li return IgnoreNull ? nullptr : Handlers.lookup(StringRef());
64*67e74705SXin Li }
65*67e74705SXin Li
AddPragma(PragmaHandler * Handler)66*67e74705SXin Li void PragmaNamespace::AddPragma(PragmaHandler *Handler) {
67*67e74705SXin Li assert(!Handlers.lookup(Handler->getName()) &&
68*67e74705SXin Li "A handler with this name is already registered in this namespace");
69*67e74705SXin Li Handlers[Handler->getName()] = Handler;
70*67e74705SXin Li }
71*67e74705SXin Li
RemovePragmaHandler(PragmaHandler * Handler)72*67e74705SXin Li void PragmaNamespace::RemovePragmaHandler(PragmaHandler *Handler) {
73*67e74705SXin Li assert(Handlers.lookup(Handler->getName()) &&
74*67e74705SXin Li "Handler not registered in this namespace");
75*67e74705SXin Li Handlers.erase(Handler->getName());
76*67e74705SXin Li }
77*67e74705SXin Li
HandlePragma(Preprocessor & PP,PragmaIntroducerKind Introducer,Token & Tok)78*67e74705SXin Li void PragmaNamespace::HandlePragma(Preprocessor &PP,
79*67e74705SXin Li PragmaIntroducerKind Introducer,
80*67e74705SXin Li Token &Tok) {
81*67e74705SXin Li // Read the 'namespace' that the directive is in, e.g. STDC. Do not macro
82*67e74705SXin Li // expand it, the user can have a STDC #define, that should not affect this.
83*67e74705SXin Li PP.LexUnexpandedToken(Tok);
84*67e74705SXin Li
85*67e74705SXin Li // Get the handler for this token. If there is no handler, ignore the pragma.
86*67e74705SXin Li PragmaHandler *Handler
87*67e74705SXin Li = FindHandler(Tok.getIdentifierInfo() ? Tok.getIdentifierInfo()->getName()
88*67e74705SXin Li : StringRef(),
89*67e74705SXin Li /*IgnoreNull=*/false);
90*67e74705SXin Li if (!Handler) {
91*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_ignored);
92*67e74705SXin Li return;
93*67e74705SXin Li }
94*67e74705SXin Li
95*67e74705SXin Li // Otherwise, pass it down.
96*67e74705SXin Li Handler->HandlePragma(PP, Introducer, Tok);
97*67e74705SXin Li }
98*67e74705SXin Li
99*67e74705SXin Li //===----------------------------------------------------------------------===//
100*67e74705SXin Li // Preprocessor Pragma Directive Handling.
101*67e74705SXin Li //===----------------------------------------------------------------------===//
102*67e74705SXin Li
103*67e74705SXin Li /// HandlePragmaDirective - The "\#pragma" directive has been parsed. Lex the
104*67e74705SXin Li /// rest of the pragma, passing it to the registered pragma handlers.
HandlePragmaDirective(SourceLocation IntroducerLoc,PragmaIntroducerKind Introducer)105*67e74705SXin Li void Preprocessor::HandlePragmaDirective(SourceLocation IntroducerLoc,
106*67e74705SXin Li PragmaIntroducerKind Introducer) {
107*67e74705SXin Li if (Callbacks)
108*67e74705SXin Li Callbacks->PragmaDirective(IntroducerLoc, Introducer);
109*67e74705SXin Li
110*67e74705SXin Li if (!PragmasEnabled)
111*67e74705SXin Li return;
112*67e74705SXin Li
113*67e74705SXin Li ++NumPragma;
114*67e74705SXin Li
115*67e74705SXin Li // Invoke the first level of pragma handlers which reads the namespace id.
116*67e74705SXin Li Token Tok;
117*67e74705SXin Li PragmaHandlers->HandlePragma(*this, Introducer, Tok);
118*67e74705SXin Li
119*67e74705SXin Li // If the pragma handler didn't read the rest of the line, consume it now.
120*67e74705SXin Li if ((CurTokenLexer && CurTokenLexer->isParsingPreprocessorDirective())
121*67e74705SXin Li || (CurPPLexer && CurPPLexer->ParsingPreprocessorDirective))
122*67e74705SXin Li DiscardUntilEndOfDirective();
123*67e74705SXin Li }
124*67e74705SXin Li
125*67e74705SXin Li namespace {
126*67e74705SXin Li /// \brief Helper class for \see Preprocessor::Handle_Pragma.
127*67e74705SXin Li class LexingFor_PragmaRAII {
128*67e74705SXin Li Preprocessor &PP;
129*67e74705SXin Li bool InMacroArgPreExpansion;
130*67e74705SXin Li bool Failed;
131*67e74705SXin Li Token &OutTok;
132*67e74705SXin Li Token PragmaTok;
133*67e74705SXin Li
134*67e74705SXin Li public:
LexingFor_PragmaRAII(Preprocessor & PP,bool InMacroArgPreExpansion,Token & Tok)135*67e74705SXin Li LexingFor_PragmaRAII(Preprocessor &PP, bool InMacroArgPreExpansion,
136*67e74705SXin Li Token &Tok)
137*67e74705SXin Li : PP(PP), InMacroArgPreExpansion(InMacroArgPreExpansion),
138*67e74705SXin Li Failed(false), OutTok(Tok) {
139*67e74705SXin Li if (InMacroArgPreExpansion) {
140*67e74705SXin Li PragmaTok = OutTok;
141*67e74705SXin Li PP.EnableBacktrackAtThisPos();
142*67e74705SXin Li }
143*67e74705SXin Li }
144*67e74705SXin Li
~LexingFor_PragmaRAII()145*67e74705SXin Li ~LexingFor_PragmaRAII() {
146*67e74705SXin Li if (InMacroArgPreExpansion) {
147*67e74705SXin Li if (Failed) {
148*67e74705SXin Li PP.CommitBacktrackedTokens();
149*67e74705SXin Li } else {
150*67e74705SXin Li PP.Backtrack();
151*67e74705SXin Li OutTok = PragmaTok;
152*67e74705SXin Li }
153*67e74705SXin Li }
154*67e74705SXin Li }
155*67e74705SXin Li
failed()156*67e74705SXin Li void failed() {
157*67e74705SXin Li Failed = true;
158*67e74705SXin Li }
159*67e74705SXin Li };
160*67e74705SXin Li }
161*67e74705SXin Li
162*67e74705SXin Li /// Handle_Pragma - Read a _Pragma directive, slice it up, process it, then
163*67e74705SXin Li /// return the first token after the directive. The _Pragma token has just
164*67e74705SXin Li /// been read into 'Tok'.
Handle_Pragma(Token & Tok)165*67e74705SXin Li void Preprocessor::Handle_Pragma(Token &Tok) {
166*67e74705SXin Li
167*67e74705SXin Li // This works differently if we are pre-expanding a macro argument.
168*67e74705SXin Li // In that case we don't actually "activate" the pragma now, we only lex it
169*67e74705SXin Li // until we are sure it is lexically correct and then we backtrack so that
170*67e74705SXin Li // we activate the pragma whenever we encounter the tokens again in the token
171*67e74705SXin Li // stream. This ensures that we will activate it in the correct location
172*67e74705SXin Li // or that we will ignore it if it never enters the token stream, e.g:
173*67e74705SXin Li //
174*67e74705SXin Li // #define EMPTY(x)
175*67e74705SXin Li // #define INACTIVE(x) EMPTY(x)
176*67e74705SXin Li // INACTIVE(_Pragma("clang diagnostic ignored \"-Wconversion\""))
177*67e74705SXin Li
178*67e74705SXin Li LexingFor_PragmaRAII _PragmaLexing(*this, InMacroArgPreExpansion, Tok);
179*67e74705SXin Li
180*67e74705SXin Li // Remember the pragma token location.
181*67e74705SXin Li SourceLocation PragmaLoc = Tok.getLocation();
182*67e74705SXin Li
183*67e74705SXin Li // Read the '('.
184*67e74705SXin Li Lex(Tok);
185*67e74705SXin Li if (Tok.isNot(tok::l_paren)) {
186*67e74705SXin Li Diag(PragmaLoc, diag::err__Pragma_malformed);
187*67e74705SXin Li return _PragmaLexing.failed();
188*67e74705SXin Li }
189*67e74705SXin Li
190*67e74705SXin Li // Read the '"..."'.
191*67e74705SXin Li Lex(Tok);
192*67e74705SXin Li if (!tok::isStringLiteral(Tok.getKind())) {
193*67e74705SXin Li Diag(PragmaLoc, diag::err__Pragma_malformed);
194*67e74705SXin Li // Skip bad tokens, and the ')', if present.
195*67e74705SXin Li if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof))
196*67e74705SXin Li Lex(Tok);
197*67e74705SXin Li while (Tok.isNot(tok::r_paren) &&
198*67e74705SXin Li !Tok.isAtStartOfLine() &&
199*67e74705SXin Li Tok.isNot(tok::eof))
200*67e74705SXin Li Lex(Tok);
201*67e74705SXin Li if (Tok.is(tok::r_paren))
202*67e74705SXin Li Lex(Tok);
203*67e74705SXin Li return _PragmaLexing.failed();
204*67e74705SXin Li }
205*67e74705SXin Li
206*67e74705SXin Li if (Tok.hasUDSuffix()) {
207*67e74705SXin Li Diag(Tok, diag::err_invalid_string_udl);
208*67e74705SXin Li // Skip this token, and the ')', if present.
209*67e74705SXin Li Lex(Tok);
210*67e74705SXin Li if (Tok.is(tok::r_paren))
211*67e74705SXin Li Lex(Tok);
212*67e74705SXin Li return _PragmaLexing.failed();
213*67e74705SXin Li }
214*67e74705SXin Li
215*67e74705SXin Li // Remember the string.
216*67e74705SXin Li Token StrTok = Tok;
217*67e74705SXin Li
218*67e74705SXin Li // Read the ')'.
219*67e74705SXin Li Lex(Tok);
220*67e74705SXin Li if (Tok.isNot(tok::r_paren)) {
221*67e74705SXin Li Diag(PragmaLoc, diag::err__Pragma_malformed);
222*67e74705SXin Li return _PragmaLexing.failed();
223*67e74705SXin Li }
224*67e74705SXin Li
225*67e74705SXin Li if (InMacroArgPreExpansion)
226*67e74705SXin Li return;
227*67e74705SXin Li
228*67e74705SXin Li SourceLocation RParenLoc = Tok.getLocation();
229*67e74705SXin Li std::string StrVal = getSpelling(StrTok);
230*67e74705SXin Li
231*67e74705SXin Li // The _Pragma is lexically sound. Destringize according to C11 6.10.9.1:
232*67e74705SXin Li // "The string literal is destringized by deleting any encoding prefix,
233*67e74705SXin Li // deleting the leading and trailing double-quotes, replacing each escape
234*67e74705SXin Li // sequence \" by a double-quote, and replacing each escape sequence \\ by a
235*67e74705SXin Li // single backslash."
236*67e74705SXin Li if (StrVal[0] == 'L' || StrVal[0] == 'U' ||
237*67e74705SXin Li (StrVal[0] == 'u' && StrVal[1] != '8'))
238*67e74705SXin Li StrVal.erase(StrVal.begin());
239*67e74705SXin Li else if (StrVal[0] == 'u')
240*67e74705SXin Li StrVal.erase(StrVal.begin(), StrVal.begin() + 2);
241*67e74705SXin Li
242*67e74705SXin Li if (StrVal[0] == 'R') {
243*67e74705SXin Li // FIXME: C++11 does not specify how to handle raw-string-literals here.
244*67e74705SXin Li // We strip off the 'R', the quotes, the d-char-sequences, and the parens.
245*67e74705SXin Li assert(StrVal[1] == '"' && StrVal[StrVal.size() - 1] == '"' &&
246*67e74705SXin Li "Invalid raw string token!");
247*67e74705SXin Li
248*67e74705SXin Li // Measure the length of the d-char-sequence.
249*67e74705SXin Li unsigned NumDChars = 0;
250*67e74705SXin Li while (StrVal[2 + NumDChars] != '(') {
251*67e74705SXin Li assert(NumDChars < (StrVal.size() - 5) / 2 &&
252*67e74705SXin Li "Invalid raw string token!");
253*67e74705SXin Li ++NumDChars;
254*67e74705SXin Li }
255*67e74705SXin Li assert(StrVal[StrVal.size() - 2 - NumDChars] == ')');
256*67e74705SXin Li
257*67e74705SXin Li // Remove 'R " d-char-sequence' and 'd-char-sequence "'. We'll replace the
258*67e74705SXin Li // parens below.
259*67e74705SXin Li StrVal.erase(0, 2 + NumDChars);
260*67e74705SXin Li StrVal.erase(StrVal.size() - 1 - NumDChars);
261*67e74705SXin Li } else {
262*67e74705SXin Li assert(StrVal[0] == '"' && StrVal[StrVal.size()-1] == '"' &&
263*67e74705SXin Li "Invalid string token!");
264*67e74705SXin Li
265*67e74705SXin Li // Remove escaped quotes and escapes.
266*67e74705SXin Li unsigned ResultPos = 1;
267*67e74705SXin Li for (unsigned i = 1, e = StrVal.size() - 1; i != e; ++i) {
268*67e74705SXin Li // Skip escapes. \\ -> '\' and \" -> '"'.
269*67e74705SXin Li if (StrVal[i] == '\\' && i + 1 < e &&
270*67e74705SXin Li (StrVal[i + 1] == '\\' || StrVal[i + 1] == '"'))
271*67e74705SXin Li ++i;
272*67e74705SXin Li StrVal[ResultPos++] = StrVal[i];
273*67e74705SXin Li }
274*67e74705SXin Li StrVal.erase(StrVal.begin() + ResultPos, StrVal.end() - 1);
275*67e74705SXin Li }
276*67e74705SXin Li
277*67e74705SXin Li // Remove the front quote, replacing it with a space, so that the pragma
278*67e74705SXin Li // contents appear to have a space before them.
279*67e74705SXin Li StrVal[0] = ' ';
280*67e74705SXin Li
281*67e74705SXin Li // Replace the terminating quote with a \n.
282*67e74705SXin Li StrVal[StrVal.size()-1] = '\n';
283*67e74705SXin Li
284*67e74705SXin Li // Plop the string (including the newline and trailing null) into a buffer
285*67e74705SXin Li // where we can lex it.
286*67e74705SXin Li Token TmpTok;
287*67e74705SXin Li TmpTok.startToken();
288*67e74705SXin Li CreateString(StrVal, TmpTok);
289*67e74705SXin Li SourceLocation TokLoc = TmpTok.getLocation();
290*67e74705SXin Li
291*67e74705SXin Li // Make and enter a lexer object so that we lex and expand the tokens just
292*67e74705SXin Li // like any others.
293*67e74705SXin Li Lexer *TL = Lexer::Create_PragmaLexer(TokLoc, PragmaLoc, RParenLoc,
294*67e74705SXin Li StrVal.size(), *this);
295*67e74705SXin Li
296*67e74705SXin Li EnterSourceFileWithLexer(TL, nullptr);
297*67e74705SXin Li
298*67e74705SXin Li // With everything set up, lex this as a #pragma directive.
299*67e74705SXin Li HandlePragmaDirective(PragmaLoc, PIK__Pragma);
300*67e74705SXin Li
301*67e74705SXin Li // Finally, return whatever came after the pragma directive.
302*67e74705SXin Li return Lex(Tok);
303*67e74705SXin Li }
304*67e74705SXin Li
305*67e74705SXin Li /// HandleMicrosoft__pragma - Like Handle_Pragma except the pragma text
306*67e74705SXin Li /// is not enclosed within a string literal.
HandleMicrosoft__pragma(Token & Tok)307*67e74705SXin Li void Preprocessor::HandleMicrosoft__pragma(Token &Tok) {
308*67e74705SXin Li // Remember the pragma token location.
309*67e74705SXin Li SourceLocation PragmaLoc = Tok.getLocation();
310*67e74705SXin Li
311*67e74705SXin Li // Read the '('.
312*67e74705SXin Li Lex(Tok);
313*67e74705SXin Li if (Tok.isNot(tok::l_paren)) {
314*67e74705SXin Li Diag(PragmaLoc, diag::err__Pragma_malformed);
315*67e74705SXin Li return;
316*67e74705SXin Li }
317*67e74705SXin Li
318*67e74705SXin Li // Get the tokens enclosed within the __pragma(), as well as the final ')'.
319*67e74705SXin Li SmallVector<Token, 32> PragmaToks;
320*67e74705SXin Li int NumParens = 0;
321*67e74705SXin Li Lex(Tok);
322*67e74705SXin Li while (Tok.isNot(tok::eof)) {
323*67e74705SXin Li PragmaToks.push_back(Tok);
324*67e74705SXin Li if (Tok.is(tok::l_paren))
325*67e74705SXin Li NumParens++;
326*67e74705SXin Li else if (Tok.is(tok::r_paren) && NumParens-- == 0)
327*67e74705SXin Li break;
328*67e74705SXin Li Lex(Tok);
329*67e74705SXin Li }
330*67e74705SXin Li
331*67e74705SXin Li if (Tok.is(tok::eof)) {
332*67e74705SXin Li Diag(PragmaLoc, diag::err_unterminated___pragma);
333*67e74705SXin Li return;
334*67e74705SXin Li }
335*67e74705SXin Li
336*67e74705SXin Li PragmaToks.front().setFlag(Token::LeadingSpace);
337*67e74705SXin Li
338*67e74705SXin Li // Replace the ')' with an EOD to mark the end of the pragma.
339*67e74705SXin Li PragmaToks.back().setKind(tok::eod);
340*67e74705SXin Li
341*67e74705SXin Li Token *TokArray = new Token[PragmaToks.size()];
342*67e74705SXin Li std::copy(PragmaToks.begin(), PragmaToks.end(), TokArray);
343*67e74705SXin Li
344*67e74705SXin Li // Push the tokens onto the stack.
345*67e74705SXin Li EnterTokenStream(TokArray, PragmaToks.size(), true, true);
346*67e74705SXin Li
347*67e74705SXin Li // With everything set up, lex this as a #pragma directive.
348*67e74705SXin Li HandlePragmaDirective(PragmaLoc, PIK___pragma);
349*67e74705SXin Li
350*67e74705SXin Li // Finally, return whatever came after the pragma directive.
351*67e74705SXin Li return Lex(Tok);
352*67e74705SXin Li }
353*67e74705SXin Li
354*67e74705SXin Li /// HandlePragmaOnce - Handle \#pragma once. OnceTok is the 'once'.
355*67e74705SXin Li ///
HandlePragmaOnce(Token & OnceTok)356*67e74705SXin Li void Preprocessor::HandlePragmaOnce(Token &OnceTok) {
357*67e74705SXin Li if (isInPrimaryFile()) {
358*67e74705SXin Li Diag(OnceTok, diag::pp_pragma_once_in_main_file);
359*67e74705SXin Li return;
360*67e74705SXin Li }
361*67e74705SXin Li
362*67e74705SXin Li // Get the current file lexer we're looking at. Ignore _Pragma 'files' etc.
363*67e74705SXin Li // Mark the file as a once-only file now.
364*67e74705SXin Li HeaderInfo.MarkFileIncludeOnce(getCurrentFileLexer()->getFileEntry());
365*67e74705SXin Li }
366*67e74705SXin Li
HandlePragmaMark()367*67e74705SXin Li void Preprocessor::HandlePragmaMark() {
368*67e74705SXin Li assert(CurPPLexer && "No current lexer?");
369*67e74705SXin Li if (CurLexer)
370*67e74705SXin Li CurLexer->ReadToEndOfLine();
371*67e74705SXin Li else
372*67e74705SXin Li CurPTHLexer->DiscardToEndOfLine();
373*67e74705SXin Li }
374*67e74705SXin Li
375*67e74705SXin Li
376*67e74705SXin Li /// HandlePragmaPoison - Handle \#pragma GCC poison. PoisonTok is the 'poison'.
377*67e74705SXin Li ///
HandlePragmaPoison(Token & PoisonTok)378*67e74705SXin Li void Preprocessor::HandlePragmaPoison(Token &PoisonTok) {
379*67e74705SXin Li Token Tok;
380*67e74705SXin Li
381*67e74705SXin Li while (1) {
382*67e74705SXin Li // Read the next token to poison. While doing this, pretend that we are
383*67e74705SXin Li // skipping while reading the identifier to poison.
384*67e74705SXin Li // This avoids errors on code like:
385*67e74705SXin Li // #pragma GCC poison X
386*67e74705SXin Li // #pragma GCC poison X
387*67e74705SXin Li if (CurPPLexer) CurPPLexer->LexingRawMode = true;
388*67e74705SXin Li LexUnexpandedToken(Tok);
389*67e74705SXin Li if (CurPPLexer) CurPPLexer->LexingRawMode = false;
390*67e74705SXin Li
391*67e74705SXin Li // If we reached the end of line, we're done.
392*67e74705SXin Li if (Tok.is(tok::eod)) return;
393*67e74705SXin Li
394*67e74705SXin Li // Can only poison identifiers.
395*67e74705SXin Li if (Tok.isNot(tok::raw_identifier)) {
396*67e74705SXin Li Diag(Tok, diag::err_pp_invalid_poison);
397*67e74705SXin Li return;
398*67e74705SXin Li }
399*67e74705SXin Li
400*67e74705SXin Li // Look up the identifier info for the token. We disabled identifier lookup
401*67e74705SXin Li // by saying we're skipping contents, so we need to do this manually.
402*67e74705SXin Li IdentifierInfo *II = LookUpIdentifierInfo(Tok);
403*67e74705SXin Li
404*67e74705SXin Li // Already poisoned.
405*67e74705SXin Li if (II->isPoisoned()) continue;
406*67e74705SXin Li
407*67e74705SXin Li // If this is a macro identifier, emit a warning.
408*67e74705SXin Li if (isMacroDefined(II))
409*67e74705SXin Li Diag(Tok, diag::pp_poisoning_existing_macro);
410*67e74705SXin Li
411*67e74705SXin Li // Finally, poison it!
412*67e74705SXin Li II->setIsPoisoned();
413*67e74705SXin Li if (II->isFromAST())
414*67e74705SXin Li II->setChangedSinceDeserialization();
415*67e74705SXin Li }
416*67e74705SXin Li }
417*67e74705SXin Li
418*67e74705SXin Li /// HandlePragmaSystemHeader - Implement \#pragma GCC system_header. We know
419*67e74705SXin Li /// that the whole directive has been parsed.
HandlePragmaSystemHeader(Token & SysHeaderTok)420*67e74705SXin Li void Preprocessor::HandlePragmaSystemHeader(Token &SysHeaderTok) {
421*67e74705SXin Li if (isInPrimaryFile()) {
422*67e74705SXin Li Diag(SysHeaderTok, diag::pp_pragma_sysheader_in_main_file);
423*67e74705SXin Li return;
424*67e74705SXin Li }
425*67e74705SXin Li
426*67e74705SXin Li // Get the current file lexer we're looking at. Ignore _Pragma 'files' etc.
427*67e74705SXin Li PreprocessorLexer *TheLexer = getCurrentFileLexer();
428*67e74705SXin Li
429*67e74705SXin Li // Mark the file as a system header.
430*67e74705SXin Li HeaderInfo.MarkFileSystemHeader(TheLexer->getFileEntry());
431*67e74705SXin Li
432*67e74705SXin Li
433*67e74705SXin Li PresumedLoc PLoc = SourceMgr.getPresumedLoc(SysHeaderTok.getLocation());
434*67e74705SXin Li if (PLoc.isInvalid())
435*67e74705SXin Li return;
436*67e74705SXin Li
437*67e74705SXin Li unsigned FilenameID = SourceMgr.getLineTableFilenameID(PLoc.getFilename());
438*67e74705SXin Li
439*67e74705SXin Li // Notify the client, if desired, that we are in a new source file.
440*67e74705SXin Li if (Callbacks)
441*67e74705SXin Li Callbacks->FileChanged(SysHeaderTok.getLocation(),
442*67e74705SXin Li PPCallbacks::SystemHeaderPragma, SrcMgr::C_System);
443*67e74705SXin Li
444*67e74705SXin Li // Emit a line marker. This will change any source locations from this point
445*67e74705SXin Li // forward to realize they are in a system header.
446*67e74705SXin Li // Create a line note with this information.
447*67e74705SXin Li SourceMgr.AddLineNote(SysHeaderTok.getLocation(), PLoc.getLine()+1,
448*67e74705SXin Li FilenameID, /*IsEntry=*/false, /*IsExit=*/false,
449*67e74705SXin Li /*IsSystem=*/true, /*IsExternC=*/false);
450*67e74705SXin Li }
451*67e74705SXin Li
452*67e74705SXin Li /// HandlePragmaDependency - Handle \#pragma GCC dependency "foo" blah.
453*67e74705SXin Li ///
HandlePragmaDependency(Token & DependencyTok)454*67e74705SXin Li void Preprocessor::HandlePragmaDependency(Token &DependencyTok) {
455*67e74705SXin Li Token FilenameTok;
456*67e74705SXin Li CurPPLexer->LexIncludeFilename(FilenameTok);
457*67e74705SXin Li
458*67e74705SXin Li // If the token kind is EOD, the error has already been diagnosed.
459*67e74705SXin Li if (FilenameTok.is(tok::eod))
460*67e74705SXin Li return;
461*67e74705SXin Li
462*67e74705SXin Li // Reserve a buffer to get the spelling.
463*67e74705SXin Li SmallString<128> FilenameBuffer;
464*67e74705SXin Li bool Invalid = false;
465*67e74705SXin Li StringRef Filename = getSpelling(FilenameTok, FilenameBuffer, &Invalid);
466*67e74705SXin Li if (Invalid)
467*67e74705SXin Li return;
468*67e74705SXin Li
469*67e74705SXin Li bool isAngled =
470*67e74705SXin Li GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
471*67e74705SXin Li // If GetIncludeFilenameSpelling set the start ptr to null, there was an
472*67e74705SXin Li // error.
473*67e74705SXin Li if (Filename.empty())
474*67e74705SXin Li return;
475*67e74705SXin Li
476*67e74705SXin Li // Search include directories for this file.
477*67e74705SXin Li const DirectoryLookup *CurDir;
478*67e74705SXin Li const FileEntry *File =
479*67e74705SXin Li LookupFile(FilenameTok.getLocation(), Filename, isAngled, nullptr,
480*67e74705SXin Li nullptr, CurDir, nullptr, nullptr, nullptr);
481*67e74705SXin Li if (!File) {
482*67e74705SXin Li if (!SuppressIncludeNotFoundError)
483*67e74705SXin Li Diag(FilenameTok, diag::err_pp_file_not_found) << Filename;
484*67e74705SXin Li return;
485*67e74705SXin Li }
486*67e74705SXin Li
487*67e74705SXin Li const FileEntry *CurFile = getCurrentFileLexer()->getFileEntry();
488*67e74705SXin Li
489*67e74705SXin Li // If this file is older than the file it depends on, emit a diagnostic.
490*67e74705SXin Li if (CurFile && CurFile->getModificationTime() < File->getModificationTime()) {
491*67e74705SXin Li // Lex tokens at the end of the message and include them in the message.
492*67e74705SXin Li std::string Message;
493*67e74705SXin Li Lex(DependencyTok);
494*67e74705SXin Li while (DependencyTok.isNot(tok::eod)) {
495*67e74705SXin Li Message += getSpelling(DependencyTok) + " ";
496*67e74705SXin Li Lex(DependencyTok);
497*67e74705SXin Li }
498*67e74705SXin Li
499*67e74705SXin Li // Remove the trailing ' ' if present.
500*67e74705SXin Li if (!Message.empty())
501*67e74705SXin Li Message.erase(Message.end()-1);
502*67e74705SXin Li Diag(FilenameTok, diag::pp_out_of_date_dependency) << Message;
503*67e74705SXin Li }
504*67e74705SXin Li }
505*67e74705SXin Li
506*67e74705SXin Li /// ParsePragmaPushOrPopMacro - Handle parsing of pragma push_macro/pop_macro.
507*67e74705SXin Li /// Return the IdentifierInfo* associated with the macro to push or pop.
ParsePragmaPushOrPopMacro(Token & Tok)508*67e74705SXin Li IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) {
509*67e74705SXin Li // Remember the pragma token location.
510*67e74705SXin Li Token PragmaTok = Tok;
511*67e74705SXin Li
512*67e74705SXin Li // Read the '('.
513*67e74705SXin Li Lex(Tok);
514*67e74705SXin Li if (Tok.isNot(tok::l_paren)) {
515*67e74705SXin Li Diag(PragmaTok.getLocation(), diag::err_pragma_push_pop_macro_malformed)
516*67e74705SXin Li << getSpelling(PragmaTok);
517*67e74705SXin Li return nullptr;
518*67e74705SXin Li }
519*67e74705SXin Li
520*67e74705SXin Li // Read the macro name string.
521*67e74705SXin Li Lex(Tok);
522*67e74705SXin Li if (Tok.isNot(tok::string_literal)) {
523*67e74705SXin Li Diag(PragmaTok.getLocation(), diag::err_pragma_push_pop_macro_malformed)
524*67e74705SXin Li << getSpelling(PragmaTok);
525*67e74705SXin Li return nullptr;
526*67e74705SXin Li }
527*67e74705SXin Li
528*67e74705SXin Li if (Tok.hasUDSuffix()) {
529*67e74705SXin Li Diag(Tok, diag::err_invalid_string_udl);
530*67e74705SXin Li return nullptr;
531*67e74705SXin Li }
532*67e74705SXin Li
533*67e74705SXin Li // Remember the macro string.
534*67e74705SXin Li std::string StrVal = getSpelling(Tok);
535*67e74705SXin Li
536*67e74705SXin Li // Read the ')'.
537*67e74705SXin Li Lex(Tok);
538*67e74705SXin Li if (Tok.isNot(tok::r_paren)) {
539*67e74705SXin Li Diag(PragmaTok.getLocation(), diag::err_pragma_push_pop_macro_malformed)
540*67e74705SXin Li << getSpelling(PragmaTok);
541*67e74705SXin Li return nullptr;
542*67e74705SXin Li }
543*67e74705SXin Li
544*67e74705SXin Li assert(StrVal[0] == '"' && StrVal[StrVal.size()-1] == '"' &&
545*67e74705SXin Li "Invalid string token!");
546*67e74705SXin Li
547*67e74705SXin Li // Create a Token from the string.
548*67e74705SXin Li Token MacroTok;
549*67e74705SXin Li MacroTok.startToken();
550*67e74705SXin Li MacroTok.setKind(tok::raw_identifier);
551*67e74705SXin Li CreateString(StringRef(&StrVal[1], StrVal.size() - 2), MacroTok);
552*67e74705SXin Li
553*67e74705SXin Li // Get the IdentifierInfo of MacroToPushTok.
554*67e74705SXin Li return LookUpIdentifierInfo(MacroTok);
555*67e74705SXin Li }
556*67e74705SXin Li
557*67e74705SXin Li /// \brief Handle \#pragma push_macro.
558*67e74705SXin Li ///
559*67e74705SXin Li /// The syntax is:
560*67e74705SXin Li /// \code
561*67e74705SXin Li /// #pragma push_macro("macro")
562*67e74705SXin Li /// \endcode
HandlePragmaPushMacro(Token & PushMacroTok)563*67e74705SXin Li void Preprocessor::HandlePragmaPushMacro(Token &PushMacroTok) {
564*67e74705SXin Li // Parse the pragma directive and get the macro IdentifierInfo*.
565*67e74705SXin Li IdentifierInfo *IdentInfo = ParsePragmaPushOrPopMacro(PushMacroTok);
566*67e74705SXin Li if (!IdentInfo) return;
567*67e74705SXin Li
568*67e74705SXin Li // Get the MacroInfo associated with IdentInfo.
569*67e74705SXin Li MacroInfo *MI = getMacroInfo(IdentInfo);
570*67e74705SXin Li
571*67e74705SXin Li if (MI) {
572*67e74705SXin Li // Allow the original MacroInfo to be redefined later.
573*67e74705SXin Li MI->setIsAllowRedefinitionsWithoutWarning(true);
574*67e74705SXin Li }
575*67e74705SXin Li
576*67e74705SXin Li // Push the cloned MacroInfo so we can retrieve it later.
577*67e74705SXin Li PragmaPushMacroInfo[IdentInfo].push_back(MI);
578*67e74705SXin Li }
579*67e74705SXin Li
580*67e74705SXin Li /// \brief Handle \#pragma pop_macro.
581*67e74705SXin Li ///
582*67e74705SXin Li /// The syntax is:
583*67e74705SXin Li /// \code
584*67e74705SXin Li /// #pragma pop_macro("macro")
585*67e74705SXin Li /// \endcode
HandlePragmaPopMacro(Token & PopMacroTok)586*67e74705SXin Li void Preprocessor::HandlePragmaPopMacro(Token &PopMacroTok) {
587*67e74705SXin Li SourceLocation MessageLoc = PopMacroTok.getLocation();
588*67e74705SXin Li
589*67e74705SXin Li // Parse the pragma directive and get the macro IdentifierInfo*.
590*67e74705SXin Li IdentifierInfo *IdentInfo = ParsePragmaPushOrPopMacro(PopMacroTok);
591*67e74705SXin Li if (!IdentInfo) return;
592*67e74705SXin Li
593*67e74705SXin Li // Find the vector<MacroInfo*> associated with the macro.
594*67e74705SXin Li llvm::DenseMap<IdentifierInfo*, std::vector<MacroInfo*> >::iterator iter =
595*67e74705SXin Li PragmaPushMacroInfo.find(IdentInfo);
596*67e74705SXin Li if (iter != PragmaPushMacroInfo.end()) {
597*67e74705SXin Li // Forget the MacroInfo currently associated with IdentInfo.
598*67e74705SXin Li if (MacroInfo *MI = getMacroInfo(IdentInfo)) {
599*67e74705SXin Li if (MI->isWarnIfUnused())
600*67e74705SXin Li WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
601*67e74705SXin Li appendMacroDirective(IdentInfo, AllocateUndefMacroDirective(MessageLoc));
602*67e74705SXin Li }
603*67e74705SXin Li
604*67e74705SXin Li // Get the MacroInfo we want to reinstall.
605*67e74705SXin Li MacroInfo *MacroToReInstall = iter->second.back();
606*67e74705SXin Li
607*67e74705SXin Li if (MacroToReInstall)
608*67e74705SXin Li // Reinstall the previously pushed macro.
609*67e74705SXin Li appendDefMacroDirective(IdentInfo, MacroToReInstall, MessageLoc);
610*67e74705SXin Li
611*67e74705SXin Li // Pop PragmaPushMacroInfo stack.
612*67e74705SXin Li iter->second.pop_back();
613*67e74705SXin Li if (iter->second.size() == 0)
614*67e74705SXin Li PragmaPushMacroInfo.erase(iter);
615*67e74705SXin Li } else {
616*67e74705SXin Li Diag(MessageLoc, diag::warn_pragma_pop_macro_no_push)
617*67e74705SXin Li << IdentInfo->getName();
618*67e74705SXin Li }
619*67e74705SXin Li }
620*67e74705SXin Li
HandlePragmaIncludeAlias(Token & Tok)621*67e74705SXin Li void Preprocessor::HandlePragmaIncludeAlias(Token &Tok) {
622*67e74705SXin Li // We will either get a quoted filename or a bracketed filename, and we
623*67e74705SXin Li // have to track which we got. The first filename is the source name,
624*67e74705SXin Li // and the second name is the mapped filename. If the first is quoted,
625*67e74705SXin Li // the second must be as well (cannot mix and match quotes and brackets).
626*67e74705SXin Li
627*67e74705SXin Li // Get the open paren
628*67e74705SXin Li Lex(Tok);
629*67e74705SXin Li if (Tok.isNot(tok::l_paren)) {
630*67e74705SXin Li Diag(Tok, diag::warn_pragma_include_alias_expected) << "(";
631*67e74705SXin Li return;
632*67e74705SXin Li }
633*67e74705SXin Li
634*67e74705SXin Li // We expect either a quoted string literal, or a bracketed name
635*67e74705SXin Li Token SourceFilenameTok;
636*67e74705SXin Li CurPPLexer->LexIncludeFilename(SourceFilenameTok);
637*67e74705SXin Li if (SourceFilenameTok.is(tok::eod)) {
638*67e74705SXin Li // The diagnostic has already been handled
639*67e74705SXin Li return;
640*67e74705SXin Li }
641*67e74705SXin Li
642*67e74705SXin Li StringRef SourceFileName;
643*67e74705SXin Li SmallString<128> FileNameBuffer;
644*67e74705SXin Li if (SourceFilenameTok.is(tok::string_literal) ||
645*67e74705SXin Li SourceFilenameTok.is(tok::angle_string_literal)) {
646*67e74705SXin Li SourceFileName = getSpelling(SourceFilenameTok, FileNameBuffer);
647*67e74705SXin Li } else if (SourceFilenameTok.is(tok::less)) {
648*67e74705SXin Li // This could be a path instead of just a name
649*67e74705SXin Li FileNameBuffer.push_back('<');
650*67e74705SXin Li SourceLocation End;
651*67e74705SXin Li if (ConcatenateIncludeName(FileNameBuffer, End))
652*67e74705SXin Li return; // Diagnostic already emitted
653*67e74705SXin Li SourceFileName = FileNameBuffer;
654*67e74705SXin Li } else {
655*67e74705SXin Li Diag(Tok, diag::warn_pragma_include_alias_expected_filename);
656*67e74705SXin Li return;
657*67e74705SXin Li }
658*67e74705SXin Li FileNameBuffer.clear();
659*67e74705SXin Li
660*67e74705SXin Li // Now we expect a comma, followed by another include name
661*67e74705SXin Li Lex(Tok);
662*67e74705SXin Li if (Tok.isNot(tok::comma)) {
663*67e74705SXin Li Diag(Tok, diag::warn_pragma_include_alias_expected) << ",";
664*67e74705SXin Li return;
665*67e74705SXin Li }
666*67e74705SXin Li
667*67e74705SXin Li Token ReplaceFilenameTok;
668*67e74705SXin Li CurPPLexer->LexIncludeFilename(ReplaceFilenameTok);
669*67e74705SXin Li if (ReplaceFilenameTok.is(tok::eod)) {
670*67e74705SXin Li // The diagnostic has already been handled
671*67e74705SXin Li return;
672*67e74705SXin Li }
673*67e74705SXin Li
674*67e74705SXin Li StringRef ReplaceFileName;
675*67e74705SXin Li if (ReplaceFilenameTok.is(tok::string_literal) ||
676*67e74705SXin Li ReplaceFilenameTok.is(tok::angle_string_literal)) {
677*67e74705SXin Li ReplaceFileName = getSpelling(ReplaceFilenameTok, FileNameBuffer);
678*67e74705SXin Li } else if (ReplaceFilenameTok.is(tok::less)) {
679*67e74705SXin Li // This could be a path instead of just a name
680*67e74705SXin Li FileNameBuffer.push_back('<');
681*67e74705SXin Li SourceLocation End;
682*67e74705SXin Li if (ConcatenateIncludeName(FileNameBuffer, End))
683*67e74705SXin Li return; // Diagnostic already emitted
684*67e74705SXin Li ReplaceFileName = FileNameBuffer;
685*67e74705SXin Li } else {
686*67e74705SXin Li Diag(Tok, diag::warn_pragma_include_alias_expected_filename);
687*67e74705SXin Li return;
688*67e74705SXin Li }
689*67e74705SXin Li
690*67e74705SXin Li // Finally, we expect the closing paren
691*67e74705SXin Li Lex(Tok);
692*67e74705SXin Li if (Tok.isNot(tok::r_paren)) {
693*67e74705SXin Li Diag(Tok, diag::warn_pragma_include_alias_expected) << ")";
694*67e74705SXin Li return;
695*67e74705SXin Li }
696*67e74705SXin Li
697*67e74705SXin Li // Now that we have the source and target filenames, we need to make sure
698*67e74705SXin Li // they're both of the same type (angled vs non-angled)
699*67e74705SXin Li StringRef OriginalSource = SourceFileName;
700*67e74705SXin Li
701*67e74705SXin Li bool SourceIsAngled =
702*67e74705SXin Li GetIncludeFilenameSpelling(SourceFilenameTok.getLocation(),
703*67e74705SXin Li SourceFileName);
704*67e74705SXin Li bool ReplaceIsAngled =
705*67e74705SXin Li GetIncludeFilenameSpelling(ReplaceFilenameTok.getLocation(),
706*67e74705SXin Li ReplaceFileName);
707*67e74705SXin Li if (!SourceFileName.empty() && !ReplaceFileName.empty() &&
708*67e74705SXin Li (SourceIsAngled != ReplaceIsAngled)) {
709*67e74705SXin Li unsigned int DiagID;
710*67e74705SXin Li if (SourceIsAngled)
711*67e74705SXin Li DiagID = diag::warn_pragma_include_alias_mismatch_angle;
712*67e74705SXin Li else
713*67e74705SXin Li DiagID = diag::warn_pragma_include_alias_mismatch_quote;
714*67e74705SXin Li
715*67e74705SXin Li Diag(SourceFilenameTok.getLocation(), DiagID)
716*67e74705SXin Li << SourceFileName
717*67e74705SXin Li << ReplaceFileName;
718*67e74705SXin Li
719*67e74705SXin Li return;
720*67e74705SXin Li }
721*67e74705SXin Li
722*67e74705SXin Li // Now we can let the include handler know about this mapping
723*67e74705SXin Li getHeaderSearchInfo().AddIncludeAlias(OriginalSource, ReplaceFileName);
724*67e74705SXin Li }
725*67e74705SXin Li
726*67e74705SXin Li /// AddPragmaHandler - Add the specified pragma handler to the preprocessor.
727*67e74705SXin Li /// If 'Namespace' is non-null, then it is a token required to exist on the
728*67e74705SXin Li /// pragma line before the pragma string starts, e.g. "STDC" or "GCC".
AddPragmaHandler(StringRef Namespace,PragmaHandler * Handler)729*67e74705SXin Li void Preprocessor::AddPragmaHandler(StringRef Namespace,
730*67e74705SXin Li PragmaHandler *Handler) {
731*67e74705SXin Li PragmaNamespace *InsertNS = PragmaHandlers.get();
732*67e74705SXin Li
733*67e74705SXin Li // If this is specified to be in a namespace, step down into it.
734*67e74705SXin Li if (!Namespace.empty()) {
735*67e74705SXin Li // If there is already a pragma handler with the name of this namespace,
736*67e74705SXin Li // we either have an error (directive with the same name as a namespace) or
737*67e74705SXin Li // we already have the namespace to insert into.
738*67e74705SXin Li if (PragmaHandler *Existing = PragmaHandlers->FindHandler(Namespace)) {
739*67e74705SXin Li InsertNS = Existing->getIfNamespace();
740*67e74705SXin Li assert(InsertNS != nullptr && "Cannot have a pragma namespace and pragma"
741*67e74705SXin Li " handler with the same name!");
742*67e74705SXin Li } else {
743*67e74705SXin Li // Otherwise, this namespace doesn't exist yet, create and insert the
744*67e74705SXin Li // handler for it.
745*67e74705SXin Li InsertNS = new PragmaNamespace(Namespace);
746*67e74705SXin Li PragmaHandlers->AddPragma(InsertNS);
747*67e74705SXin Li }
748*67e74705SXin Li }
749*67e74705SXin Li
750*67e74705SXin Li // Check to make sure we don't already have a pragma for this identifier.
751*67e74705SXin Li assert(!InsertNS->FindHandler(Handler->getName()) &&
752*67e74705SXin Li "Pragma handler already exists for this identifier!");
753*67e74705SXin Li InsertNS->AddPragma(Handler);
754*67e74705SXin Li }
755*67e74705SXin Li
756*67e74705SXin Li /// RemovePragmaHandler - Remove the specific pragma handler from the
757*67e74705SXin Li /// preprocessor. If \arg Namespace is non-null, then it should be the
758*67e74705SXin Li /// namespace that \arg Handler was added to. It is an error to remove
759*67e74705SXin Li /// a handler that has not been registered.
RemovePragmaHandler(StringRef Namespace,PragmaHandler * Handler)760*67e74705SXin Li void Preprocessor::RemovePragmaHandler(StringRef Namespace,
761*67e74705SXin Li PragmaHandler *Handler) {
762*67e74705SXin Li PragmaNamespace *NS = PragmaHandlers.get();
763*67e74705SXin Li
764*67e74705SXin Li // If this is specified to be in a namespace, step down into it.
765*67e74705SXin Li if (!Namespace.empty()) {
766*67e74705SXin Li PragmaHandler *Existing = PragmaHandlers->FindHandler(Namespace);
767*67e74705SXin Li assert(Existing && "Namespace containing handler does not exist!");
768*67e74705SXin Li
769*67e74705SXin Li NS = Existing->getIfNamespace();
770*67e74705SXin Li assert(NS && "Invalid namespace, registered as a regular pragma handler!");
771*67e74705SXin Li }
772*67e74705SXin Li
773*67e74705SXin Li NS->RemovePragmaHandler(Handler);
774*67e74705SXin Li
775*67e74705SXin Li // If this is a non-default namespace and it is now empty, remove it.
776*67e74705SXin Li if (NS != PragmaHandlers.get() && NS->IsEmpty()) {
777*67e74705SXin Li PragmaHandlers->RemovePragmaHandler(NS);
778*67e74705SXin Li delete NS;
779*67e74705SXin Li }
780*67e74705SXin Li }
781*67e74705SXin Li
LexOnOffSwitch(tok::OnOffSwitch & Result)782*67e74705SXin Li bool Preprocessor::LexOnOffSwitch(tok::OnOffSwitch &Result) {
783*67e74705SXin Li Token Tok;
784*67e74705SXin Li LexUnexpandedToken(Tok);
785*67e74705SXin Li
786*67e74705SXin Li if (Tok.isNot(tok::identifier)) {
787*67e74705SXin Li Diag(Tok, diag::ext_on_off_switch_syntax);
788*67e74705SXin Li return true;
789*67e74705SXin Li }
790*67e74705SXin Li IdentifierInfo *II = Tok.getIdentifierInfo();
791*67e74705SXin Li if (II->isStr("ON"))
792*67e74705SXin Li Result = tok::OOS_ON;
793*67e74705SXin Li else if (II->isStr("OFF"))
794*67e74705SXin Li Result = tok::OOS_OFF;
795*67e74705SXin Li else if (II->isStr("DEFAULT"))
796*67e74705SXin Li Result = tok::OOS_DEFAULT;
797*67e74705SXin Li else {
798*67e74705SXin Li Diag(Tok, diag::ext_on_off_switch_syntax);
799*67e74705SXin Li return true;
800*67e74705SXin Li }
801*67e74705SXin Li
802*67e74705SXin Li // Verify that this is followed by EOD.
803*67e74705SXin Li LexUnexpandedToken(Tok);
804*67e74705SXin Li if (Tok.isNot(tok::eod))
805*67e74705SXin Li Diag(Tok, diag::ext_pragma_syntax_eod);
806*67e74705SXin Li return false;
807*67e74705SXin Li }
808*67e74705SXin Li
809*67e74705SXin Li namespace {
810*67e74705SXin Li /// PragmaOnceHandler - "\#pragma once" marks the file as atomically included.
811*67e74705SXin Li struct PragmaOnceHandler : public PragmaHandler {
PragmaOnceHandler__anon325163220211::PragmaOnceHandler812*67e74705SXin Li PragmaOnceHandler() : PragmaHandler("once") {}
HandlePragma__anon325163220211::PragmaOnceHandler813*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
814*67e74705SXin Li Token &OnceTok) override {
815*67e74705SXin Li PP.CheckEndOfDirective("pragma once");
816*67e74705SXin Li PP.HandlePragmaOnce(OnceTok);
817*67e74705SXin Li }
818*67e74705SXin Li };
819*67e74705SXin Li
820*67e74705SXin Li /// PragmaMarkHandler - "\#pragma mark ..." is ignored by the compiler, and the
821*67e74705SXin Li /// rest of the line is not lexed.
822*67e74705SXin Li struct PragmaMarkHandler : public PragmaHandler {
PragmaMarkHandler__anon325163220211::PragmaMarkHandler823*67e74705SXin Li PragmaMarkHandler() : PragmaHandler("mark") {}
HandlePragma__anon325163220211::PragmaMarkHandler824*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
825*67e74705SXin Li Token &MarkTok) override {
826*67e74705SXin Li PP.HandlePragmaMark();
827*67e74705SXin Li }
828*67e74705SXin Li };
829*67e74705SXin Li
830*67e74705SXin Li /// PragmaPoisonHandler - "\#pragma poison x" marks x as not usable.
831*67e74705SXin Li struct PragmaPoisonHandler : public PragmaHandler {
PragmaPoisonHandler__anon325163220211::PragmaPoisonHandler832*67e74705SXin Li PragmaPoisonHandler() : PragmaHandler("poison") {}
HandlePragma__anon325163220211::PragmaPoisonHandler833*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
834*67e74705SXin Li Token &PoisonTok) override {
835*67e74705SXin Li PP.HandlePragmaPoison(PoisonTok);
836*67e74705SXin Li }
837*67e74705SXin Li };
838*67e74705SXin Li
839*67e74705SXin Li /// PragmaSystemHeaderHandler - "\#pragma system_header" marks the current file
840*67e74705SXin Li /// as a system header, which silences warnings in it.
841*67e74705SXin Li struct PragmaSystemHeaderHandler : public PragmaHandler {
PragmaSystemHeaderHandler__anon325163220211::PragmaSystemHeaderHandler842*67e74705SXin Li PragmaSystemHeaderHandler() : PragmaHandler("system_header") {}
HandlePragma__anon325163220211::PragmaSystemHeaderHandler843*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
844*67e74705SXin Li Token &SHToken) override {
845*67e74705SXin Li PP.HandlePragmaSystemHeader(SHToken);
846*67e74705SXin Li PP.CheckEndOfDirective("pragma");
847*67e74705SXin Li }
848*67e74705SXin Li };
849*67e74705SXin Li struct PragmaDependencyHandler : public PragmaHandler {
PragmaDependencyHandler__anon325163220211::PragmaDependencyHandler850*67e74705SXin Li PragmaDependencyHandler() : PragmaHandler("dependency") {}
HandlePragma__anon325163220211::PragmaDependencyHandler851*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
852*67e74705SXin Li Token &DepToken) override {
853*67e74705SXin Li PP.HandlePragmaDependency(DepToken);
854*67e74705SXin Li }
855*67e74705SXin Li };
856*67e74705SXin Li
857*67e74705SXin Li struct PragmaDebugHandler : public PragmaHandler {
PragmaDebugHandler__anon325163220211::PragmaDebugHandler858*67e74705SXin Li PragmaDebugHandler() : PragmaHandler("__debug") {}
HandlePragma__anon325163220211::PragmaDebugHandler859*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
860*67e74705SXin Li Token &DepToken) override {
861*67e74705SXin Li Token Tok;
862*67e74705SXin Li PP.LexUnexpandedToken(Tok);
863*67e74705SXin Li if (Tok.isNot(tok::identifier)) {
864*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_diagnostic_invalid);
865*67e74705SXin Li return;
866*67e74705SXin Li }
867*67e74705SXin Li IdentifierInfo *II = Tok.getIdentifierInfo();
868*67e74705SXin Li
869*67e74705SXin Li if (II->isStr("assert")) {
870*67e74705SXin Li llvm_unreachable("This is an assertion!");
871*67e74705SXin Li } else if (II->isStr("crash")) {
872*67e74705SXin Li LLVM_BUILTIN_TRAP;
873*67e74705SXin Li } else if (II->isStr("parser_crash")) {
874*67e74705SXin Li Token Crasher;
875*67e74705SXin Li Crasher.startToken();
876*67e74705SXin Li Crasher.setKind(tok::annot_pragma_parser_crash);
877*67e74705SXin Li Crasher.setAnnotationRange(SourceRange(Tok.getLocation()));
878*67e74705SXin Li PP.EnterToken(Crasher);
879*67e74705SXin Li } else if (II->isStr("dump")) {
880*67e74705SXin Li Token Identifier;
881*67e74705SXin Li PP.LexUnexpandedToken(Identifier);
882*67e74705SXin Li if (auto *DumpII = Identifier.getIdentifierInfo()) {
883*67e74705SXin Li Token DumpAnnot;
884*67e74705SXin Li DumpAnnot.startToken();
885*67e74705SXin Li DumpAnnot.setKind(tok::annot_pragma_dump);
886*67e74705SXin Li DumpAnnot.setAnnotationRange(
887*67e74705SXin Li SourceRange(Tok.getLocation(), Identifier.getLocation()));
888*67e74705SXin Li DumpAnnot.setAnnotationValue(DumpII);
889*67e74705SXin Li PP.DiscardUntilEndOfDirective();
890*67e74705SXin Li PP.EnterToken(DumpAnnot);
891*67e74705SXin Li } else {
892*67e74705SXin Li PP.Diag(Identifier, diag::warn_pragma_debug_missing_argument)
893*67e74705SXin Li << II->getName();
894*67e74705SXin Li }
895*67e74705SXin Li } else if (II->isStr("llvm_fatal_error")) {
896*67e74705SXin Li llvm::report_fatal_error("#pragma clang __debug llvm_fatal_error");
897*67e74705SXin Li } else if (II->isStr("llvm_unreachable")) {
898*67e74705SXin Li llvm_unreachable("#pragma clang __debug llvm_unreachable");
899*67e74705SXin Li } else if (II->isStr("macro")) {
900*67e74705SXin Li Token MacroName;
901*67e74705SXin Li PP.LexUnexpandedToken(MacroName);
902*67e74705SXin Li auto *MacroII = MacroName.getIdentifierInfo();
903*67e74705SXin Li if (MacroII)
904*67e74705SXin Li PP.dumpMacroInfo(MacroII);
905*67e74705SXin Li else
906*67e74705SXin Li PP.Diag(MacroName, diag::warn_pragma_debug_missing_argument)
907*67e74705SXin Li << II->getName();
908*67e74705SXin Li } else if (II->isStr("overflow_stack")) {
909*67e74705SXin Li DebugOverflowStack();
910*67e74705SXin Li } else if (II->isStr("handle_crash")) {
911*67e74705SXin Li llvm::CrashRecoveryContext *CRC =llvm::CrashRecoveryContext::GetCurrent();
912*67e74705SXin Li if (CRC)
913*67e74705SXin Li CRC->HandleCrash();
914*67e74705SXin Li } else if (II->isStr("captured")) {
915*67e74705SXin Li HandleCaptured(PP);
916*67e74705SXin Li } else {
917*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_debug_unexpected_command)
918*67e74705SXin Li << II->getName();
919*67e74705SXin Li }
920*67e74705SXin Li
921*67e74705SXin Li PPCallbacks *Callbacks = PP.getPPCallbacks();
922*67e74705SXin Li if (Callbacks)
923*67e74705SXin Li Callbacks->PragmaDebug(Tok.getLocation(), II->getName());
924*67e74705SXin Li }
925*67e74705SXin Li
HandleCaptured__anon325163220211::PragmaDebugHandler926*67e74705SXin Li void HandleCaptured(Preprocessor &PP) {
927*67e74705SXin Li // Skip if emitting preprocessed output.
928*67e74705SXin Li if (PP.isPreprocessedOutput())
929*67e74705SXin Li return;
930*67e74705SXin Li
931*67e74705SXin Li Token Tok;
932*67e74705SXin Li PP.LexUnexpandedToken(Tok);
933*67e74705SXin Li
934*67e74705SXin Li if (Tok.isNot(tok::eod)) {
935*67e74705SXin Li PP.Diag(Tok, diag::ext_pp_extra_tokens_at_eol)
936*67e74705SXin Li << "pragma clang __debug captured";
937*67e74705SXin Li return;
938*67e74705SXin Li }
939*67e74705SXin Li
940*67e74705SXin Li SourceLocation NameLoc = Tok.getLocation();
941*67e74705SXin Li MutableArrayRef<Token> Toks(
942*67e74705SXin Li PP.getPreprocessorAllocator().Allocate<Token>(1), 1);
943*67e74705SXin Li Toks[0].startToken();
944*67e74705SXin Li Toks[0].setKind(tok::annot_pragma_captured);
945*67e74705SXin Li Toks[0].setLocation(NameLoc);
946*67e74705SXin Li
947*67e74705SXin Li PP.EnterTokenStream(Toks, /*DisableMacroExpansion=*/true);
948*67e74705SXin Li }
949*67e74705SXin Li
950*67e74705SXin Li // Disable MSVC warning about runtime stack overflow.
951*67e74705SXin Li #ifdef _MSC_VER
952*67e74705SXin Li #pragma warning(disable : 4717)
953*67e74705SXin Li #endif
DebugOverflowStack__anon325163220211::PragmaDebugHandler954*67e74705SXin Li static void DebugOverflowStack() {
955*67e74705SXin Li void (*volatile Self)() = DebugOverflowStack;
956*67e74705SXin Li Self();
957*67e74705SXin Li }
958*67e74705SXin Li #ifdef _MSC_VER
959*67e74705SXin Li #pragma warning(default : 4717)
960*67e74705SXin Li #endif
961*67e74705SXin Li
962*67e74705SXin Li };
963*67e74705SXin Li
964*67e74705SXin Li /// PragmaDiagnosticHandler - e.g. '\#pragma GCC diagnostic ignored "-Wformat"'
965*67e74705SXin Li struct PragmaDiagnosticHandler : public PragmaHandler {
966*67e74705SXin Li private:
967*67e74705SXin Li const char *Namespace;
968*67e74705SXin Li public:
PragmaDiagnosticHandler__anon325163220211::PragmaDiagnosticHandler969*67e74705SXin Li explicit PragmaDiagnosticHandler(const char *NS) :
970*67e74705SXin Li PragmaHandler("diagnostic"), Namespace(NS) {}
HandlePragma__anon325163220211::PragmaDiagnosticHandler971*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
972*67e74705SXin Li Token &DiagToken) override {
973*67e74705SXin Li SourceLocation DiagLoc = DiagToken.getLocation();
974*67e74705SXin Li Token Tok;
975*67e74705SXin Li PP.LexUnexpandedToken(Tok);
976*67e74705SXin Li if (Tok.isNot(tok::identifier)) {
977*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_diagnostic_invalid);
978*67e74705SXin Li return;
979*67e74705SXin Li }
980*67e74705SXin Li IdentifierInfo *II = Tok.getIdentifierInfo();
981*67e74705SXin Li PPCallbacks *Callbacks = PP.getPPCallbacks();
982*67e74705SXin Li
983*67e74705SXin Li if (II->isStr("pop")) {
984*67e74705SXin Li if (!PP.getDiagnostics().popMappings(DiagLoc))
985*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_diagnostic_cannot_pop);
986*67e74705SXin Li else if (Callbacks)
987*67e74705SXin Li Callbacks->PragmaDiagnosticPop(DiagLoc, Namespace);
988*67e74705SXin Li return;
989*67e74705SXin Li } else if (II->isStr("push")) {
990*67e74705SXin Li PP.getDiagnostics().pushMappings(DiagLoc);
991*67e74705SXin Li if (Callbacks)
992*67e74705SXin Li Callbacks->PragmaDiagnosticPush(DiagLoc, Namespace);
993*67e74705SXin Li return;
994*67e74705SXin Li }
995*67e74705SXin Li
996*67e74705SXin Li diag::Severity SV = llvm::StringSwitch<diag::Severity>(II->getName())
997*67e74705SXin Li .Case("ignored", diag::Severity::Ignored)
998*67e74705SXin Li .Case("warning", diag::Severity::Warning)
999*67e74705SXin Li .Case("error", diag::Severity::Error)
1000*67e74705SXin Li .Case("fatal", diag::Severity::Fatal)
1001*67e74705SXin Li .Default(diag::Severity());
1002*67e74705SXin Li
1003*67e74705SXin Li if (SV == diag::Severity()) {
1004*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_diagnostic_invalid);
1005*67e74705SXin Li return;
1006*67e74705SXin Li }
1007*67e74705SXin Li
1008*67e74705SXin Li PP.LexUnexpandedToken(Tok);
1009*67e74705SXin Li SourceLocation StringLoc = Tok.getLocation();
1010*67e74705SXin Li
1011*67e74705SXin Li std::string WarningName;
1012*67e74705SXin Li if (!PP.FinishLexStringLiteral(Tok, WarningName, "pragma diagnostic",
1013*67e74705SXin Li /*MacroExpansion=*/false))
1014*67e74705SXin Li return;
1015*67e74705SXin Li
1016*67e74705SXin Li if (Tok.isNot(tok::eod)) {
1017*67e74705SXin Li PP.Diag(Tok.getLocation(), diag::warn_pragma_diagnostic_invalid_token);
1018*67e74705SXin Li return;
1019*67e74705SXin Li }
1020*67e74705SXin Li
1021*67e74705SXin Li if (WarningName.size() < 3 || WarningName[0] != '-' ||
1022*67e74705SXin Li (WarningName[1] != 'W' && WarningName[1] != 'R')) {
1023*67e74705SXin Li PP.Diag(StringLoc, diag::warn_pragma_diagnostic_invalid_option);
1024*67e74705SXin Li return;
1025*67e74705SXin Li }
1026*67e74705SXin Li
1027*67e74705SXin Li diag::Flavor Flavor = WarningName[1] == 'W' ? diag::Flavor::WarningOrError
1028*67e74705SXin Li : diag::Flavor::Remark;
1029*67e74705SXin Li StringRef Group = StringRef(WarningName).substr(2);
1030*67e74705SXin Li bool unknownDiag = false;
1031*67e74705SXin Li if (Group == "everything") {
1032*67e74705SXin Li // Special handling for pragma clang diagnostic ... "-Weverything".
1033*67e74705SXin Li // There is no formal group named "everything", so there has to be a
1034*67e74705SXin Li // special case for it.
1035*67e74705SXin Li PP.getDiagnostics().setSeverityForAll(Flavor, SV, DiagLoc);
1036*67e74705SXin Li } else
1037*67e74705SXin Li unknownDiag = PP.getDiagnostics().setSeverityForGroup(Flavor, Group, SV,
1038*67e74705SXin Li DiagLoc);
1039*67e74705SXin Li if (unknownDiag)
1040*67e74705SXin Li PP.Diag(StringLoc, diag::warn_pragma_diagnostic_unknown_warning)
1041*67e74705SXin Li << WarningName;
1042*67e74705SXin Li else if (Callbacks)
1043*67e74705SXin Li Callbacks->PragmaDiagnostic(DiagLoc, Namespace, SV, WarningName);
1044*67e74705SXin Li }
1045*67e74705SXin Li };
1046*67e74705SXin Li
1047*67e74705SXin Li /// "\#pragma warning(...)". MSVC's diagnostics do not map cleanly to clang's
1048*67e74705SXin Li /// diagnostics, so we don't really implement this pragma. We parse it and
1049*67e74705SXin Li /// ignore it to avoid -Wunknown-pragma warnings.
1050*67e74705SXin Li struct PragmaWarningHandler : public PragmaHandler {
PragmaWarningHandler__anon325163220211::PragmaWarningHandler1051*67e74705SXin Li PragmaWarningHandler() : PragmaHandler("warning") {}
1052*67e74705SXin Li
HandlePragma__anon325163220211::PragmaWarningHandler1053*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1054*67e74705SXin Li Token &Tok) override {
1055*67e74705SXin Li // Parse things like:
1056*67e74705SXin Li // warning(push, 1)
1057*67e74705SXin Li // warning(pop)
1058*67e74705SXin Li // warning(disable : 1 2 3 ; error : 4 5 6 ; suppress : 7 8 9)
1059*67e74705SXin Li SourceLocation DiagLoc = Tok.getLocation();
1060*67e74705SXin Li PPCallbacks *Callbacks = PP.getPPCallbacks();
1061*67e74705SXin Li
1062*67e74705SXin Li PP.Lex(Tok);
1063*67e74705SXin Li if (Tok.isNot(tok::l_paren)) {
1064*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_expected) << "(";
1065*67e74705SXin Li return;
1066*67e74705SXin Li }
1067*67e74705SXin Li
1068*67e74705SXin Li PP.Lex(Tok);
1069*67e74705SXin Li IdentifierInfo *II = Tok.getIdentifierInfo();
1070*67e74705SXin Li
1071*67e74705SXin Li if (II && II->isStr("push")) {
1072*67e74705SXin Li // #pragma warning( push[ ,n ] )
1073*67e74705SXin Li int Level = -1;
1074*67e74705SXin Li PP.Lex(Tok);
1075*67e74705SXin Li if (Tok.is(tok::comma)) {
1076*67e74705SXin Li PP.Lex(Tok);
1077*67e74705SXin Li uint64_t Value;
1078*67e74705SXin Li if (Tok.is(tok::numeric_constant) &&
1079*67e74705SXin Li PP.parseSimpleIntegerLiteral(Tok, Value))
1080*67e74705SXin Li Level = int(Value);
1081*67e74705SXin Li if (Level < 0 || Level > 4) {
1082*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_push_level);
1083*67e74705SXin Li return;
1084*67e74705SXin Li }
1085*67e74705SXin Li }
1086*67e74705SXin Li if (Callbacks)
1087*67e74705SXin Li Callbacks->PragmaWarningPush(DiagLoc, Level);
1088*67e74705SXin Li } else if (II && II->isStr("pop")) {
1089*67e74705SXin Li // #pragma warning( pop )
1090*67e74705SXin Li PP.Lex(Tok);
1091*67e74705SXin Li if (Callbacks)
1092*67e74705SXin Li Callbacks->PragmaWarningPop(DiagLoc);
1093*67e74705SXin Li } else {
1094*67e74705SXin Li // #pragma warning( warning-specifier : warning-number-list
1095*67e74705SXin Li // [; warning-specifier : warning-number-list...] )
1096*67e74705SXin Li while (true) {
1097*67e74705SXin Li II = Tok.getIdentifierInfo();
1098*67e74705SXin Li if (!II && !Tok.is(tok::numeric_constant)) {
1099*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_spec_invalid);
1100*67e74705SXin Li return;
1101*67e74705SXin Li }
1102*67e74705SXin Li
1103*67e74705SXin Li // Figure out which warning specifier this is.
1104*67e74705SXin Li bool SpecifierValid;
1105*67e74705SXin Li StringRef Specifier;
1106*67e74705SXin Li llvm::SmallString<1> SpecifierBuf;
1107*67e74705SXin Li if (II) {
1108*67e74705SXin Li Specifier = II->getName();
1109*67e74705SXin Li SpecifierValid = llvm::StringSwitch<bool>(Specifier)
1110*67e74705SXin Li .Cases("default", "disable", "error", "once",
1111*67e74705SXin Li "suppress", true)
1112*67e74705SXin Li .Default(false);
1113*67e74705SXin Li // If we read a correct specifier, snatch next token (that should be
1114*67e74705SXin Li // ":", checked later).
1115*67e74705SXin Li if (SpecifierValid)
1116*67e74705SXin Li PP.Lex(Tok);
1117*67e74705SXin Li } else {
1118*67e74705SXin Li // Token is a numeric constant. It should be either 1, 2, 3 or 4.
1119*67e74705SXin Li uint64_t Value;
1120*67e74705SXin Li Specifier = PP.getSpelling(Tok, SpecifierBuf);
1121*67e74705SXin Li if (PP.parseSimpleIntegerLiteral(Tok, Value)) {
1122*67e74705SXin Li SpecifierValid = (Value >= 1) && (Value <= 4);
1123*67e74705SXin Li } else
1124*67e74705SXin Li SpecifierValid = false;
1125*67e74705SXin Li // Next token already snatched by parseSimpleIntegerLiteral.
1126*67e74705SXin Li }
1127*67e74705SXin Li
1128*67e74705SXin Li if (!SpecifierValid) {
1129*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_spec_invalid);
1130*67e74705SXin Li return;
1131*67e74705SXin Li }
1132*67e74705SXin Li if (Tok.isNot(tok::colon)) {
1133*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_expected) << ":";
1134*67e74705SXin Li return;
1135*67e74705SXin Li }
1136*67e74705SXin Li
1137*67e74705SXin Li // Collect the warning ids.
1138*67e74705SXin Li SmallVector<int, 4> Ids;
1139*67e74705SXin Li PP.Lex(Tok);
1140*67e74705SXin Li while (Tok.is(tok::numeric_constant)) {
1141*67e74705SXin Li uint64_t Value;
1142*67e74705SXin Li if (!PP.parseSimpleIntegerLiteral(Tok, Value) || Value == 0 ||
1143*67e74705SXin Li Value > INT_MAX) {
1144*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_expected_number);
1145*67e74705SXin Li return;
1146*67e74705SXin Li }
1147*67e74705SXin Li Ids.push_back(int(Value));
1148*67e74705SXin Li }
1149*67e74705SXin Li if (Callbacks)
1150*67e74705SXin Li Callbacks->PragmaWarning(DiagLoc, Specifier, Ids);
1151*67e74705SXin Li
1152*67e74705SXin Li // Parse the next specifier if there is a semicolon.
1153*67e74705SXin Li if (Tok.isNot(tok::semi))
1154*67e74705SXin Li break;
1155*67e74705SXin Li PP.Lex(Tok);
1156*67e74705SXin Li }
1157*67e74705SXin Li }
1158*67e74705SXin Li
1159*67e74705SXin Li if (Tok.isNot(tok::r_paren)) {
1160*67e74705SXin Li PP.Diag(Tok, diag::warn_pragma_warning_expected) << ")";
1161*67e74705SXin Li return;
1162*67e74705SXin Li }
1163*67e74705SXin Li
1164*67e74705SXin Li PP.Lex(Tok);
1165*67e74705SXin Li if (Tok.isNot(tok::eod))
1166*67e74705SXin Li PP.Diag(Tok, diag::ext_pp_extra_tokens_at_eol) << "pragma warning";
1167*67e74705SXin Li }
1168*67e74705SXin Li };
1169*67e74705SXin Li
1170*67e74705SXin Li /// PragmaIncludeAliasHandler - "\#pragma include_alias("...")".
1171*67e74705SXin Li struct PragmaIncludeAliasHandler : public PragmaHandler {
PragmaIncludeAliasHandler__anon325163220211::PragmaIncludeAliasHandler1172*67e74705SXin Li PragmaIncludeAliasHandler() : PragmaHandler("include_alias") {}
HandlePragma__anon325163220211::PragmaIncludeAliasHandler1173*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1174*67e74705SXin Li Token &IncludeAliasTok) override {
1175*67e74705SXin Li PP.HandlePragmaIncludeAlias(IncludeAliasTok);
1176*67e74705SXin Li }
1177*67e74705SXin Li };
1178*67e74705SXin Li
1179*67e74705SXin Li /// PragmaMessageHandler - Handle the microsoft and gcc \#pragma message
1180*67e74705SXin Li /// extension. The syntax is:
1181*67e74705SXin Li /// \code
1182*67e74705SXin Li /// #pragma message(string)
1183*67e74705SXin Li /// \endcode
1184*67e74705SXin Li /// OR, in GCC mode:
1185*67e74705SXin Li /// \code
1186*67e74705SXin Li /// #pragma message string
1187*67e74705SXin Li /// \endcode
1188*67e74705SXin Li /// string is a string, which is fully macro expanded, and permits string
1189*67e74705SXin Li /// concatenation, embedded escape characters, etc... See MSDN for more details.
1190*67e74705SXin Li /// Also handles \#pragma GCC warning and \#pragma GCC error which take the same
1191*67e74705SXin Li /// form as \#pragma message.
1192*67e74705SXin Li struct PragmaMessageHandler : public PragmaHandler {
1193*67e74705SXin Li private:
1194*67e74705SXin Li const PPCallbacks::PragmaMessageKind Kind;
1195*67e74705SXin Li const StringRef Namespace;
1196*67e74705SXin Li
PragmaKind__anon325163220211::PragmaMessageHandler1197*67e74705SXin Li static const char* PragmaKind(PPCallbacks::PragmaMessageKind Kind,
1198*67e74705SXin Li bool PragmaNameOnly = false) {
1199*67e74705SXin Li switch (Kind) {
1200*67e74705SXin Li case PPCallbacks::PMK_Message:
1201*67e74705SXin Li return PragmaNameOnly ? "message" : "pragma message";
1202*67e74705SXin Li case PPCallbacks::PMK_Warning:
1203*67e74705SXin Li return PragmaNameOnly ? "warning" : "pragma warning";
1204*67e74705SXin Li case PPCallbacks::PMK_Error:
1205*67e74705SXin Li return PragmaNameOnly ? "error" : "pragma error";
1206*67e74705SXin Li }
1207*67e74705SXin Li llvm_unreachable("Unknown PragmaMessageKind!");
1208*67e74705SXin Li }
1209*67e74705SXin Li
1210*67e74705SXin Li public:
PragmaMessageHandler__anon325163220211::PragmaMessageHandler1211*67e74705SXin Li PragmaMessageHandler(PPCallbacks::PragmaMessageKind Kind,
1212*67e74705SXin Li StringRef Namespace = StringRef())
1213*67e74705SXin Li : PragmaHandler(PragmaKind(Kind, true)), Kind(Kind), Namespace(Namespace) {}
1214*67e74705SXin Li
HandlePragma__anon325163220211::PragmaMessageHandler1215*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1216*67e74705SXin Li Token &Tok) override {
1217*67e74705SXin Li SourceLocation MessageLoc = Tok.getLocation();
1218*67e74705SXin Li PP.Lex(Tok);
1219*67e74705SXin Li bool ExpectClosingParen = false;
1220*67e74705SXin Li switch (Tok.getKind()) {
1221*67e74705SXin Li case tok::l_paren:
1222*67e74705SXin Li // We have a MSVC style pragma message.
1223*67e74705SXin Li ExpectClosingParen = true;
1224*67e74705SXin Li // Read the string.
1225*67e74705SXin Li PP.Lex(Tok);
1226*67e74705SXin Li break;
1227*67e74705SXin Li case tok::string_literal:
1228*67e74705SXin Li // We have a GCC style pragma message, and we just read the string.
1229*67e74705SXin Li break;
1230*67e74705SXin Li default:
1231*67e74705SXin Li PP.Diag(MessageLoc, diag::err_pragma_message_malformed) << Kind;
1232*67e74705SXin Li return;
1233*67e74705SXin Li }
1234*67e74705SXin Li
1235*67e74705SXin Li std::string MessageString;
1236*67e74705SXin Li if (!PP.FinishLexStringLiteral(Tok, MessageString, PragmaKind(Kind),
1237*67e74705SXin Li /*MacroExpansion=*/true))
1238*67e74705SXin Li return;
1239*67e74705SXin Li
1240*67e74705SXin Li if (ExpectClosingParen) {
1241*67e74705SXin Li if (Tok.isNot(tok::r_paren)) {
1242*67e74705SXin Li PP.Diag(Tok.getLocation(), diag::err_pragma_message_malformed) << Kind;
1243*67e74705SXin Li return;
1244*67e74705SXin Li }
1245*67e74705SXin Li PP.Lex(Tok); // eat the r_paren.
1246*67e74705SXin Li }
1247*67e74705SXin Li
1248*67e74705SXin Li if (Tok.isNot(tok::eod)) {
1249*67e74705SXin Li PP.Diag(Tok.getLocation(), diag::err_pragma_message_malformed) << Kind;
1250*67e74705SXin Li return;
1251*67e74705SXin Li }
1252*67e74705SXin Li
1253*67e74705SXin Li // Output the message.
1254*67e74705SXin Li PP.Diag(MessageLoc, (Kind == PPCallbacks::PMK_Error)
1255*67e74705SXin Li ? diag::err_pragma_message
1256*67e74705SXin Li : diag::warn_pragma_message) << MessageString;
1257*67e74705SXin Li
1258*67e74705SXin Li // If the pragma is lexically sound, notify any interested PPCallbacks.
1259*67e74705SXin Li if (PPCallbacks *Callbacks = PP.getPPCallbacks())
1260*67e74705SXin Li Callbacks->PragmaMessage(MessageLoc, Namespace, Kind, MessageString);
1261*67e74705SXin Li }
1262*67e74705SXin Li };
1263*67e74705SXin Li
1264*67e74705SXin Li /// PragmaPushMacroHandler - "\#pragma push_macro" saves the value of the
1265*67e74705SXin Li /// macro on the top of the stack.
1266*67e74705SXin Li struct PragmaPushMacroHandler : public PragmaHandler {
PragmaPushMacroHandler__anon325163220211::PragmaPushMacroHandler1267*67e74705SXin Li PragmaPushMacroHandler() : PragmaHandler("push_macro") {}
HandlePragma__anon325163220211::PragmaPushMacroHandler1268*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1269*67e74705SXin Li Token &PushMacroTok) override {
1270*67e74705SXin Li PP.HandlePragmaPushMacro(PushMacroTok);
1271*67e74705SXin Li }
1272*67e74705SXin Li };
1273*67e74705SXin Li
1274*67e74705SXin Li
1275*67e74705SXin Li /// PragmaPopMacroHandler - "\#pragma pop_macro" sets the value of the
1276*67e74705SXin Li /// macro to the value on the top of the stack.
1277*67e74705SXin Li struct PragmaPopMacroHandler : public PragmaHandler {
PragmaPopMacroHandler__anon325163220211::PragmaPopMacroHandler1278*67e74705SXin Li PragmaPopMacroHandler() : PragmaHandler("pop_macro") {}
HandlePragma__anon325163220211::PragmaPopMacroHandler1279*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1280*67e74705SXin Li Token &PopMacroTok) override {
1281*67e74705SXin Li PP.HandlePragmaPopMacro(PopMacroTok);
1282*67e74705SXin Li }
1283*67e74705SXin Li };
1284*67e74705SXin Li
1285*67e74705SXin Li // Pragma STDC implementations.
1286*67e74705SXin Li
1287*67e74705SXin Li /// PragmaSTDC_FENV_ACCESSHandler - "\#pragma STDC FENV_ACCESS ...".
1288*67e74705SXin Li struct PragmaSTDC_FENV_ACCESSHandler : public PragmaHandler {
PragmaSTDC_FENV_ACCESSHandler__anon325163220211::PragmaSTDC_FENV_ACCESSHandler1289*67e74705SXin Li PragmaSTDC_FENV_ACCESSHandler() : PragmaHandler("FENV_ACCESS") {}
HandlePragma__anon325163220211::PragmaSTDC_FENV_ACCESSHandler1290*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1291*67e74705SXin Li Token &Tok) override {
1292*67e74705SXin Li tok::OnOffSwitch OOS;
1293*67e74705SXin Li if (PP.LexOnOffSwitch(OOS))
1294*67e74705SXin Li return;
1295*67e74705SXin Li if (OOS == tok::OOS_ON)
1296*67e74705SXin Li PP.Diag(Tok, diag::warn_stdc_fenv_access_not_supported);
1297*67e74705SXin Li }
1298*67e74705SXin Li };
1299*67e74705SXin Li
1300*67e74705SXin Li /// PragmaSTDC_CX_LIMITED_RANGEHandler - "\#pragma STDC CX_LIMITED_RANGE ...".
1301*67e74705SXin Li struct PragmaSTDC_CX_LIMITED_RANGEHandler : public PragmaHandler {
PragmaSTDC_CX_LIMITED_RANGEHandler__anon325163220211::PragmaSTDC_CX_LIMITED_RANGEHandler1302*67e74705SXin Li PragmaSTDC_CX_LIMITED_RANGEHandler()
1303*67e74705SXin Li : PragmaHandler("CX_LIMITED_RANGE") {}
HandlePragma__anon325163220211::PragmaSTDC_CX_LIMITED_RANGEHandler1304*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1305*67e74705SXin Li Token &Tok) override {
1306*67e74705SXin Li tok::OnOffSwitch OOS;
1307*67e74705SXin Li PP.LexOnOffSwitch(OOS);
1308*67e74705SXin Li }
1309*67e74705SXin Li };
1310*67e74705SXin Li
1311*67e74705SXin Li /// PragmaSTDC_UnknownHandler - "\#pragma STDC ...".
1312*67e74705SXin Li struct PragmaSTDC_UnknownHandler : public PragmaHandler {
PragmaSTDC_UnknownHandler__anon325163220211::PragmaSTDC_UnknownHandler1313*67e74705SXin Li PragmaSTDC_UnknownHandler() {}
HandlePragma__anon325163220211::PragmaSTDC_UnknownHandler1314*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1315*67e74705SXin Li Token &UnknownTok) override {
1316*67e74705SXin Li // C99 6.10.6p2, unknown forms are not allowed.
1317*67e74705SXin Li PP.Diag(UnknownTok, diag::ext_stdc_pragma_ignored);
1318*67e74705SXin Li }
1319*67e74705SXin Li };
1320*67e74705SXin Li
1321*67e74705SXin Li /// PragmaARCCFCodeAuditedHandler -
1322*67e74705SXin Li /// \#pragma clang arc_cf_code_audited begin/end
1323*67e74705SXin Li struct PragmaARCCFCodeAuditedHandler : public PragmaHandler {
PragmaARCCFCodeAuditedHandler__anon325163220211::PragmaARCCFCodeAuditedHandler1324*67e74705SXin Li PragmaARCCFCodeAuditedHandler() : PragmaHandler("arc_cf_code_audited") {}
HandlePragma__anon325163220211::PragmaARCCFCodeAuditedHandler1325*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1326*67e74705SXin Li Token &NameTok) override {
1327*67e74705SXin Li SourceLocation Loc = NameTok.getLocation();
1328*67e74705SXin Li bool IsBegin;
1329*67e74705SXin Li
1330*67e74705SXin Li Token Tok;
1331*67e74705SXin Li
1332*67e74705SXin Li // Lex the 'begin' or 'end'.
1333*67e74705SXin Li PP.LexUnexpandedToken(Tok);
1334*67e74705SXin Li const IdentifierInfo *BeginEnd = Tok.getIdentifierInfo();
1335*67e74705SXin Li if (BeginEnd && BeginEnd->isStr("begin")) {
1336*67e74705SXin Li IsBegin = true;
1337*67e74705SXin Li } else if (BeginEnd && BeginEnd->isStr("end")) {
1338*67e74705SXin Li IsBegin = false;
1339*67e74705SXin Li } else {
1340*67e74705SXin Li PP.Diag(Tok.getLocation(), diag::err_pp_arc_cf_code_audited_syntax);
1341*67e74705SXin Li return;
1342*67e74705SXin Li }
1343*67e74705SXin Li
1344*67e74705SXin Li // Verify that this is followed by EOD.
1345*67e74705SXin Li PP.LexUnexpandedToken(Tok);
1346*67e74705SXin Li if (Tok.isNot(tok::eod))
1347*67e74705SXin Li PP.Diag(Tok, diag::ext_pp_extra_tokens_at_eol) << "pragma";
1348*67e74705SXin Li
1349*67e74705SXin Li // The start location of the active audit.
1350*67e74705SXin Li SourceLocation BeginLoc = PP.getPragmaARCCFCodeAuditedLoc();
1351*67e74705SXin Li
1352*67e74705SXin Li // The start location we want after processing this.
1353*67e74705SXin Li SourceLocation NewLoc;
1354*67e74705SXin Li
1355*67e74705SXin Li if (IsBegin) {
1356*67e74705SXin Li // Complain about attempts to re-enter an audit.
1357*67e74705SXin Li if (BeginLoc.isValid()) {
1358*67e74705SXin Li PP.Diag(Loc, diag::err_pp_double_begin_of_arc_cf_code_audited);
1359*67e74705SXin Li PP.Diag(BeginLoc, diag::note_pragma_entered_here);
1360*67e74705SXin Li }
1361*67e74705SXin Li NewLoc = Loc;
1362*67e74705SXin Li } else {
1363*67e74705SXin Li // Complain about attempts to leave an audit that doesn't exist.
1364*67e74705SXin Li if (!BeginLoc.isValid()) {
1365*67e74705SXin Li PP.Diag(Loc, diag::err_pp_unmatched_end_of_arc_cf_code_audited);
1366*67e74705SXin Li return;
1367*67e74705SXin Li }
1368*67e74705SXin Li NewLoc = SourceLocation();
1369*67e74705SXin Li }
1370*67e74705SXin Li
1371*67e74705SXin Li PP.setPragmaARCCFCodeAuditedLoc(NewLoc);
1372*67e74705SXin Li }
1373*67e74705SXin Li };
1374*67e74705SXin Li
1375*67e74705SXin Li /// PragmaAssumeNonNullHandler -
1376*67e74705SXin Li /// \#pragma clang assume_nonnull begin/end
1377*67e74705SXin Li struct PragmaAssumeNonNullHandler : public PragmaHandler {
PragmaAssumeNonNullHandler__anon325163220211::PragmaAssumeNonNullHandler1378*67e74705SXin Li PragmaAssumeNonNullHandler() : PragmaHandler("assume_nonnull") {}
HandlePragma__anon325163220211::PragmaAssumeNonNullHandler1379*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1380*67e74705SXin Li Token &NameTok) override {
1381*67e74705SXin Li SourceLocation Loc = NameTok.getLocation();
1382*67e74705SXin Li bool IsBegin;
1383*67e74705SXin Li
1384*67e74705SXin Li Token Tok;
1385*67e74705SXin Li
1386*67e74705SXin Li // Lex the 'begin' or 'end'.
1387*67e74705SXin Li PP.LexUnexpandedToken(Tok);
1388*67e74705SXin Li const IdentifierInfo *BeginEnd = Tok.getIdentifierInfo();
1389*67e74705SXin Li if (BeginEnd && BeginEnd->isStr("begin")) {
1390*67e74705SXin Li IsBegin = true;
1391*67e74705SXin Li } else if (BeginEnd && BeginEnd->isStr("end")) {
1392*67e74705SXin Li IsBegin = false;
1393*67e74705SXin Li } else {
1394*67e74705SXin Li PP.Diag(Tok.getLocation(), diag::err_pp_assume_nonnull_syntax);
1395*67e74705SXin Li return;
1396*67e74705SXin Li }
1397*67e74705SXin Li
1398*67e74705SXin Li // Verify that this is followed by EOD.
1399*67e74705SXin Li PP.LexUnexpandedToken(Tok);
1400*67e74705SXin Li if (Tok.isNot(tok::eod))
1401*67e74705SXin Li PP.Diag(Tok, diag::ext_pp_extra_tokens_at_eol) << "pragma";
1402*67e74705SXin Li
1403*67e74705SXin Li // The start location of the active audit.
1404*67e74705SXin Li SourceLocation BeginLoc = PP.getPragmaAssumeNonNullLoc();
1405*67e74705SXin Li
1406*67e74705SXin Li // The start location we want after processing this.
1407*67e74705SXin Li SourceLocation NewLoc;
1408*67e74705SXin Li
1409*67e74705SXin Li if (IsBegin) {
1410*67e74705SXin Li // Complain about attempts to re-enter an audit.
1411*67e74705SXin Li if (BeginLoc.isValid()) {
1412*67e74705SXin Li PP.Diag(Loc, diag::err_pp_double_begin_of_assume_nonnull);
1413*67e74705SXin Li PP.Diag(BeginLoc, diag::note_pragma_entered_here);
1414*67e74705SXin Li }
1415*67e74705SXin Li NewLoc = Loc;
1416*67e74705SXin Li } else {
1417*67e74705SXin Li // Complain about attempts to leave an audit that doesn't exist.
1418*67e74705SXin Li if (!BeginLoc.isValid()) {
1419*67e74705SXin Li PP.Diag(Loc, diag::err_pp_unmatched_end_of_assume_nonnull);
1420*67e74705SXin Li return;
1421*67e74705SXin Li }
1422*67e74705SXin Li NewLoc = SourceLocation();
1423*67e74705SXin Li }
1424*67e74705SXin Li
1425*67e74705SXin Li PP.setPragmaAssumeNonNullLoc(NewLoc);
1426*67e74705SXin Li }
1427*67e74705SXin Li };
1428*67e74705SXin Li
1429*67e74705SXin Li /// \brief Handle "\#pragma region [...]"
1430*67e74705SXin Li ///
1431*67e74705SXin Li /// The syntax is
1432*67e74705SXin Li /// \code
1433*67e74705SXin Li /// #pragma region [optional name]
1434*67e74705SXin Li /// #pragma endregion [optional comment]
1435*67e74705SXin Li /// \endcode
1436*67e74705SXin Li ///
1437*67e74705SXin Li /// \note This is
1438*67e74705SXin Li /// <a href="http://msdn.microsoft.com/en-us/library/b6xkz944(v=vs.80).aspx">editor-only</a>
1439*67e74705SXin Li /// pragma, just skipped by compiler.
1440*67e74705SXin Li struct PragmaRegionHandler : public PragmaHandler {
PragmaRegionHandler__anon325163220211::PragmaRegionHandler1441*67e74705SXin Li PragmaRegionHandler(const char *pragma) : PragmaHandler(pragma) { }
1442*67e74705SXin Li
HandlePragma__anon325163220211::PragmaRegionHandler1443*67e74705SXin Li void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
1444*67e74705SXin Li Token &NameTok) override {
1445*67e74705SXin Li // #pragma region: endregion matches can be verified
1446*67e74705SXin Li // __pragma(region): no sense, but ignored by msvc
1447*67e74705SXin Li // _Pragma is not valid for MSVC, but there isn't any point
1448*67e74705SXin Li // to handle a _Pragma differently.
1449*67e74705SXin Li }
1450*67e74705SXin Li };
1451*67e74705SXin Li
1452*67e74705SXin Li } // end anonymous namespace
1453*67e74705SXin Li
1454*67e74705SXin Li
1455*67e74705SXin Li /// RegisterBuiltinPragmas - Install the standard preprocessor pragmas:
1456*67e74705SXin Li /// \#pragma GCC poison/system_header/dependency and \#pragma once.
RegisterBuiltinPragmas()1457*67e74705SXin Li void Preprocessor::RegisterBuiltinPragmas() {
1458*67e74705SXin Li AddPragmaHandler(new PragmaOnceHandler());
1459*67e74705SXin Li AddPragmaHandler(new PragmaMarkHandler());
1460*67e74705SXin Li AddPragmaHandler(new PragmaPushMacroHandler());
1461*67e74705SXin Li AddPragmaHandler(new PragmaPopMacroHandler());
1462*67e74705SXin Li AddPragmaHandler(new PragmaMessageHandler(PPCallbacks::PMK_Message));
1463*67e74705SXin Li
1464*67e74705SXin Li // #pragma GCC ...
1465*67e74705SXin Li AddPragmaHandler("GCC", new PragmaPoisonHandler());
1466*67e74705SXin Li AddPragmaHandler("GCC", new PragmaSystemHeaderHandler());
1467*67e74705SXin Li AddPragmaHandler("GCC", new PragmaDependencyHandler());
1468*67e74705SXin Li AddPragmaHandler("GCC", new PragmaDiagnosticHandler("GCC"));
1469*67e74705SXin Li AddPragmaHandler("GCC", new PragmaMessageHandler(PPCallbacks::PMK_Warning,
1470*67e74705SXin Li "GCC"));
1471*67e74705SXin Li AddPragmaHandler("GCC", new PragmaMessageHandler(PPCallbacks::PMK_Error,
1472*67e74705SXin Li "GCC"));
1473*67e74705SXin Li // #pragma clang ...
1474*67e74705SXin Li AddPragmaHandler("clang", new PragmaPoisonHandler());
1475*67e74705SXin Li AddPragmaHandler("clang", new PragmaSystemHeaderHandler());
1476*67e74705SXin Li AddPragmaHandler("clang", new PragmaDebugHandler());
1477*67e74705SXin Li AddPragmaHandler("clang", new PragmaDependencyHandler());
1478*67e74705SXin Li AddPragmaHandler("clang", new PragmaDiagnosticHandler("clang"));
1479*67e74705SXin Li AddPragmaHandler("clang", new PragmaARCCFCodeAuditedHandler());
1480*67e74705SXin Li AddPragmaHandler("clang", new PragmaAssumeNonNullHandler());
1481*67e74705SXin Li
1482*67e74705SXin Li AddPragmaHandler("STDC", new PragmaSTDC_FENV_ACCESSHandler());
1483*67e74705SXin Li AddPragmaHandler("STDC", new PragmaSTDC_CX_LIMITED_RANGEHandler());
1484*67e74705SXin Li AddPragmaHandler("STDC", new PragmaSTDC_UnknownHandler());
1485*67e74705SXin Li
1486*67e74705SXin Li // MS extensions.
1487*67e74705SXin Li if (LangOpts.MicrosoftExt) {
1488*67e74705SXin Li AddPragmaHandler(new PragmaWarningHandler());
1489*67e74705SXin Li AddPragmaHandler(new PragmaIncludeAliasHandler());
1490*67e74705SXin Li AddPragmaHandler(new PragmaRegionHandler("region"));
1491*67e74705SXin Li AddPragmaHandler(new PragmaRegionHandler("endregion"));
1492*67e74705SXin Li }
1493*67e74705SXin Li
1494*67e74705SXin Li // Pragmas added by plugins
1495*67e74705SXin Li for (PragmaHandlerRegistry::iterator it = PragmaHandlerRegistry::begin(),
1496*67e74705SXin Li ie = PragmaHandlerRegistry::end();
1497*67e74705SXin Li it != ie; ++it) {
1498*67e74705SXin Li AddPragmaHandler(it->instantiate().release());
1499*67e74705SXin Li }
1500*67e74705SXin Li }
1501*67e74705SXin Li
1502*67e74705SXin Li /// Ignore all pragmas, useful for modes such as -Eonly which would otherwise
1503*67e74705SXin Li /// warn about those pragmas being unknown.
IgnorePragmas()1504*67e74705SXin Li void Preprocessor::IgnorePragmas() {
1505*67e74705SXin Li AddPragmaHandler(new EmptyPragmaHandler());
1506*67e74705SXin Li // Also ignore all pragmas in all namespaces created
1507*67e74705SXin Li // in Preprocessor::RegisterBuiltinPragmas().
1508*67e74705SXin Li AddPragmaHandler("GCC", new EmptyPragmaHandler());
1509*67e74705SXin Li AddPragmaHandler("clang", new EmptyPragmaHandler());
1510*67e74705SXin Li if (PragmaHandler *NS = PragmaHandlers->FindHandler("STDC")) {
1511*67e74705SXin Li // Preprocessor::RegisterBuiltinPragmas() already registers
1512*67e74705SXin Li // PragmaSTDC_UnknownHandler as the empty handler, so remove it first,
1513*67e74705SXin Li // otherwise there will be an assert about a duplicate handler.
1514*67e74705SXin Li PragmaNamespace *STDCNamespace = NS->getIfNamespace();
1515*67e74705SXin Li assert(STDCNamespace &&
1516*67e74705SXin Li "Invalid namespace, registered as a regular pragma handler!");
1517*67e74705SXin Li if (PragmaHandler *Existing = STDCNamespace->FindHandler("", false)) {
1518*67e74705SXin Li RemovePragmaHandler("STDC", Existing);
1519*67e74705SXin Li delete Existing;
1520*67e74705SXin Li }
1521*67e74705SXin Li }
1522*67e74705SXin Li AddPragmaHandler("STDC", new EmptyPragmaHandler());
1523*67e74705SXin Li }
1524