summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParsePragma.cpp
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2018-10-29 03:24:16 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2018-10-29 03:24:16 +0000
commitb287a015e3a8f19734762f89ff02d877037c80e9 (patch)
treef8d8c5c09d763e15a4f84f75dd7e0fe04473e06b /clang/lib/Parse/ParsePragma.cpp
parenta7cc6b360fe976c9105968d73f60e26172dc7b77 (diff)
downloadbcm5719-llvm-b287a015e3a8f19734762f89ff02d877037c80e9.tar.gz
bcm5719-llvm-b287a015e3a8f19734762f89ff02d877037c80e9.zip
Revert "Support for groups of attributes in #pragma clang attribute"
This reverts commit r345486. Looks like it causes some old versions of GCC to crash, I'll see if I can work around it and recommit... llvm-svn: 345487
Diffstat (limited to 'clang/lib/Parse/ParsePragma.cpp')
-rw-r--r--clang/lib/Parse/ParsePragma.cpp58
1 files changed, 18 insertions, 40 deletions
diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp
index 35072a739b9..26b363f280c 100644
--- a/clang/lib/Parse/ParsePragma.cpp
+++ b/clang/lib/Parse/ParsePragma.cpp
@@ -1133,7 +1133,7 @@ bool Parser::HandlePragmaLoopHint(LoopHint &Hint) {
namespace {
struct PragmaAttributeInfo {
- enum ActionType { Push, Pop, Attribute };
+ enum ActionType { Push, Pop };
ParsedAttributes &Attributes;
ActionType Action;
ArrayRef<Token> Tokens;
@@ -1394,16 +1394,8 @@ void Parser::HandlePragmaAttribute() {
return;
}
// Parse the actual attribute with its arguments.
- assert(Info->Action == PragmaAttributeInfo::Push ||
- Info->Action == PragmaAttributeInfo::Attribute &&
- "Unexpected #pragma attribute command");
-
- if (Info->Action == PragmaAttributeInfo::Push && Info->Tokens.empty()) {
- ConsumeAnnotationToken();
- Actions.ActOnPragmaAttributeEmptyPush(PragmaLoc);
- return;
- }
-
+ assert(Info->Action == PragmaAttributeInfo::Push &&
+ "Unexpected #pragma attribute command");
PP.EnterTokenStream(Info->Tokens, /*DisableMacroExpansion=*/false);
ConsumeAnnotationToken();
@@ -1550,12 +1542,8 @@ void Parser::HandlePragmaAttribute() {
// Consume the eof terminator token.
ConsumeToken();
- // Handle a mixed push/attribute by desurging to a push, then an attribute.
- if (Info->Action == PragmaAttributeInfo::Push)
- Actions.ActOnPragmaAttributeEmptyPush(PragmaLoc);
-
- Actions.ActOnPragmaAttributeAttribute(Attribute, PragmaLoc,
- std::move(SubjectMatchRules));
+ Actions.ActOnPragmaAttributePush(Attribute, PragmaLoc,
+ std::move(SubjectMatchRules));
}
// #pragma GCC visibility comes in two variants:
@@ -3116,8 +3104,6 @@ void PragmaForceCUDAHostDeviceHandler::HandlePragma(
/// The syntax is:
/// \code
/// #pragma clang attribute push(attribute, subject-set)
-/// #pragma clang attribute push
-/// #pragma clang attribute (attribute, subject-set)
/// #pragma clang attribute pop
/// \endcode
///
@@ -3136,33 +3122,25 @@ void PragmaAttributeHandler::HandlePragma(Preprocessor &PP,
auto *Info = new (PP.getPreprocessorAllocator())
PragmaAttributeInfo(AttributesForPragmaAttribute);
- if (!Tok.isOneOf(tok::identifier, tok::l_paren)) {
- PP.Diag(Tok.getLocation(),
- diag::err_pragma_attribute_expected_push_pop_paren);
+ // Parse the 'push' or 'pop'.
+ if (Tok.isNot(tok::identifier)) {
+ PP.Diag(Tok.getLocation(), diag::err_pragma_attribute_expected_push_pop);
return;
}
-
- // Determine what action this pragma clang attribute represents.
- if (Tok.is(tok::l_paren))
- Info->Action = PragmaAttributeInfo::Attribute;
+ const auto *II = Tok.getIdentifierInfo();
+ if (II->isStr("push"))
+ Info->Action = PragmaAttributeInfo::Push;
+ else if (II->isStr("pop"))
+ Info->Action = PragmaAttributeInfo::Pop;
else {
- const IdentifierInfo *II = Tok.getIdentifierInfo();
- if (II->isStr("push"))
- Info->Action = PragmaAttributeInfo::Push;
- else if (II->isStr("pop"))
- Info->Action = PragmaAttributeInfo::Pop;
- else {
- PP.Diag(Tok.getLocation(), diag::err_pragma_attribute_invalid_argument)
- << PP.getSpelling(Tok);
- return;
- }
-
- PP.Lex(Tok);
+ PP.Diag(Tok.getLocation(), diag::err_pragma_attribute_invalid_argument)
+ << PP.getSpelling(Tok);
+ return;
}
+ PP.Lex(Tok);
// Parse the actual attribute.
- if ((Info->Action == PragmaAttributeInfo::Push && Tok.isNot(tok::eod)) ||
- Info->Action == PragmaAttributeInfo::Attribute) {
+ if (Info->Action == PragmaAttributeInfo::Push) {
if (Tok.isNot(tok::l_paren)) {
PP.Diag(Tok.getLocation(), diag::err_expected) << tok::l_paren;
return;
OpenPOWER on IntegriCloud