diff --git a/lib/Headers/stdarg.h b/lib/Headers/stdarg.h
index a57e183648718d80ae69b8974795449841199b78..101426fff15159fd7c8b3ec94f3db2d328e574b8 100644
--- a/lib/Headers/stdarg.h
+++ b/lib/Headers/stdarg.h
@@ -43,10 +43,9 @@ typedef __builtin_va_list va_list;
 #define va_copy(dest, src)  __builtin_va_copy(dest, src)
 #endif
 
-/* Hack required to make standard headers work, at least on Ubuntu */
 #ifndef __GNUC_VA_LIST
 #define __GNUC_VA_LIST 1
-#endif
 typedef __builtin_va_list __gnuc_va_list;
+#endif
 
 #endif /* __STDARG_H */
diff --git a/test/Headers/stdarg-gnuc_va_list.c b/test/Headers/stdarg-gnuc_va_list.c
new file mode 100644
index 0000000000000000000000000000000000000000..da9db8ddc20ac5997f1f4a749a16837910625740
--- /dev/null
+++ b/test/Headers/stdarg-gnuc_va_list.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -Wsystem-headers -std=c99 %s
+// expected-no-diagnostics
+
+// Check that no warnings are emitted from stdarg.h if __gnuc_va_list has
+// previously been defined in another header file.
+typedef __builtin_va_list __va_list;
+typedef __va_list __gnuc_va_list;
+#define __GNUC_VA_LIST
+
+#include <stdarg.h>