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:
Fariborz Jahanian 2009-10-21 21:01:47 +00:00
parent a93ca3c637
commit b25817ac1f
2 changed files with 27 additions and 8 deletions

View File

@ -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),

View File

@ -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);
}