Index: lib/CodeGen/CGExprScalar.cpp
===================================================================
--- lib/CodeGen/CGExprScalar.cpp	(revision 205684)
+++ lib/CodeGen/CGExprScalar.cpp	(working copy)
@@ -3202,6 +3202,10 @@
   llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr());
   llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType());
 
+  QualType Ty = VE->getType();
+  if (Ty->isVariablyModifiedType())
+    CGF.EmitVariablyModifiedType(Ty);
+
   // If EmitVAArg fails, we fall back to the LLVM instruction.
   if (!ArgPtr)
     return Builder.CreateVAArg(ArgValue, ConvertType(VE->getType()));
Index: test/CodeGen/varargs-2.c
===================================================================
--- test/CodeGen/varargs-2.c	(revision 0)
+++ test/CodeGen/varargs-2.c	(working copy)
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+
+// Check that we generate code for any modified va_arg argument.
+
+#include <stdarg.h>
+
+int i = 9;
+
+void f(int n, ...)
+{
+  va_list ap;
+  void *p;
+  va_start (ap, n);
+  p = va_arg (ap, typeof (int (*)[++i])); // CHECK: add nsw i32 {{.*}}, 1
+}
