references.cpp revision faf86648bfab7e0fa975e2b32c10fe1d8b461e8c
1c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson// RUN: clang-cc -verify -emit-llvm -o %t %s
2c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson
3c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t1() {
4c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  extern int& a;
5c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = a;
6c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
7c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson
8c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t2(int& a) {
9c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = a;
10c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
11c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson
12c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint g;
13c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint& gr = g;
1450c39ea4858265f3f5f42a0c624557ce2281936bEli Friedmanint& grr = gr;
15c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t3() {
16c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = gr;
17c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
184bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
194bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson// Test reference binding.
204bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
2168ea78a093271301dc6396fc683644d8e13a90ddAnders Carlssonstruct C { int a; };
224bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
23e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid f(const bool&);
244bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const int&);
254bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const _Complex int&);
264bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const C&);
274bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
28482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders CarlssonC aggregate_return();
29482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
30482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonbool& bool_reference_return();
31482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonint& int_reference_return();
32482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson_Complex int& complex_int_reference_return();
3368ea78a093271301dc6396fc683644d8e13a90ddAnders CarlssonC& aggregate_reference_return();
345df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
35e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid test_bool() {
36e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  bool a = true;
37e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(a);
38e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
39e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(true);
40482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
41482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  bool_reference_return() = true;
42e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = bool_reference_return();
43e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson}
44e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
454bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_scalar() {
464bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  int a = 10;
474bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(a);
48e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
4938d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson  struct { int bitfield : 3; } s = { 3 };
509f75e6be16b9df33d58ec73955b3e3e3c71b2682Anders Carlsson  f(s.bitfield);
5138d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson
52e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(10);
535df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
545df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman  __attribute((vector_size(16))) typedef int vec4;
555df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman  f((vec4){1,2,3,4}[0]);
56482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
57482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  int_reference_return() = 10;
58e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = int_reference_return();
594bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
604bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
614bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_complex() {
624bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  _Complex int a = 10i;
634bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(a);
647cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson
657cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson  f(10i);
66482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
67482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  complex_int_reference_return() = 10i;
68e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = complex_int_reference_return();
694bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
704bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
714bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_aggregate() {
724bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  C c;
734bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(c);
745df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
75482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  f(aggregate_return());
7668ea78a093271301dc6396fc683644d8e13a90ddAnders Carlsson  aggregate_reference_return().a = 10;
77e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson
78e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson  c = aggregate_reference_return();
794bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
804bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
81d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedmanint& reference_return() {
82d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman  return g;
83d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman}
844a18784dea763be146df68546e6dbf4233c33077Eli Friedman
854a18784dea763be146df68546e6dbf4233c33077Eli Friedmanint reference_decl() {
864a18784dea763be146df68546e6dbf4233c33077Eli Friedman  int& a = g;
874a18784dea763be146df68546e6dbf4233c33077Eli Friedman  const int& b = 1;
884a18784dea763be146df68546e6dbf4233c33077Eli Friedman  return a+b;
894a18784dea763be146df68546e6dbf4233c33077Eli Friedman}
90faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson
91faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonstruct A {
92faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson  int& b();
93faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson};
94faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson
95faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonvoid f(A* a) {
96faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson  int b = a->b();
97faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson}
98