]> granicus.if.org Git - clang/commitdiff
fix a bug handling typedefs in member expr codegen. Patch
authorChris Lattner <sabre@nondot.org>
Fri, 30 Nov 2007 18:02:19 +0000 (18:02 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 30 Nov 2007 18:02:19 +0000 (18:02 +0000)
by Seo Sanghyeon

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44455 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp
test/CodeGen/typedef.c [new file with mode: 0644]

index 8fcc94805ac3952be902e03e04c2645becec8e24..a4aa6db7ba1201007114f9073003ad0a721d5a47 100644 (file)
@@ -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 (file)
index 0000000..291f0c8
--- /dev/null
@@ -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;
+}