ParsePragma.cpp revision 9991479ad5dde617168cc1e4b18425cdbbfd9fa9
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"
16fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar#include "clang/Lex/Preprocessor.h"
17fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar#include "clang/Parse/Action.h"
184726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek#include "clang/Parse/Parser.h"
19fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbarusing namespace clang;
20fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
21fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// #pragma pack(...) comes in the following delicious flavors:
22fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' [integer] ')'
23fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' 'show' ')'
24fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' ('push' | 'pop') [',' identifier] [, integer] ')'
25fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbarvoid PragmaPackHandler::HandlePragma(Preprocessor &PP, Token &PackTok) {
26fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  // FIXME: Should we be expanding macros here? My guess is no.
27fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation PackLoc = PackTok.getLocation();
28fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
29fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  Token Tok;
30fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  PP.Lex(Tok);
31fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::l_paren)) {
324726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "pack";
33fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
34fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
35fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
36fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  Action::PragmaPackKind Kind = Action::PPK_Default;
37fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  IdentifierInfo *Name = 0;
3815faa7fdfb496489dec9470aa5eb699b29ecdaccSebastian Redl  Action::OwningExprResult Alignment(Actions);
39fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation LParenLoc = Tok.getLocation();
40fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  PP.Lex(Tok);
41fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.is(tok::numeric_constant)) {
42fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    Alignment = Actions.ActOnNumericConstant(Tok);
430e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl    if (Alignment.isInvalid())
44fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      return;
45fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
46fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    PP.Lex(Tok);
47fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  } else if (Tok.is(tok::identifier)) {
48fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    const IdentifierInfo *II = Tok.getIdentifierInfo();
4908631c5fa053867146b5ee8be658c229f6bf127cChris Lattner    if (II->isStr("show")) {
50fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      Kind = Action::PPK_Show;
51fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
52fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    } else {
5308631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      if (II->isStr("push")) {
54fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        Kind = Action::PPK_Push;
5508631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      } else if (II->isStr("pop")) {
56fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        Kind = Action::PPK_Pop;
57fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      } else {
58fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_invalid_action);
59fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        return;
60fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      }
61fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
62fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
63fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      if (Tok.is(tok::comma)) {
64fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Lex(Tok);
65fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
66fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        if (Tok.is(tok::numeric_constant)) {
67fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Alignment = Actions.ActOnNumericConstant(Tok);
680e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl          if (Alignment.isInvalid())
69fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            return;
70fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
71fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
72fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else if (Tok.is(tok::identifier)) {
73fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Name = Tok.getIdentifierInfo();
74fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
75fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
76fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          if (Tok.is(tok::comma)) {
77fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
78fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
79fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            if (Tok.isNot(tok::numeric_constant)) {
8008631c5fa053867146b5ee8be658c229f6bf127cChris Lattner              PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
81fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
82fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            }
83fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
84fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            Alignment = Actions.ActOnNumericConstant(Tok);
850e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl            if (Alignment.isInvalid())
86fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
87fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
88fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
89fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          }
90fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else {
9108631c5fa053867146b5ee8be658c229f6bf127cChris Lattner          PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
92fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          return;
93fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        }
94fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      }
95fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    }
960e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl  }
97fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
98fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::r_paren)) {
994726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) << "pack";
100fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
101fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
102fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
1039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
1059991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "pack";
1069991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1079991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
109fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation RParenLoc = Tok.getLocation();
110effa8d1c97b00a3f53e972b0e61d9aade5ea1c57Sebastian Redl  Actions.ActOnPragmaPack(Kind, Name, Alignment.release(), PackLoc,
111fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar                          LParenLoc, RParenLoc);
112fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar}
113fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
1144726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek// #pragma unused(identifier)
1154726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenekvoid PragmaUnusedHandler::HandlePragma(Preprocessor &PP, Token &UnusedTok) {
1164726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // FIXME: Should we be expanding macros here? My guess is no.
1174726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation UnusedLoc = UnusedTok.getLocation();
1184726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1194726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the left '('.
1204726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  Token Tok;
1214726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  PP.Lex(Tok);
1224726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  if (Tok.isNot(tok::l_paren)) {
1234726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "unused";
1244726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
1254726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
1264726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation LParenLoc = Tok.getLocation();
1274726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1284726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the declaration reference(s).
1294726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  llvm::SmallVector<Action::ExprTy*, 5> Ex;
1304726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation RParenLoc;
1314726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  bool LexID = true;
1324726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1334726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  while (true) {
1344726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Lex(Tok);
1354726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1364726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (LexID) {
1374726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      if (Tok.is(tok::identifier)) {
1384726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        Action::OwningExprResult Name =
1394726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek          Actions.ActOnIdentifierExpr(parser.CurScope, Tok.getLocation(),
1404726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek                                      *Tok.getIdentifierInfo(), false);
1414726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1424726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        if (Name.isInvalid()) {
1434726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek          if (!Ex.empty())
1444726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek            Action::MultiExprArg Release(Actions, &Ex[0], Ex.size());
1454726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek          return;
1464726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        }
1474726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1484726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        Ex.push_back(Name.release());
1494726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        LexID = false;
1504726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        continue;
1514726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      }
1524726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1534726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      // Illegal token! Release the parsed expressions (if any) and emit
1544726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      // a warning.
1554726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      if (!Ex.empty())
1564726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        Action::MultiExprArg Release(Actions, &Ex[0], Ex.size());
1574726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1584726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var);
1594726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      return;
1604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1614726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1624726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // We are execting a ')' or a ','.
1634726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::comma)) {
1644726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      LexID = true;
1654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      continue;
1664726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1674726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1684726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::r_paren)) {
1694726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      RParenLoc = Tok.getLocation();
1704726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      break;
1714726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1724726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1734726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // Illegal token! Release the parsed expressions (if any) and emit
1744726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // a warning.
1754726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (!Ex.empty())
1764726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      Action::MultiExprArg Release(Actions, &Ex[0], Ex.size());
1774726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1784726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc);
1794726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
1804726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
1819991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1829991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1839991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
1849991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) <<
1859991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman        "unused";
1869991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1879991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1889991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1894726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Verify that we have a location for the right parenthesis.
1904726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'");
1914726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  assert(!Ex.empty() && "Valid '#pragma unused' must have arguments");
1924726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1934726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Perform the action to handle the pragma.
1944726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  Actions.ActOnPragmaUnused(&Ex[0], Ex.size(), UnusedLoc, LParenLoc, RParenLoc);
1954726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek}
1969991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1979991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier
1989991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier
1999991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedmanvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP, Token &WeakTok) {
2009991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  // FIXME: Should we be expanding macros here? My guess is no.
2019991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakLoc = WeakTok.getLocation();
2029991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  Token Tok;
2049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
2059991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::identifier)) {
2069991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak";
2079991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
2089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2099991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2109991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0;
2119991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc;
2129991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2139991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
2149991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.is(tok::equal)) {
2159991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
2169991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    if (Tok.isNot(tok::identifier)) {
2179991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
2189991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman          << "weak";
2199991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman      return;
2209991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    }
2219991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasName = Tok.getIdentifierInfo();
2229991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasNameLoc = Tok.getLocation();
2239991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
2249991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2259991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2269991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
2279991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak";
2289991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
2299991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2309991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2319991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (AliasName) {
2329991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc,
2339991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman                                 AliasNameLoc);
2349991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  } else {
2359991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc);
2369991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2379991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman}
238