101f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -o - -verify | FileCheck %s
2d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbar
358c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattnerint g();
458c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner
558c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattnerint foo(int i) {
61eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return g(i);
758c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner}
858c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner
958c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattnerint g(int i) {
101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return g(i);
1158c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner}
1258c3f9ec11cbe852a518bf2f83af46f938b7b852Chris Lattner
1305d2fb40859bbfc081ab08379452db876545bff6Chris Lattner// rdar://6110827
1405d2fb40859bbfc081ab08379452db876545bff6Chris Lattnertypedef void T(void);
1505d2fb40859bbfc081ab08379452db876545bff6Chris Lattnervoid test3(T f) {
1605d2fb40859bbfc081ab08379452db876545bff6Chris Lattner  f();
1705d2fb40859bbfc081ab08379452db876545bff6Chris Lattner}
1805d2fb40859bbfc081ab08379452db876545bff6Chris Lattner
19450da9832b31d9b2e90af7708d197e5b9e1af8c8Douglas Gregorint a(int);
20450da9832b31d9b2e90af7708d197e5b9e1af8c8Douglas Gregorint a() {return 1;}
21d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbar
22d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbarvoid f0() {}
2393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f0()
24d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbar
25d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbarvoid f1();
26d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbarvoid f2(void) {
27a923c9783e8bd8edd26e56df9eaacd872c43e20eJohn McCall// CHECK: call void @f1()
28d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbar  f1(1, 2, 3);
29d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbar}
3093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f1()
31d5d31801fc87239436fa349c89dce7797cf13537Daniel Dunbarvoid f1() {}
32ff75e1db95a53c7606e0bb114cf9adc59ab3d7f6Chris Lattner
331a4bb5cc1b545d7e359d20e30c0df54efd4b1b02John McCall// CHECK: define {{.*}} @f3{{\(\)|\(.*sret.*\)}}
34ff75e1db95a53c7606e0bb114cf9adc59ab3d7f6Chris Lattnerstruct foo { int X, Y, Z; } f3() {
35c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  while (1) {}
36ff75e1db95a53c7606e0bb114cf9adc59ab3d7f6Chris Lattner}
37d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner
38d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattner// PR4423 - This shouldn't crash in codegen
39d6bebbfd510f3b495795b88aafd10ead3cb211e9Chris Lattnervoid f4() {}
40b7d35893186564bf8c4e706e5d05df06b23d2dc7John McCallvoid f5() { f4(42); } //expected-warning {{too many arguments}}
410b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall
420b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall// Qualifiers on parameter types shouldn't make a difference.
430b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCallstatic void f6(const float f, const float g) {
440b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
450b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCallvoid f7(float f, float g) {
460b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall  f6(f, g);
470b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall// CHECK: define void @f7(float{{.*}}, float{{.*}})
480b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall// CHECK: call void @f6(float{{.*}}, float{{.*}})
490b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall}
50784f21121a6c9418ebd86baa6814e36e1176c410John McCall
51784f21121a6c9418ebd86baa6814e36e1176c410John McCall// PR6911 - incomplete function types
52784f21121a6c9418ebd86baa6814e36e1176c410John McCallstruct Incomplete;
53784f21121a6c9418ebd86baa6814e36e1176c410John McCallvoid f8_callback(struct Incomplete);
54784f21121a6c9418ebd86baa6814e36e1176c410John McCallvoid f8_user(void (*callback)(struct Incomplete));
55784f21121a6c9418ebd86baa6814e36e1176c410John McCallvoid f8_test() {
56784f21121a6c9418ebd86baa6814e36e1176c410John McCall  f8_user(&f8_callback);
5793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f8_test()
58784f21121a6c9418ebd86baa6814e36e1176c410John McCall// CHECK: call void @f8_user({{.*}}* bitcast (void ()* @f8_callback to {{.*}}*))
59784f21121a6c9418ebd86baa6814e36e1176c410John McCall// CHECK: declare void @f8_user({{.*}}*)
60784f21121a6c9418ebd86baa6814e36e1176c410John McCall// CHECK: declare void @f8_callback()
61784f21121a6c9418ebd86baa6814e36e1176c410John McCall}
62a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCall
63a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCall// PR10204: don't crash
64a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCallstatic void test9_helper(void) {}
65a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCallvoid test9() {
66a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCall  (void) test9_helper;
67a0b7d2ed23c57c6fac4517aca22d2411ead698e4John McCall}
68