| // RUN: clang-cc -verify -emit-llvm -o %t %s |
| |
| void t1() { |
| extern int& a; |
| int b = a; |
| } |
| |
| void t2(int& a) { |
| int b = a; |
| } |
| |
| int g; |
| int& gr = g; |
| int& grr = gr; |
| void t3() { |
| int b = gr; |
| } |
| |
| // Test reference binding. |
| |
| struct C { int a; }; |
| |
| void f(const bool&); |
| void f(const int&); |
| void f(const _Complex int&); |
| void f(const C&); |
| |
| C aggregate_return(); |
| |
| bool& bool_reference_return(); |
| int& int_reference_return(); |
| _Complex int& complex_int_reference_return(); |
| C& aggregate_reference_return(); |
| |
| void test_bool() { |
| bool a = true; |
| f(a); |
| |
| f(true); |
| |
| bool_reference_return() = true; |
| a = bool_reference_return(); |
| } |
| |
| void test_scalar() { |
| int a = 10; |
| f(a); |
| |
| struct { int bitfield : 3; } s = { 3 }; |
| f(s.bitfield); |
| |
| f(10); |
| |
| __attribute((vector_size(16))) typedef int vec4; |
| f((vec4){1,2,3,4}[0]); |
| |
| int_reference_return() = 10; |
| a = int_reference_return(); |
| } |
| |
| void test_complex() { |
| _Complex int a = 10i; |
| f(a); |
| |
| f(10i); |
| |
| complex_int_reference_return() = 10i; |
| a = complex_int_reference_return(); |
| } |
| |
| void test_aggregate() { |
| C c; |
| f(c); |
| |
| f(aggregate_return()); |
| aggregate_reference_return().a = 10; |
| |
| c = aggregate_reference_return(); |
| } |
| |
| int& reference_return() { |
| return g; |
| } |
| |
| int reference_decl() { |
| int& a = g; |
| const int& b = 1; |
| return a+b; |
| } |