1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -S -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s
2223b8240SDávid Bolvanský 
3223b8240SDávid Bolvanský bool bar();
4223b8240SDávid Bolvanský void f(bool, bool);
5223b8240SDávid Bolvanský void g(bool);
6223b8240SDávid Bolvanský 
baz(int x)7223b8240SDávid Bolvanský static int baz(int x) {
8223b8240SDávid Bolvanský     return x * 10;
9223b8240SDávid Bolvanský }
10223b8240SDávid Bolvanský 
noi()11223b8240SDávid Bolvanský [[clang::noinline]] bool noi() { }
12223b8240SDávid Bolvanský 
foo(int i)13223b8240SDávid Bolvanský void foo(int i) {
14223b8240SDávid Bolvanský   [[clang::noinline]] bar();
15223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR:[0-9]+]]
16223b8240SDávid Bolvanský   [[clang::noinline]] i = baz(i);
17223b8240SDávid Bolvanský // CHECK: call noundef i32 @_ZL3bazi({{.*}}) #[[NOINLINEATTR]]
18223b8240SDávid Bolvanský   [[clang::noinline]] (i = 4, bar());
19223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
20223b8240SDávid Bolvanský   [[clang::noinline]] (void)(bar());
21223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
22223b8240SDávid Bolvanský   [[clang::noinline]] f(bar(), bar());
23223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
24223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
25223b8240SDávid Bolvanský // CHECK: call void @_Z1fbb({{.*}}) #[[NOINLINEATTR]]
26223b8240SDávid Bolvanský   [[clang::noinline]] [] { bar(); bar(); }(); // noinline only applies to the anonymous function call
27223b8240SDávid Bolvanský // CHECK: call void @"_ZZ3fooiENK3$_0clEv"(%class.anon* {{[^,]*}} %ref.tmp) #[[NOINLINEATTR]]
28223b8240SDávid Bolvanský   [[clang::noinline]] for (bar(); bar(); bar()) {}
29223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
30223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
31223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv() #[[NOINLINEATTR]]
32223b8240SDávid Bolvanský   bar();
33223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv()
34223b8240SDávid Bolvanský   [[clang::noinline]] noi();
35223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3noiv()
36223b8240SDávid Bolvanský   noi();
37223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3noiv()
38223b8240SDávid Bolvanský   [[gnu::noinline]] bar();
39223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_Z3barv()
40223b8240SDávid Bolvanský }
41223b8240SDávid Bolvanský 
42223b8240SDávid Bolvanský struct S {
43223b8240SDávid Bolvanský   friend bool operator==(const S &LHS, const S &RHS);
44223b8240SDávid Bolvanský };
45223b8240SDávid Bolvanský 
func(const S & s1,const S & s2)46223b8240SDávid Bolvanský void func(const S &s1, const S &s2) {
47223b8240SDávid Bolvanský   [[clang::noinline]]g(s1 == s2);
48223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_ZeqRK1SS1_({{.*}}) #[[NOINLINEATTR]]
49223b8240SDávid Bolvanský // CHECK: call void @_Z1gb({{.*}}) #[[NOINLINEATTR]]
50223b8240SDávid Bolvanský   bool b;
51223b8240SDávid Bolvanský   [[clang::noinline]] b = s1 == s2;
52223b8240SDávid Bolvanský // CHECK: call noundef zeroext i1 @_ZeqRK1SS1_({{.*}}) #[[NOINLINEATTR]]
53223b8240SDávid Bolvanský }
54223b8240SDávid Bolvanský 
55223b8240SDávid Bolvanský // CHECK: attributes #[[NOINLINEATTR]] = { noinline }
56