aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-02-16 23:55:16 +0000
committerChris Lattner <sabre@nondot.org>2008-02-16 23:55:16 +0000
commit19a1d7c646729eb858b15583e647262a22de3637 (patch)
treeb8a6e9a1f5715a4994fb46b68484c785f0101e26
parent7df3d71b2da8aede8ca72f971050b851d1734bf0 (diff)
implement codegen support for aggregates casted to void.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47226 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CodeGen/CGExprScalar.cpp16
-rw-r--r--test/CodeGen/compound.c7
2 files changed, 18 insertions, 5 deletions
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp
index 6db7beed0b..2c7763db8f 100644
--- a/CodeGen/CGExprScalar.cpp
+++ b/CodeGen/CGExprScalar.cpp
@@ -508,16 +508,24 @@ Value *ScalarExprEmitter::VisitImplicitCastExpr(const ImplicitCastExpr *E) {
// handle things like function to ptr-to-function decay etc.
Value *ScalarExprEmitter::EmitCastExpr(const Expr *E, QualType DestTy) {
// Handle cases where the source is an non-complex type.
- if (!E->getType()->isComplexType()) {
+
+ if (!CGF.hasAggregateLLVMType(E->getType())) {
Value *Src = Visit(const_cast<Expr*>(E));
// Use EmitScalarConversion to perform the conversion.
return EmitScalarConversion(Src, E->getType(), DestTy);
}
+
+ if (E->getType()->isComplexType()) {
+ // Handle cases where the source is a complex type.
+ return EmitComplexToScalarConversion(CGF.EmitComplexExpr(E), E->getType(),
+ DestTy);
+ }
- // Handle cases where the source is a complex type.
- return EmitComplexToScalarConversion(CGF.EmitComplexExpr(E), E->getType(),
- DestTy);
+ // Okay, this is a cast from an aggregate. It must be a cast to void. Just
+ // evaluate the result and return.
+ CGF.EmitAggExpr(E, 0, false);
+ return 0;
}
Value *ScalarExprEmitter::VisitStmtExpr(const StmtExpr *E) {
diff --git a/test/CodeGen/compound.c b/test/CodeGen/compound.c
index 0909565631..c8afceef76 100644
--- a/test/CodeGen/compound.c
+++ b/test/CodeGen/compound.c
@@ -1,4 +1,4 @@
-// RUN: clang %s -emit-llvm
+// RUN: clang < %s -emit-llvm
int A;
long long B;
int C;
@@ -18,3 +18,8 @@ void foo(char *strbuf) {
int stufflen = 4;
strbuf += stufflen;
}
+
+
+// Aggregate cast to void
+union uu { int a;}; void f(union uu p) { (void) p;}
+