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