1 // RUN: clang-cc -verify -emit-llvm -o %t %s
2 
3 void t1() {
4   extern int& a;
5   int b = a;
6 }
7 
8 void t2(int& a) {
9   int b = a;
10 }
11 
12 int g;
13 int& gr = g;
14 int& grr = gr;
15 void t3() {
16   int b = gr;
17 }
18 
19 // Test reference binding.
20 
21 struct C { int a; };
22 
23 void f(const bool&);
24 void f(const int&);
25 void f(const _Complex int&);
26 void f(const C&);
27 
28 C aggregate_return();
29 
30 bool& bool_reference_return();
31 int& int_reference_return();
32 _Complex int& complex_int_reference_return();
33 C& aggregate_reference_return();
34 
35 void 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 
45 void 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 
61 void 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 
71 void 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 
81 int& reference_return() {
82   return g;
83 }
84 
85 int reference_decl() {
86   int& a = g;
87   const int& b = 1;
88   return a+b;
89 }
90