]> granicus.if.org Git - clang/commitdiff
Add codegen upport for implicit casts to aggregate exprs.
authorAnders Carlsson <andersca@mac.com>
Mon, 14 Jan 2008 06:28:57 +0000 (06:28 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 14 Jan 2008 06:28:57 +0000 (06:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45954 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExprAgg.cpp
test/CodeGen/struct.c

index 5470e7f9f57262b8fff5b74404c6e00b547a57e1..5836262175fccc8ea27f28471e36a9382a03aca9 100644 (file)
@@ -70,8 +70,8 @@ public:
 
   // Operators.
   //  case Expr::UnaryOperatorClass:
-  //  case Expr::ImplicitCastExprClass:
   //  case Expr::CastExprClass: 
+  void VisitImplicitCastExpr(ImplicitCastExpr *E);
   void VisitCallExpr(const CallExpr *E);
   void VisitStmtExpr(const StmtExpr *E);
   void VisitBinaryOperator(const BinaryOperator *BO);
@@ -137,6 +137,16 @@ void AggExprEmitter::EmitAggLoadOfLValue(const Expr *E) {
 //                            Visitor Methods
 //===----------------------------------------------------------------------===//
 
+void AggExprEmitter::VisitImplicitCastExpr(ImplicitCastExpr *E)
+{
+  QualType STy = E->getSubExpr()->getType().getCanonicalType();
+  QualType Ty = E->getType().getCanonicalType();
+  
+  assert(STy == Ty && "Implicit cast types must be equal");
+  
+  Visit(E->getSubExpr());
+}
+
 void AggExprEmitter::VisitCallExpr(const CallExpr *E)
 {
   RValue RV = CGF.EmitCallExpr(E);
index a52e538a7f68bbfe16db8d4c9c46b65dc305c95e..8f9ecd6080ab9523c234ea658106744f8e8b499a 100644 (file)
@@ -112,3 +112,18 @@ struct _w
 
   _Bool j,k;
 } ws;
+
+/* Implicit casts (due to typedefs) */
+typedef struct _a
+{
+  int a;
+} a;
+
+void f11()
+{
+    struct _a a1;
+    a a2;
+    
+    a1 = a2;
+    a2 = a1;
+}