1*67e74705SXin Li // RUN: %clang -target i386-unknown-unknown -S -emit-llvm -std=gnu89 -o - %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang -target i386-unknown-unknown -S -emit-llvm -fgnu89-inline -o - %s | FileCheck %s
3*67e74705SXin Li // PR5253
4*67e74705SXin Li
5*67e74705SXin Li // If an extern inline function is redefined, functions should call the
6*67e74705SXin Li // redefinition.
f(int a)7*67e74705SXin Li extern inline int f(int a) {return a;}
g(void)8*67e74705SXin Li int g(void) {return f(0);}
9*67e74705SXin Li // CHECK: call i32 @f
f(int b)10*67e74705SXin Li int f(int b) {return 1+b;}
11*67e74705SXin Li // CHECK: load i32, i32* %{{.*}}
12*67e74705SXin Li // CHECK: add nsw i32 1, %{{.*}}
h(void)13*67e74705SXin Li int h(void) {return f(1);}
14*67e74705SXin Li // CHECK: call i32 @f
15*67e74705SXin Li
16*67e74705SXin Li // It shouldn't matter if the function was redefined static.
f2(int a,int b)17*67e74705SXin Li extern inline int f2(int a, int b) {return a+b;}
g2(void)18*67e74705SXin Li int g2(void) {return f2(0,1);}
19*67e74705SXin Li // CHECK: call i32 @f2
f2(int a,int b)20*67e74705SXin Li static int f2(int a, int b) {return a*b;}
21*67e74705SXin Li // CHECK: load i32, i32* %{{.*}}
22*67e74705SXin Li // CHECK: load i32, i32* %{{.*}}
23*67e74705SXin Li // CHECK: mul nsw i32 %{{.*}}, %{{.*}}
h2(void)24*67e74705SXin Li int h2(void) {return f2(1,2);}
25*67e74705SXin Li // CHECK: call i32 @f2
26*67e74705SXin Li
27