
The standard says: [expr.static.cast] p11: "If the prvalue of type “pointer to cv1 B” points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. Otherwise, the behavior is undefined." Therefore, the GEP must be inbounds. This should solve the failure to optimize away a null check shown in PR35909: https://bugs.llvm.org/show_bug.cgi?id=35909 Differential Revision: https://reviews.llvm.org/D42249 llvm-svn: 322950
28 lines
551 B
C++
28 lines
551 B
C++
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
|
|
|
|
class A {
|
|
int a;
|
|
};
|
|
|
|
class B {
|
|
int b;
|
|
public:
|
|
A *getAsA();
|
|
};
|
|
|
|
class X : public A, public B {
|
|
int x;
|
|
};
|
|
|
|
// PR35909 - https://bugs.llvm.org/show_bug.cgi?id=35909
|
|
|
|
A *B::getAsA() {
|
|
return static_cast<X*>(this);
|
|
|
|
// CHECK-LABEL: define %class.A* @_ZN1B6getAsAEv
|
|
// CHECK: %[[THIS:.*]] = load %class.B*, %class.B**
|
|
// CHECK-NEXT: %[[BC:.*]] = bitcast %class.B* %[[THIS]] to i8*
|
|
// CHECK-NEXT: getelementptr inbounds i8, i8* %[[BC]], i64 -4
|
|
}
|
|
|