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