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());
+}