Files
clang-p2996/clang/test/CodeGenOpenCLCXX/addrspace-derived-base.cl
Sven van Haastregt 6236496561 [OpenCL] Fix address space for implicit conversion (PR43145)
Clang was creating a DerivedToBase ImplicitCastExpr that was also
casting between address spaces as part of the second step in the
standard conversion sequence.  Defer the address space conversion to
the third step in the sequence instead, such that we get a separate
ImplicitCastExpr for the address space conversion.

Differential Revision: https://reviews.llvm.org/D70605
2019-12-02 14:20:15 +00:00

83 lines
2.0 KiB
Common Lisp

// RUN: %clang_cc1 %s -triple spir -cl-std=clc++ -emit-llvm -O0 -o - | FileCheck %s
struct B {
int mb;
};
class D : public B {
public:
int getmb() { return mb; }
};
void foo() {
D d;
//CHECK-LABEL: foo
//CHECK: addrspacecast %class.D* %d to %class.D addrspace(4)*
//CHECK: call spir_func i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)*
d.getmb();
}
//Derived and Base are in the same address space.
//CHECK: define linkonce_odr spir_func i32 @_ZNU3AS41D5getmbEv(%class.D addrspace(4)* %this)
//CHECK: bitcast %class.D addrspace(4)* %this1 to %struct.B addrspace(4)*
// Calling base method through multiple inheritance.
class B2 {
public:
void baseMethod() const { }
int &getRef() { return bb; }
int bb;
};
class Derived : public B, public B2 {
public:
void work() const { baseMethod(); }
// CHECK-LABEL: work
// CHECK: bitcast i8 addrspace(4)* %add.ptr to %class.B2 addrspace(4)*
};
void pr43145(const Derived *argDerived) {
argDerived->work();
}
// Casting from base to derived.
void pr43145_2(B *argB) {
Derived *x = (Derived*)argB;
// CHECK-LABEL: @_Z9pr43145_2
// CHECK: bitcast %struct.B addrspace(4)* %0 to %class.Derived addrspace(4)*
}
// Assigning to reference returned by base class method through derived class.
void pr43145_3(int n) {
Derived d;
d.getRef() = n;
// CHECK-LABEL: @_Z9pr43145_3
// CHECK: addrspacecast %class.Derived* %d to %class.Derived addrspace(4)*
// CHECK: bitcast i8 addrspace(4)* %add.ptr to %class.B2 addrspace(4)*
// CHECK: call {{.*}} @_ZNU3AS42B26getRefEv
private Derived *pd = &d;
pd->getRef() = n;
// CHECK: addrspacecast %class.Derived* %4 to %class.Derived addrspace(4)*
// CHECK: bitcast i8 addrspace(4)* %add.ptr1 to %class.B2 addrspace(4)*
// CHECK: call {{.*}} @_ZNU3AS42B26getRefEv
}
// Implicit conversion of derived to base.
void functionWithBaseArgPtr(class B2 *b) {}
void functionWithBaseArgRef(class B2 &b) {}
void pr43145_4() {
Derived d;
functionWithBaseArgPtr(&d);
functionWithBaseArgRef(d);
}