ParsePragma.cpp revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
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();
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  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;
601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
61fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      if (Tok.is(tok::comma)) {
64fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Lex(Tok);
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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);
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
76fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          if (Tok.is(tok::comma)) {
77fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            if (Tok.isNot(tok::numeric_constant)) {
8008631c5fa053867146b5ee8be658c229f6bf127cChris Lattner              PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
81fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
82fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            }
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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();
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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();
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1284726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the declaration reference(s).
1297a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  llvm::SmallVector<Token, 5> Identifiers;
1304726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation RParenLoc;
1314726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  bool LexID = true;
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1334726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  while (true) {
1344726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Lex(Tok);
1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1364726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (LexID) {
1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (Tok.is(tok::identifier)) {
1387a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek        Identifiers.push_back(Tok);
1394726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        LexID = false;
1404726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        continue;
1414726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      }
1424726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1437a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek      // Illegal token!
1444726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var);
1454726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      return;
1464726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1484726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // We are execting a ')' or a ','.
1494726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::comma)) {
1504726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      LexID = true;
1514726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      continue;
1524726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1544726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::r_paren)) {
1554726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      RParenLoc = Tok.getLocation();
1564726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      break;
1574726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1597a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek    // Illegal token!
1604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc);
1614726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
1624726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
1639991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1649991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1659991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
1669991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) <<
1679991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman        "unused";
1689991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1699991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1714726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Verify that we have a location for the right parenthesis.
1724726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'");
1737a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments");
1744726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Perform the action to handle the pragma.
1767a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  Actions.ActOnPragmaUnused(Identifiers.data(), Identifiers.size(),
1777a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek                            parser.CurScope, UnusedLoc, LParenLoc, RParenLoc);
1784726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek}
1799991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1809991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier
1819991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier
1829991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedmanvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP, Token &WeakTok) {
1839991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  // FIXME: Should we be expanding macros here? My guess is no.
1849991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakLoc = WeakTok.getLocation();
1859991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1869991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  Token Tok;
1879991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1889991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::identifier)) {
1899991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak";
1909991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1919991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1929991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1939991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0;
1949991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc;
1959991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
1969991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1979991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.is(tok::equal)) {
1989991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
1999991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    if (Tok.isNot(tok::identifier)) {
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
2019991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman          << "weak";
2029991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman      return;
2039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    }
2049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasName = Tok.getIdentifierInfo();
2059991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasNameLoc = Tok.getLocation();
2069991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
2079991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2099991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
2109991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak";
2119991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
2129991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2139991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2149991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (AliasName) {
2159991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc,
2169991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman                                 AliasNameLoc);
2179991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  } else {
2189991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc);
2199991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2209991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman}
221