diff options
-rw-r--r-- | CodeGen/CGExpr.cpp | 5 | ||||
-rw-r--r-- | test/CodeGen/typedef.c | 8 |
2 files changed, 11 insertions, 2 deletions
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp index 8fcc94805a..a4aa6db7ba 100644 --- a/CodeGen/CGExpr.cpp +++ b/CodeGen/CGExpr.cpp @@ -393,10 +393,11 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) { BaseValue = BaseLV.getAddress(); if (E->isArrow()) { - QualType PTy = cast<PointerType>(BaseExpr->getType())->getPointeeType(); + QualType Ty = BaseExpr->getType(); + Ty = cast<PointerType>(Ty.getCanonicalType())->getPointeeType(); BaseValue = Builder.CreateBitCast(BaseValue, - llvm::PointerType::get(ConvertType(PTy)), "tmp"); + llvm::PointerType::get(ConvertType(Ty)), "tmp"); } } else BaseValue = EmitScalarExpr(BaseExpr); diff --git a/test/CodeGen/typedef.c b/test/CodeGen/typedef.c new file mode 100644 index 0000000000..291f0c89db --- /dev/null +++ b/test/CodeGen/typedef.c @@ -0,0 +1,8 @@ +// RUN: clang -emit-llvm %s + +typedef struct { int i; } Value; +typedef Value *PValue; + +int get_value(PValue v) { + return v->i; +} |