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