Parse @encode expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41273 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 94a5c8d..98395d1 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -369,6 +369,9 @@
case tok::string_literal: // primary-expression: string-literal
case tok::wide_string_literal:
return ParseObjCStringLiteral();
+ case tok::objc_encode:
+ return ParseObjCEncodeExpression();
+ break;
default:
Diag(AtLoc, diag::err_unexpected_at);
SkipUntil(tok::semi);
@@ -385,3 +388,29 @@
return Actions.ParseObjCStringLiteral(Res.Val);
}
+
+/// objc-encode-expression:
+/// @encode ( type-name )
+Parser::ExprResult Parser::ParseObjCEncodeExpression() {
+ assert(Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_encode &&
+ "Not an @encode expression!");
+
+ SourceLocation EncLoc = ConsumeToken();
+
+ if (Tok.getKind() != tok::l_paren) {
+ Diag(Tok, diag::err_expected_lparen_after, "@encode");
+ return true;
+ }
+
+ SourceLocation LParenLoc = ConsumeParen();
+
+ TypeTy *Ty = ParseTypeName();
+
+ if (Tok.getKind() != tok::r_paren) {
+ Diag(Tok, diag::err_expected_rparen);
+ return true;
+ }
+
+ return Actions.ParseObjCEncodeExpression(EncLoc, LParenLoc, Ty,
+ ConsumeParen());
+}