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