brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · b84cb78 Raw
309 lines · cpp
1// RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s2void t1() {3  // CHECK-LABEL: define{{.*}} void @_Z2t1v4  // CHECK: [[REFLOAD:%.*]] = load ptr, ptr @a, align 85  // CHECK: load i32, ptr [[REFLOAD]], align 46  extern int& a;7  int b = a; 8}9 10void t2(int& a) {11  // CHECK-LABEL: define{{.*}} void @_Z2t2Ri12  // CHECK: [[REFLOAD2:%.*]] = load ptr, ptr {{.*}}, align 813  // CHECK: load i32, ptr [[REFLOAD2]], align 414  int b = a;15}16 17int g;18int& gr = g;19int& grr = gr;20void t3() {21  int b = gr;22}23 24// Test reference binding.25 26struct C { int a; };27void f(const bool&);28void f(const int&);29void f(const _Complex int&);30void f(const C&);31 32C aggregate_return();33 34bool& bool_reference_return();35int& int_reference_return();36_Complex int& complex_int_reference_return();37C& aggregate_reference_return();38 39void test_bool() {40  bool a = true;41  f(a);42 43  f(true);44  45  bool_reference_return() = true;46  a = bool_reference_return();47  48  struct { const bool& b; } b = { true };49}50 51void test_scalar() {52  int a = 10;53  f(a);54  55  struct { int bitfield : 3; } s = { 3 };56  f(s.bitfield);57  58  f(10);59 60  __attribute((vector_size(16))) typedef int vec4;61  f((vec4){1,2,3,4}[0]);62  63  int_reference_return() = 10;64  a = int_reference_return();65  66  struct { const int& a; } agg = { 10 };67}68 69void test_complex() {70  _Complex int a = 10i;71  f(a);72  73  f(10i);74  75  complex_int_reference_return() = 10i;76  a = complex_int_reference_return();77  78  struct { const _Complex int &a; } agg = { 10i };79}80 81void test_aggregate() {82  C c;83  f(c);84 85  f(aggregate_return());86  aggregate_reference_return().a = 10;87 88  c = aggregate_reference_return();89  90  struct { const C& a; } agg = { C() };91}92 93int& reference_return() {94  return g;95}96 97int reference_decl() {98  int& a = g;99  const int& b = 1;100  return a+b;101}102 103struct A {104  int& b();105};106 107void f(A* a) {108  int b = a->b();109}110 111// PR5122112void *foo = 0;113void * const & kFoo = foo;114 115struct D : C { D(); ~D(); };116 117void h() {118  // CHECK: call void @_ZN1DD1Ev119  const C& c = D();120}121 122namespace T {123  struct A {124    A();125    ~A();126  };127 128  struct B {129    B();130    ~B();131    A f();132  };133 134  void f() {135    // CHECK: call void @_ZN1T1BC1Ev136    // CHECK: call void @_ZN1T1B1fEv137    // CHECK: call void @_ZN1T1BD1Ev138    const A& a = B().f();139    // CHECK: call void @_ZN1T1fEv140    f();141    // CHECK: call void @_ZN1T1AD1Ev142  }143}144 145// PR5227.146namespace PR5227 {147void f(int &a) {148  (a = 10) = 20;149}150}151 152// PR5590153struct s0;154struct s1 { struct s0 &s0; };155void f0(s1 a) { s1 b = a; }156 157// PR6024158// CHECK: @_Z2f2v()159// CHECK: alloca i32,160// CHECK-NEXT: store161// CHECK-NEXT: ret162const int &f2() { return 0; }163 164// Don't constant fold const reference parameters with default arguments to165// their default arguments.166namespace N1 {167  const int foo = 1;168  // CHECK: @_ZN2N14test169  void test(const int& arg = foo) {170    // Ensure this array is on the stack where we can set values instead of171    // being a global constant.172    // CHECK: %args_array = alloca173    const int* const args_array[] = { &arg };174  }175}176 177// Bind to subobjects while extending the life of the complete object.178namespace N2 {179  class X {180  public:181    X(const X&);182    X &operator=(const X&);183    ~X();184  };185 186  struct P {187    X first;188  };189 190  P getP();191 192  // CHECK-LABEL: define{{.*}} void @_ZN2N21fEi193  // CHECK: call void @_ZN2N24getPEv194  // CHECK: store i32 17195  // CHECK: call void @_ZN2N21PD1Ev196  void f(int i) {197    const X& xr = getP().first;198    i = 17;199  }200 201  struct SpaceWaster {202    int i, j;203  };204 205  struct ReallyHasX {206    X x;207  };208 209  struct HasX : ReallyHasX { };210 211  struct HasXContainer {212    HasX has;213  };214 215  struct Y : SpaceWaster, HasXContainer { };216  struct Z : SpaceWaster, Y { };217 218  Z getZ();219 220  // CHECK-LABEL: define{{.*}} void @_ZN2N21gEi221  // CHECK: call void @_ZN2N24getZEv222  // CHECK: {{getelementptr inbounds.*i64 16}}223  // CHECK: store i32 19224  // CHECK: call void @_ZN2N21ZD1Ev225  // CHECK: ret void226  void g(int i) {227    const X &xr = getZ().has.x;228    i = 19;    229  }230}231 232namespace N3 {233 234// PR7326235 236struct A {237  explicit A(int);238  ~A();239};240 241// CHECK-LABEL: define internal void @__cxx_global_var_init242// CHECK: call void @_ZN2N31AC1Ei(ptr {{[^,]*}} @_ZGRN2N35sA123E_, i32 noundef 123)243// CHECK: call i32 @__cxa_atexit244// CHECK: ret void245const A &sA123 = A(123);246}247 248namespace N4 {249  250struct A {251  A();252  ~A();253};254 255void f() {256  // CHECK-LABEL: define{{.*}} void @_ZN2N41fEv257  // CHECK: call void @_ZN2N41AC1Ev(ptr {{[^,]*}} @_ZGRZN2N41fEvE2ar_)258  // CHECK: call i32 @__cxa_atexit259  // CHECK: ret void260  static const A& ar = A();261  262}263}264 265// PR9494266namespace N5 {267struct AnyS { bool b; };268void f(const bool&);269AnyS g();270void h() {271  // CHECK: call i8 @_ZN2N51gEv()272  // CHECK: call void @_ZN2N51fERKb(ptr273  f(g().b);274}275}276 277// PR9565278namespace PR9565 {279  struct a { int a : 10, b : 10; };280  // CHECK-LABEL: define{{.*}} void @_ZN6PR95651fEv()281  void f() {282    // CHECK: call void @llvm.memcpy283    a x = { 0, 0 };284    // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17285    // CHECK: store i32 [[WITH_SEVENTEEN]], ptr [[XA:%[.a-zA-Z0-9]+]]286    x.a = 17;287    // CHECK-NEXT: load288    // CHECK-NEXT: shl289    // CHECK-NEXT: ashr290    // CHECK-NEXT: store i32291    // CHECK-NEXT: store ptr292    const int &y = x.a;293    // CHECK-NEXT: load294    // CHECK-NEXT: and295    // CHECK-NEXT: or i32 {{.*}}, 19456296    // CHECK-NEXT: store i32297    x.b = 19;298    // CHECK-NEXT: ret void299  }300}301 302namespace N6 {303  extern struct x {char& x;}y;304  int a() { return y.x; }305  // CHECK-LABEL: define{{.*}} i32 @_ZN2N61aEv306  // CHECK: [[REFLOAD3:%.*]] = load ptr, ptr @_ZN2N61yE, align 8307  // CHECK: load i8, ptr [[REFLOAD3]], align 1308}309