references.cpp revision 4a18784dea763be146df68546e6dbf4233c33077
1// RUN: clang-cc -verify -emit-llvm -o %t %s
2
3void t1() {
4  extern int& a;
5  int b = a;
6}
7
8void t2(int& a) {
9  int b = a;
10}
11
12int g;
13int& gr = g;
14void t3() {
15  int b = gr;
16}
17
18// Test reference binding.
19
20struct C { int a; };
21
22void f(const bool&);
23void f(const int&);
24void f(const _Complex int&);
25void f(const C&);
26
27C aggregate_return();
28
29bool& bool_reference_return();
30int& int_reference_return();
31_Complex int& complex_int_reference_return();
32C& aggregate_reference_return();
33
34void test_bool() {
35  bool a = true;
36  f(a);
37
38  f(true);
39
40  bool_reference_return() = true;
41  a = bool_reference_return();
42}
43
44void test_scalar() {
45  int a = 10;
46  f(a);
47
48  struct { int bitfield : 3; } s = { 3 };
49  f(s.bitfield);
50
51  f(10);
52
53  __attribute((vector_size(16))) typedef int vec4;
54  f((vec4){1,2,3,4}[0]);
55
56  int_reference_return() = 10;
57  a = int_reference_return();
58}
59
60void test_complex() {
61  _Complex int a = 10i;
62  f(a);
63
64  f(10i);
65
66  complex_int_reference_return() = 10i;
67  a = complex_int_reference_return();
68}
69
70void test_aggregate() {
71  C c;
72  f(c);
73
74  f(aggregate_return());
75  aggregate_reference_return().a = 10;
76}
77
78int& reference_return() {
79  return g;
80}
81
82int reference_decl() {
83  int& a = g;
84  const int& b = 1;
85  return a+b;
86}
87