diff options
author | Chris Lattner <sabre@nondot.org> | 2007-11-30 18:02:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-11-30 18:02:19 +0000 |
commit | 3e47be5c90b2bf04369239ba618336c96e299a4c (patch) | |
tree | 16c474e1e1da6a1fa449d72aa3df1377f46c8f97 | |
parent | 2202bce80fc72d067cbe67dc1512f7b45351fd31 (diff) |
fix a bug handling typedefs in member expr codegen. Patch
by Seo Sanghyeon
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44455 91177308-0d34-0410-b5e6-96231b3b80d8
-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; +} |