ParsePragma.cpp revision 84021556baceb76eedf7d44be8ba71d9b8cfacce
1fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===--- ParsePragma.cpp - Language specific pragma parsing ---------------===//
2fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
3fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//                     The LLVM Compiler Infrastructure
4fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
5fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// License. See LICENSE.TXT for details.
7fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
8fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===----------------------------------------------------------------------===//
9fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
10fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// This file implements the language specific #pragma handlers.
11fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
12fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===----------------------------------------------------------------------===//
13fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
14fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar#include "ParsePragma.h"
15500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Parse/ParseDiagnostic.h"
164726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek#include "clang/Parse/Parser.h"
1719510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Lex/Preprocessor.h"
18fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbarusing namespace clang;
19fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
20b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// \brief Handle the annotation token produced for #pragma unused(...)
21b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis///
22b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// Each annot_pragma_unused is followed by the argument token so e.g.
23b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// "#pragma unused(x,y)" becomes:
24b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// annot_pragma_unused 'x' annot_pragma_unused 'y'
25b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidisvoid Parser::HandlePragmaUnused() {
26b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  assert(Tok.is(tok::annot_pragma_unused));
27b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  SourceLocation UnusedLoc = ConsumeToken();
28b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  Actions.ActOnPragmaUnused(Tok, getCurScope(), UnusedLoc);
29b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  ConsumeToken(); // The argument token.
30b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis}
31aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
32aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman// #pragma GCC visibility comes in two variants:
33aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman//   'push' '(' [visibility] ')'
34aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman//   'pop'
3580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaGCCVisibilityHandler::HandlePragma(Preprocessor &PP,
3680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                              PragmaIntroducerKind Introducer,
3780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                              Token &VisTok) {
38aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  SourceLocation VisLoc = VisTok.getLocation();
39aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
40aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  Token Tok;
41aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  PP.Lex(Tok);
42aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
43aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  const IdentifierInfo *PushPop = Tok.getIdentifierInfo();
44aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
45aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  bool IsPush;
46aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  const IdentifierInfo *VisType;
47aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  if (PushPop && PushPop->isStr("pop")) {
48aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    IsPush = false;
49aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    VisType = 0;
50aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  } else if (PushPop && PushPop->isStr("push")) {
51aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    IsPush = true;
52aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
53aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (Tok.isNot(tok::l_paren)) {
54aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen)
55aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
56aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
57aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
58aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
59aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    VisType = Tok.getIdentifierInfo();
60aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (!VisType) {
61aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
62aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
63aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
64aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
65aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
66aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (Tok.isNot(tok::r_paren)) {
67aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen)
68aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
69aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
70aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
71aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  } else {
72aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
73aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      << "visibility";
74aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    return;
75aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  }
76aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  PP.Lex(Tok);
7784021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  if (Tok.isNot(tok::eod)) {
78aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
79aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      << "visibility";
80aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    return;
81aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  }
82aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
83aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  Actions.ActOnPragmaVisibility(IsPush, VisType, VisLoc);
84aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman}
85aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
86fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// #pragma pack(...) comes in the following delicious flavors:
87fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' [integer] ')'
88fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' 'show' ')'
89fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' ('push' | 'pop') [',' identifier] [, integer] ')'
9080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaPackHandler::HandlePragma(Preprocessor &PP,
9180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     PragmaIntroducerKind Introducer,
9280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     Token &PackTok) {
93fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation PackLoc = PackTok.getLocation();
94fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
95fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  Token Tok;
96fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  PP.Lex(Tok);
97fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::l_paren)) {
984726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "pack";
99fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
100fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
101fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
102f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  Sema::PragmaPackKind Kind = Sema::PPK_Default;
103fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  IdentifierInfo *Name = 0;
10460d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Alignment;
105fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation LParenLoc = Tok.getLocation();
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  PP.Lex(Tok);
107fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.is(tok::numeric_constant)) {
108fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    Alignment = Actions.ActOnNumericConstant(Tok);
1090e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl    if (Alignment.isInvalid())
110fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      return;
111fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
112fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    PP.Lex(Tok);
113fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  } else if (Tok.is(tok::identifier)) {
114fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    const IdentifierInfo *II = Tok.getIdentifierInfo();
11508631c5fa053867146b5ee8be658c229f6bf127cChris Lattner    if (II->isStr("show")) {
116f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      Kind = Sema::PPK_Show;
117fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
118fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    } else {
11908631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      if (II->isStr("push")) {
120f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        Kind = Sema::PPK_Push;
12108631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      } else if (II->isStr("pop")) {
122f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        Kind = Sema::PPK_Pop;
123fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      } else {
124fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_invalid_action);
125fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        return;
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
127fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
129fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      if (Tok.is(tok::comma)) {
130fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Lex(Tok);
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        if (Tok.is(tok::numeric_constant)) {
133fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Alignment = Actions.ActOnNumericConstant(Tok);
1340e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl          if (Alignment.isInvalid())
135fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            return;
136fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
137fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
138fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else if (Tok.is(tok::identifier)) {
139fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Name = Tok.getIdentifierInfo();
140fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
142fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          if (Tok.is(tok::comma)) {
143fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
145fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            if (Tok.isNot(tok::numeric_constant)) {
14608631c5fa053867146b5ee8be658c229f6bf127cChris Lattner              PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
147fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
148fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            }
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
150fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            Alignment = Actions.ActOnNumericConstant(Tok);
1510e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl            if (Alignment.isInvalid())
152fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
153fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
154fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
155fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          }
156fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else {
15708631c5fa053867146b5ee8be658c229f6bf127cChris Lattner          PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
158fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          return;
159fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        }
160fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      }
161fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    }
1620e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl  }
163fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
164fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::r_paren)) {
1654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) << "pack";
166fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
167fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
168fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
169861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  SourceLocation RParenLoc = Tok.getLocation();
1709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
17184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  if (Tok.isNot(tok::eod)) {
1729991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "pack";
1739991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1749991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1759991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
176effa8d1c97b00a3f53e972b0e61d9aade5ea1c57Sebastian Redl  Actions.ActOnPragmaPack(Kind, Name, Alignment.release(), PackLoc,
177fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar                          LParenLoc, RParenLoc);
178fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar}
179fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
180cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'align' '=' {'native','natural','mac68k','power','reset'}
181cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'options 'align' '=' {'native','natural','mac68k','power','reset'}
182f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void ParseAlignPragma(Sema &Actions, Preprocessor &PP, Token &FirstTok,
183cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar                             bool IsOptions) {
184861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  Token Tok;
185cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
186cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  if (IsOptions) {
187cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Lex(Tok);
188cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    if (Tok.isNot(tok::identifier) ||
189cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar        !Tok.getIdentifierInfo()->isStr("align")) {
190cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_align);
191cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      return;
192cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    }
193861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
194638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar
195861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
196861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  if (Tok.isNot(tok::equal)) {
197cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_align_expected_equal)
198cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << IsOptions;
199861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
200861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
201861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
202861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
203861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  if (Tok.isNot(tok::identifier)) {
204861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
205cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << (IsOptions ? "options" : "align");
206861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
207861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
208861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
209f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  Sema::PragmaOptionsAlignKind Kind = Sema::POAK_Natural;
210861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  const IdentifierInfo *II = Tok.getIdentifierInfo();
211638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar  if (II->isStr("native"))
212f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Native;
213638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar  else if (II->isStr("natural"))
214f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Natural;
2156f739145b94ede1ca98b5a5e0e179c817c405d7bDaniel Dunbar  else if (II->isStr("packed"))
216f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Packed;
217861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("power"))
218f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Power;
219861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("mac68k"))
220f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Mac68k;
221861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("reset"))
222f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Reset;
223861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else {
224cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_align_invalid_option)
225cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << IsOptions;
226861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
227861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
228861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
229861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  SourceLocation KindLoc = Tok.getLocation();
230861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
23184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  if (Tok.isNot(tok::eod)) {
232861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
233cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << (IsOptions ? "options" : "align");
234861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
235861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
236861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
237cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  Actions.ActOnPragmaOptionsAlign(Kind, FirstTok.getLocation(), KindLoc);
238cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar}
239cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
24080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaAlignHandler::HandlePragma(Preprocessor &PP,
24180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                      PragmaIntroducerKind Introducer,
24280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                      Token &AlignTok) {
243cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  ParseAlignPragma(Actions, PP, AlignTok, /*IsOptions=*/false);
244cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar}
245cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
24680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaOptionsHandler::HandlePragma(Preprocessor &PP,
24780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                        PragmaIntroducerKind Introducer,
24880c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                        Token &OptionsTok) {
249cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  ParseAlignPragma(Actions, PP, OptionsTok, /*IsOptions=*/true);
250861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar}
251861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
2524726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek// #pragma unused(identifier)
25380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaUnusedHandler::HandlePragma(Preprocessor &PP,
25480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                       PragmaIntroducerKind Introducer,
25580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                       Token &UnusedTok) {
2564726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // FIXME: Should we be expanding macros here? My guess is no.
2574726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation UnusedLoc = UnusedTok.getLocation();
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2594726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the left '('.
2604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  Token Tok;
2614726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  PP.Lex(Tok);
2624726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  if (Tok.isNot(tok::l_paren)) {
2634726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "unused";
2644726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
2654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
2664726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation LParenLoc = Tok.getLocation();
2671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2684726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the declaration reference(s).
2697a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  llvm::SmallVector<Token, 5> Identifiers;
2704726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation RParenLoc;
2714726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  bool LexID = true;
2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2734726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  while (true) {
2744726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Lex(Tok);
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2764726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (LexID) {
2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (Tok.is(tok::identifier)) {
2787a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek        Identifiers.push_back(Tok);
2794726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        LexID = false;
2804726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        continue;
2814726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      }
2824726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
2837a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek      // Illegal token!
2844726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var);
2854726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      return;
2864726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2884726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // We are execting a ')' or a ','.
2894726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::comma)) {
2904726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      LexID = true;
2914726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      continue;
2924726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2944726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::r_paren)) {
2954726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      RParenLoc = Tok.getLocation();
2964726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      break;
2974726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2997a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek    // Illegal token!
3004726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc);
3014726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
3024726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
3039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
30584021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  if (Tok.isNot(tok::eod)) {
3069991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) <<
3079991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman        "unused";
3089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
3099991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3109991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3114726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Verify that we have a location for the right parenthesis.
3124726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'");
3137a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments");
3144726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
315b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  // For each identifier token, insert into the token stream a
316b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  // annot_pragma_unused token followed by the identifier token.
317b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  // This allows us to cache a "#pragma unused" that occurs inside an inline
318b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  // C++ member function.
319b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis
320b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  Token *Toks = new Token[2*Identifiers.size()];
321b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  for (unsigned i=0; i != Identifiers.size(); i++) {
322b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis    Token &pragmaUnusedTok = Toks[2*i], &idTok = Toks[2*i+1];
323b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis    pragmaUnusedTok.startToken();
324b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis    pragmaUnusedTok.setKind(tok::annot_pragma_unused);
325b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis    pragmaUnusedTok.setLocation(UnusedLoc);
326b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis    idTok = Identifiers[i];
327b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  }
328b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis  PP.EnterTokenStream(Toks, 2*Identifiers.size(), /*DisableMacroExpansion=*/true, /*OwnsTokens=*/true);
3294726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek}
3309991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3319991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier
3329991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier
33380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP,
33480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     PragmaIntroducerKind Introducer,
33580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     Token &WeakTok) {
3369991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  // FIXME: Should we be expanding macros here? My guess is no.
3379991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakLoc = WeakTok.getLocation();
3389991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3399991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  Token Tok;
3409991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
3419991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::identifier)) {
3429991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak";
3439991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
3449991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3459991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3469991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0;
3479991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc;
3489991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3499991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
3509991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.is(tok::equal)) {
3519991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
3529991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    if (Tok.isNot(tok::identifier)) {
3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
3549991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman          << "weak";
3559991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman      return;
3569991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    }
3579991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasName = Tok.getIdentifierInfo();
3589991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasNameLoc = Tok.getLocation();
3599991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
3609991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3619991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
36284021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne  if (Tok.isNot(tok::eod)) {
3639991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak";
3649991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
3659991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3669991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3679991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (AliasName) {
3689991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc,
3699991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman                                 AliasNameLoc);
3709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  } else {
3719991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc);
3729991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3739991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman}
374321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
375321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbournevoid
376321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter CollingbournePragmaFPContractHandler::HandlePragma(Preprocessor &PP,
377321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne                                      PragmaIntroducerKind Introducer,
378321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne                                      Token &Tok) {
379321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  tok::OnOffSwitch OOS;
380321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  if (PP.LexOnOffSwitch(OOS))
381321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne    return;
382321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne
383321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne  Actions.ActOnPragmaFPContract(OOS);
384321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne}
385f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
386f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbournevoid
387f315fa81eef1977b3457fd7a7d4639e060fe7278Peter CollingbournePragmaOpenCLExtensionHandler::HandlePragma(Preprocessor &PP,
388f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne                                           PragmaIntroducerKind Introducer,
389f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne                                           Token &Tok) {
390f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  PP.Lex(Tok);
391f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  if (Tok.isNot(tok::identifier)) {
392f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) <<
393f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne      "OPENCL";
394f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    return;
395f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
396f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  IdentifierInfo *ename = Tok.getIdentifierInfo();
397f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  SourceLocation NameLoc = Tok.getLocation();
398f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
399f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  PP.Lex(Tok);
400f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  if (Tok.isNot(tok::colon)) {
401f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_colon) << ename;
402f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    return;
403f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
404f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
405f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  PP.Lex(Tok);
406f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  if (Tok.isNot(tok::identifier)) {
407f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable);
408f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    return;
409f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
410f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  IdentifierInfo *op = Tok.getIdentifierInfo();
411f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
412f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  unsigned state;
413f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  if (op->isStr("enable")) {
414f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    state = 1;
415f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  } else if (op->isStr("disable")) {
416f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    state = 0;
417f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  } else {
418f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable);
419f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    return;
420f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
421f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
422f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  OpenCLOptions &f = Actions.getOpenCLOptions();
423f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  if (ename->isStr("all")) {
424f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm)   f.nm = state;
425f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
426f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
427f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm) else if (ename->isStr(#nm)) { f.nm = state; }
428f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def"
429f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  else {
430f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << ename;
431f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne    return;
432f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne  }
433f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne}
434f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne
435