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