blob: 52f1cd3fa236d157a1b6a1d0e596af8a943fbb6b [file] [log] [blame]
David Blaikie1b76fbc2012-09-10 23:06:08 +00001// RUN: %clang_cc1 %s -triple armv7-none-eabi -emit-llvm -o - | FileCheck %s
Anders Carlsson8e7670d2009-10-12 19:41:04 +00002
3struct A {
4 virtual void f();
Anders Carlssoncd0b32e2011-04-10 18:20:53 +00005 virtual void f_const() const;
6
Anders Carlssoncf5deec2009-10-12 19:51:33 +00007 A h();
Anders Carlsson8e7670d2009-10-12 19:41:04 +00008};
9
Anders Carlssoncf5deec2009-10-12 19:51:33 +000010A g();
11
Anders Carlsson8e7670d2009-10-12 19:41:04 +000012void f(A a, A *ap, A& ar) {
13 // This should not be a virtual function call.
14
15 // CHECK: call void @_ZN1A1fEv(%struct.A* %a)
16 a.f();
17
18 // CHECK: call void %
19 ap->f();
20
21 // CHECK: call void %
22 ar.f();
Anders Carlsson76366482009-10-12 19:45:47 +000023
24 // CHECK: call void @_ZN1A1fEv
25 A().f();
Anders Carlssoncf5deec2009-10-12 19:51:33 +000026
27 // CHECK: call void @_ZN1A1fEv
28 g().f();
29
30 // CHECK: call void @_ZN1A1fEv
31 a.h().f();
Anders Carlssoncd0b32e2011-04-10 18:20:53 +000032
33 // CHECK: call void @_ZNK1A7f_constEv
34 a.f_const();
35
36 // CHECK: call void @_ZN1A1fEv
37 (a).f();
Anders Carlsson8e7670d2009-10-12 19:41:04 +000038}
Anders Carlsson4a0d8322009-10-12 19:59:15 +000039
40struct B {
41 virtual void f();
42 ~B();
43
44 B h();
45};
46
47
48void f() {
49 // CHECK: call void @_ZN1B1fEv
50 B().f();
51
52 // CHECK: call void @_ZN1B1fEv
53 B().h().f();
54}
Anders Carlssoncd0b32e2011-04-10 18:20:53 +000055
Rafael Espindola12582bd2012-06-26 19:18:25 +000056namespace test2 {
57 struct foo {
58 virtual void f();
59 virtual ~foo();
60 };
61
62 struct bar : public foo {
63 virtual void f();
64 virtual ~bar();
65 };
66
67 void f(bar *b) {
68 // CHECK: call void @_ZN5test23foo1fEv
David Blaikie1b76fbc2012-09-10 23:06:08 +000069 // CHECK: call %"struct.test2::foo"* @_ZN5test23fooD1Ev
Rafael Espindola12582bd2012-06-26 19:18:25 +000070 b->foo::f();
71 b->foo::~foo();
72 }
73}
Rafael Espindola0713d992012-06-27 17:44:39 +000074
75namespace test3 {
76 // Test that we don't crash in this case.
77 struct B {
78 };
79 struct D : public B {
80 };
81 void f(D d) {
82 // CHECK: define void @_ZN5test31fENS_1DE
83 d.B::~B();
84 }
85}
Richard Smithac452932012-08-15 22:59:28 +000086
87namespace test4 {
88 struct Animal {
89 virtual void eat();
90 };
91 struct Fish : Animal {
92 virtual void eat();
93 };
94 struct Wrapper {
95 Fish fish;
96 };
97 extern Wrapper *p;
98 void test() {
99 // CHECK: call void @_ZN5test44Fish3eatEv
100 p->fish.eat();
101 }
102}