aboutsummaryrefslogtreecommitdiff
path: root/Parse/ParseObjc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Parse/ParseObjc.cpp')
-rw-r--r--Parse/ParseObjc.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 94a5c8d42c..98395d1922 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -369,6 +369,9 @@ Parser::ExprResult Parser::ParseObjCExpression() {
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 @@ Parser::ExprResult Parser::ParseObjCStringLiteral() {
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());
+}