Expand on code gen. for pointer to data members so it works
for base classe members as well. Test case enhanced for this. llvm-svn: 84780
This commit is contained in:
parent
a93ca3c637
commit
b25817ac1f
|
@ -1519,9 +1519,10 @@ LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) {
|
|||
LValue CodeGenFunction::EmitPointerToDataMemberLValue(
|
||||
const QualifiedDeclRefExpr *E) {
|
||||
const FieldDecl *Field = cast<FieldDecl>(E->getDecl());
|
||||
const NestedNameSpecifier *NNSpec = E->getQualifier();
|
||||
const Type *NNSpecType = NNSpec->getAsType();
|
||||
QualType NNSpecTy = getContext().getCanonicalType(QualType(NNSpecType, 0));
|
||||
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Field->getDeclContext());
|
||||
QualType NNSpecTy =
|
||||
getContext().getCanonicalType(
|
||||
getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(ClassDecl)));
|
||||
NNSpecTy = getContext().getPointerType(NNSpecTy);
|
||||
llvm::Value *V = llvm::Constant::getNullValue(ConvertType(NNSpecTy));
|
||||
LValue MemExpLV = EmitLValueForField(V, const_cast<FieldDecl*>(Field),
|
||||
|
|
|
@ -2,9 +2,23 @@
|
|||
|
||||
extern "C" int printf(...);
|
||||
|
||||
class A {
|
||||
struct V {
|
||||
double d;
|
||||
int iV;
|
||||
};
|
||||
|
||||
struct B : virtual V{
|
||||
double d;
|
||||
int iB;
|
||||
};
|
||||
|
||||
struct B1 : virtual V{
|
||||
double d;
|
||||
int iB1;
|
||||
};
|
||||
|
||||
class A : public B, public B1 {
|
||||
public:
|
||||
A() : f(1.0), d(2.0), Ai(100) {}
|
||||
float f;
|
||||
double d;
|
||||
int Ai;
|
||||
|
@ -17,9 +31,13 @@ int main()
|
|||
float A::* pf = &A::f;
|
||||
double A::* pd = &A::d;
|
||||
printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
|
||||
|
||||
printf("%d\n", &A::B::iB);
|
||||
printf("%d\n", &A::B1::iB1);
|
||||
printf("%d\n", &A::f);
|
||||
printf("%d\n", &A::B::iV);
|
||||
printf("%d\n", &A::B1::iV);
|
||||
printf("%d\n", &A::B::V::iV);
|
||||
printf("%d\n", &A::B1::V::iV);
|
||||
// FIXME. NYI
|
||||
// printf(" %d, %f, %f \n", a1.*pa, a1.f, a1.d);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue