Check in LLVM r95781.
diff --git a/test/CodeGen/functions.c b/test/CodeGen/functions.c
new file mode 100644
index 0000000..cb9a4ef
--- /dev/null
+++ b/test/CodeGen/functions.c
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 %s -emit-llvm -o %t
+
+int g();
+
+int foo(int i) {
+  return g(i);
+}
+
+int g(int i) {
+  return g(i);
+}
+
+// rdar://6110827
+typedef void T(void);
+void test3(T f) {
+  f();
+}
+
+int a(int);
+int a() {return 1;}
+
+// RUN: grep 'define void @f0()' %t
+void f0() {}
+
+void f1();
+// RUN: grep 'call void @f1()' %t
+void f2(void) {
+  f1(1, 2, 3);
+}
+// RUN: grep 'define void @f1()' %t
+void f1() {}
+
+// RUN: grep 'define .* @f3' %t | not grep -F '...'
+struct foo { int X, Y, Z; } f3() {
+  while (1) {}
+}
+
+// PR4423 - This shouldn't crash in codegen
+void f4() {}
+void f5() { f4(42); }