Index: test/Sema/builtins-arm.c
===================================================================
--- test/Sema/builtins-arm.c	(revision 166106)
+++ test/Sema/builtins-arm.c	(working copy)
@@ -1,5 +1,6 @@
 // RUN: %clang_cc1 -triple armv7 -fsyntax-only -verify -DTEST0 %s
 // RUN: %clang_cc1 -triple armv7 -fsyntax-only -verify -DTEST1 %s
+// RUN: %clang_cc1 -x c++ -triple armv7 -fsyntax-only -verify %s
 // RUN: %clang_cc1 -triple armv7 -target-abi apcs-gnu \
 // RUN:   -fsyntax-only -verify -DTEST1 %s
 
@@ -15,7 +16,7 @@
 // va_list on ARM AAPCS is struct { void* __ap }.
 void test1() {
   __builtin_va_list ptr;
-  ptr.__ap = "x";
+  ptr.__ap = (void*)"x";
   *(ptr.__ap) = '0'; // expected-error {{incomplete type 'void' is not assignable}}
 }
 #else
@@ -30,5 +31,11 @@
   __builtin_va_list ptr = "x";
   *ptr = '0'; // expected-error {{incomplete type 'void' is not assignable}}
 }
+#endif
 
-#endif
+int test3(int i, ...) {
+  __builtin_va_list vl;
+  int t;
+  t = __builtin_va_arg(vl, int);
+  return t;
+}
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp	(revision 166106)
+++ lib/Sema/SemaExpr.cpp	(working copy)
@@ -9646,7 +9646,7 @@
   } else {
     // Otherwise, the va_list argument must be an l-value because
     // it is modified by va_arg.
-    if (!E->isTypeDependent() &&
+    if (!VaListType->isRecordType() && !E->isTypeDependent() &&
         CheckForModifiableLvalue(E, BuiltinLoc, *this))
       return ExprError();
   }
Index: lib/AST/ASTContext.cpp
===================================================================
--- lib/AST/ASTContext.cpp	(revision 166106)
+++ lib/AST/ASTContext.cpp	(working copy)
@@ -5579,7 +5579,11 @@
 
 static TypedefDecl *
 CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context) {
-  RecordDecl *VaListDecl;
+  // struct __va_list {
+  RecordDecl *VaListDecl = CreateRecordDecl(*Context, TTK_Struct,
+                                  Context->getTranslationUnitDecl(),
+                                  &Context->Idents.get("__va_list"));
+
   if (Context->getLangOpts().CPlusPlus) {
     // namespace std { struct __va_list {
     NamespaceDecl *NS;
@@ -5588,19 +5592,7 @@
                                /*Inline*/false, SourceLocation(),
                                SourceLocation(), &Context->Idents.get("std"),
                                /*PrevDecl*/0);
-
-    VaListDecl = CXXRecordDecl::Create(*Context, TTK_Struct,
-                                       Context->getTranslationUnitDecl(),
-                                       SourceLocation(), SourceLocation(),
-                                       &Context->Idents.get("__va_list"));
-
     VaListDecl->setDeclContext(NS);
-
-  } else {
-    // struct __va_list {
-    VaListDecl = CreateRecordDecl(*Context, TTK_Struct,
-                                  Context->getTranslationUnitDecl(),
-                                  &Context->Idents.get("__va_list"));
   }
 
   VaListDecl->startDefinition();
