Add code generation and sema checking for __builtin_va_arg.

llvm-svn: 43006
diff --git a/clang/Parse/ParseExpr.cpp b/clang/Parse/ParseExpr.cpp
index 8a576ed..c69d4d2 100644
--- a/clang/Parse/ParseExpr.cpp
+++ b/clang/Parse/ParseExpr.cpp
@@ -793,9 +793,9 @@
 
   switch (T) {
   default: assert(0 && "Not a builtin primary expression!");
-  case tok::kw___builtin_va_arg:
-    Res = ParseAssignmentExpression();
-    if (Res.isInvalid) {
+  case tok::kw___builtin_va_arg: {
+    ExprResult Expr = ParseAssignmentExpression();
+    if (Expr.isInvalid) {
       SkipUntil(tok::r_paren);
       return Res;
     }
@@ -803,11 +803,15 @@
     if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
       return ExprResult(true);
 
-    ParseTypeName();
+    TypeTy *Ty = ParseTypeName();
     
-    MatchRHSPunctuation(tok::r_paren, LParenLoc);
+    if (Tok.isNot(tok::r_paren)) {
+      Diag(Tok, diag::err_expected_rparen);
+      return ExprResult(true);
+    }
+    Res = Actions.ActOnVAArg(StartLoc, Expr.Val, Ty, ConsumeParen());
     break;
-    
+  }
   case tok::kw___builtin_offsetof: {
     SourceLocation TypeLoc = Tok.getLocation();
     TypeTy *Ty = ParseTypeName();