2016-09-26 23:49:47 +00:00
|
|
|
// RUN: %clang_cc1 -std=c++1z %s -emit-llvm -o - -triple %itanium_abi_triple | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-ITANIUM
|
|
|
|
// RUN: %clang_cc1 -std=c++1z %s -emit-llvm -o - -triple %ms_abi_triple | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-WINDOWS
|
|
|
|
|
|
|
|
struct B;
|
|
|
|
struct A {
|
|
|
|
A();
|
|
|
|
A(const A&);
|
|
|
|
|
|
|
|
void operator[](B b);
|
|
|
|
|
|
|
|
int a_member_f(B);
|
|
|
|
};
|
|
|
|
struct B {
|
|
|
|
B();
|
|
|
|
~B();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct C {
|
|
|
|
operator int *();
|
|
|
|
A *operator->();
|
2016-09-28 02:20:06 +00:00
|
|
|
void operator->*(B);
|
2016-09-26 23:49:47 +00:00
|
|
|
|
|
|
|
friend void operator<<(C, B);
|
|
|
|
friend void operator>>(C, B);
|
|
|
|
void operator<<(A);
|
|
|
|
void operator>>(A);
|
|
|
|
|
|
|
|
void operator=(B);
|
|
|
|
void operator+=(B);
|
|
|
|
};
|
|
|
|
|
|
|
|
A make_a();
|
|
|
|
A *make_a_ptr();
|
|
|
|
int A::*make_mem_ptr_a();
|
|
|
|
void (A::*make_mem_fn_ptr_a())();
|
|
|
|
B make_b();
|
|
|
|
C make_c();
|
|
|
|
void side_effect();
|
|
|
|
|
|
|
|
void callee(A);
|
|
|
|
void (*get_f())(A);
|
|
|
|
|
|
|
|
|
|
|
|
// CHECK-LABEL: define {{.*}}@{{.*}}postfix_before_args{{.*}}(
|
|
|
|
void postfix_before_args() {
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_f{{.*}}(
|
|
|
|
// CHECK-ITANIUM: call {{.*}}@_ZN1AC1Ev(
|
2016-09-27 00:52:29 +00:00
|
|
|
// CHECK-WINDOWS: call {{.*}}@"\01??0A@@Q{{AE|EAA}}@XZ"(
|
2016-09-26 23:49:47 +00:00
|
|
|
// CHECK: call {{.*}}%{{.*}}(
|
|
|
|
get_f()(A{});
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}side_effect{{.*}}(
|
|
|
|
// CHECK-ITANIUM: call {{.*}}@_ZN1AC1Ev(
|
2016-09-27 00:52:29 +00:00
|
|
|
// CHECK-WINDOWS: call {{.*}}@"\01??0A@@Q{{AE|EAA}}@XZ"(
|
2016-09-26 23:49:47 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}callee{{.*}}(
|
|
|
|
(side_effect(), callee)(A{});
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CHECK-LABEL: define {{.*}}@{{.*}}dot_lhs_before_rhs{{.*}}(
|
|
|
|
void dot_lhs_before_rhs() {
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}a_member_f{{.*}}(
|
|
|
|
make_a().a_member_f(make_b());
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}a_member_f{{.*}}(
|
|
|
|
make_a_ptr()->a_member_f(make_b());
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}a_member_f{{.*}}(
|
|
|
|
make_c()->a_member_f(make_b());
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CHECK-LABEL: define {{.*}}@{{.*}}array_lhs_before_rhs{{.*}}(
|
|
|
|
void array_lhs_before_rhs() {
|
|
|
|
int (&get_arr())[10];
|
|
|
|
extern int get_index();
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_arr{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_index{{.*}}(
|
|
|
|
get_arr()[get_index()] = 0;
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_index{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_arr{{.*}}(
|
|
|
|
get_index()[get_arr()] = 0;
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECK: call
|
|
|
|
make_a()[make_b()];
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_index{{.*}}(
|
|
|
|
// CHECK: call
|
|
|
|
make_c()[get_index()] = 0;
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}get_index{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECK: call
|
|
|
|
get_index()[make_c()] = 0;
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void *operator new(decltype(sizeof(0)), C);
|
|
|
|
|
|
|
|
// CHECK-LABEL: define {{.*}}@{{.*}}alloc_before_init{{.*}}(
|
|
|
|
void alloc_before_init() {
|
|
|
|
struct Q { Q(A) {} };
|
|
|
|
// CHECK-ITANIUM: call {{.*}}@_Znw{{.*}}(
|
2016-09-27 00:52:29 +00:00
|
|
|
// CHECK-WINDOWS: call {{.*}}@"\01??2@YAP{{EAX_K|AXI}}@Z"(
|
2016-09-26 23:49:47 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
delete new Q(make_a());
|
|
|
|
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
new (make_c()) Q(make_a());
|
|
|
|
// CHECK: }
|
|
|
|
}
|
|
|
|
|
2016-09-26 23:56:57 +00:00
|
|
|
|
|
|
|
// CHECK-LABEL: define {{.*}}@{{.*}}dotstar_lhs_before_rhs{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
int dotstar_lhs_before_rhs() {
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
int a = make_a().*make_mem_ptr_a();
|
|
|
|
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_mem_ptr_a{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
int b = make_a_ptr()->*make_mem_ptr_a();
|
|
|
|
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_c{{.*}}(
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_b{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c()->*make_b();
|
|
|
|
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
|
|
|
|
// CHECK: call
|
2016-09-26 23:49:47 +00:00
|
|
|
(make_a().*make_mem_fn_ptr_a())();
|
|
|
|
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: call {{.*}}@{{.*}}make_a_ptr{{.*}}(
|
|
|
|
// CHECK: call {{.*}}@{{.*}}make_mem_fn_ptr_a{{.*}}(
|
|
|
|
// CHECK: call
|
2016-09-26 23:49:47 +00:00
|
|
|
(make_a_ptr()->*make_mem_fn_ptr_a())();
|
|
|
|
|
|
|
|
return a + b;
|
2016-09-26 23:56:57 +00:00
|
|
|
// CHECK: }
|
2016-09-26 23:49:47 +00:00
|
|
|
}
|
2016-09-26 23:56:57 +00:00
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
#if 0
|
|
|
|
// CHECKDISABLED-LABEL: define {{.*}}@{{.*}}assign_lhs_before_rhs{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
void assign_rhs_before_lhs() {
|
|
|
|
extern int &lhs_ref(), rhs();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}rhs{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}lhs_ref{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
lhs_ref() = rhs();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}rhs{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}lhs_ref{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
lhs_ref() += rhs();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}rhs{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}lhs_ref{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
lhs_ref() %= rhs();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() = make_b();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_b{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() += make_b();
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: }
|
2016-09-26 23:49:47 +00:00
|
|
|
}
|
2016-09-28 02:20:06 +00:00
|
|
|
#endif
|
|
|
|
#if 0
|
|
|
|
// CHECKDISABLED-LABEL: define {{.*}}@{{.*}}shift_lhs_before_rhs{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
void shift_lhs_before_rhs() {
|
|
|
|
extern int lhs(), rhs();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}lhs{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}rhs{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
(void)(lhs() << rhs());
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}lhs{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}rhs{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
(void)(lhs() >> rhs());
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_a{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() << make_a();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_a{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() >> make_a();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_b{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() << make_b();
|
|
|
|
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_c{{.*}}(
|
|
|
|
// CHECKDISABLED: call {{.*}}@{{.*}}make_b{{.*}}(
|
2016-09-26 23:49:47 +00:00
|
|
|
make_c() >> make_b();
|
2016-09-28 02:20:06 +00:00
|
|
|
// CHECKDISABLED: }
|
2016-09-26 23:49:47 +00:00
|
|
|
}
|
2016-09-28 02:20:06 +00:00
|
|
|
#endif
|