blob: 74dc0ea6d7b020794b9596154043af46e70b2f1f [file] [log] [blame]
Anders Carlsson40092972009-10-20 22:07:59 +00001// RUN: clang-cc -verify -emit-llvm -o - %s | FileCheck %s
Anders Carlssonc8667a82009-05-19 20:40:02 +00002void t1() {
3 extern int& a;
4 int b = a;
5}
6
7void t2(int& a) {
8 int b = a;
9}
10
11int g;
12int& gr = g;
Eli Friedman50c39ea2009-05-27 06:04:58 +000013int& grr = gr;
Anders Carlssonc8667a82009-05-19 20:40:02 +000014void t3() {
15 int b = gr;
16}
Anders Carlsson4bbab922009-05-20 00:36:58 +000017
18// Test reference binding.
19
Anders Carlsson68ea78a2009-05-27 01:46:48 +000020struct C { int a; };
Anders Carlssone04d1c72009-05-20 01:03:17 +000021void f(const bool&);
Anders Carlsson4bbab922009-05-20 00:36:58 +000022void f(const int&);
23void f(const _Complex int&);
24void f(const C&);
25
Anders Carlsson48265682009-05-27 01:45:47 +000026C aggregate_return();
27
28bool& bool_reference_return();
29int& int_reference_return();
30_Complex int& complex_int_reference_return();
Anders Carlsson68ea78a2009-05-27 01:46:48 +000031C& aggregate_reference_return();
Eli Friedman5df0d422009-05-20 02:31:19 +000032
Anders Carlssone04d1c72009-05-20 01:03:17 +000033void test_bool() {
34 bool a = true;
35 f(a);
36
37 f(true);
Anders Carlsson48265682009-05-27 01:45:47 +000038
39 bool_reference_return() = true;
Anders Carlssone9f2f452009-05-27 03:37:57 +000040 a = bool_reference_return();
Anders Carlssone04d1c72009-05-20 01:03:17 +000041}
42
Anders Carlsson4bbab922009-05-20 00:36:58 +000043void test_scalar() {
44 int a = 10;
Anders Carlsson4bbab922009-05-20 00:36:58 +000045 f(a);
Anders Carlssone04d1c72009-05-20 01:03:17 +000046
Anders Carlsson38d068e2009-05-20 01:24:22 +000047 struct { int bitfield : 3; } s = { 3 };
Anders Carlsson9f75e6b2009-05-20 01:27:39 +000048 f(s.bitfield);
Anders Carlsson38d068e2009-05-20 01:24:22 +000049
Anders Carlssone04d1c72009-05-20 01:03:17 +000050 f(10);
Eli Friedman5df0d422009-05-20 02:31:19 +000051
52 __attribute((vector_size(16))) typedef int vec4;
53 f((vec4){1,2,3,4}[0]);
Anders Carlsson48265682009-05-27 01:45:47 +000054
55 int_reference_return() = 10;
Anders Carlssone9f2f452009-05-27 03:37:57 +000056 a = int_reference_return();
Anders Carlsson4bbab922009-05-20 00:36:58 +000057}
58
59void test_complex() {
60 _Complex int a = 10i;
Anders Carlsson4bbab922009-05-20 00:36:58 +000061 f(a);
Anders Carlsson7cd3a642009-05-20 01:35:03 +000062
63 f(10i);
Anders Carlsson48265682009-05-27 01:45:47 +000064
65 complex_int_reference_return() = 10i;
Anders Carlssone9f2f452009-05-27 03:37:57 +000066 a = complex_int_reference_return();
Anders Carlsson4bbab922009-05-20 00:36:58 +000067}
68
69void test_aggregate() {
70 C c;
Anders Carlsson4bbab922009-05-20 00:36:58 +000071 f(c);
Eli Friedman5df0d422009-05-20 02:31:19 +000072
Anders Carlsson48265682009-05-27 01:45:47 +000073 f(aggregate_return());
Anders Carlsson68ea78a2009-05-27 01:46:48 +000074 aggregate_reference_return().a = 10;
Anders Carlssone70e8f72009-05-27 16:45:02 +000075
76 c = aggregate_reference_return();
Anders Carlsson4bbab922009-05-20 00:36:58 +000077}
78
Eli Friedmand54b6ac2009-05-27 04:56:12 +000079int& reference_return() {
80 return g;
81}
Eli Friedman4a187842009-05-27 05:39:06 +000082
83int reference_decl() {
84 int& a = g;
85 const int& b = 1;
86 return a+b;
87}
Anders Carlssonfaf86642009-09-01 21:18:52 +000088
89struct A {
90 int& b();
91};
92
93void f(A* a) {
94 int b = a->b();
95}
Anders Carlsson26bc2202009-10-03 16:30:22 +000096
97// PR5122
98void *foo = 0;
99void * const & kFoo = foo;
100
Anders Carlssonb3f74422009-10-15 00:51:46 +0000101struct D : C { D(); ~D(); };
102
103void h() {
104 // CHECK: call void @_ZN1DD1Ev
105 const C& c = D();
106}
107
Anders Carlssone1b7ea12009-10-18 23:09:21 +0000108namespace T {
109 struct A {
110 A();
111 ~A();
112 };
113
114 struct B {
115 B();
116 ~B();
117 A f();
118 };
119
120 void f() {
121 // CHECK: call void @_ZN1T1BC1Ev
122 // CHECK: call void @_ZN1T1B1fEv
123 // CHECK: call void @_ZN1T1BD1Ev
124 const A& a = B().f();
125 // CHECK: call void @_ZN1T1fEv
126 f();
127 // CHECK: call void @_ZN1T1AD1Ev
128 }
129}
130
Anders Carlsson86aa0cd2009-10-19 18:28:22 +0000131// PR5227.
132namespace PR5227 {
133void f(int &a) {
134 (a = 10) = 20;
135}
136}
Sebastian Redl5d484e82009-11-23 17:18:46 +0000137
138// PR5590
139struct s0;
140struct s1 { struct s0 &s0; };
141void f0(s1 a) { s1 b = a; }