aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CGExprAgg.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-02-11 01:09:17 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-02-11 01:09:17 +0000
commitff6e2b7d31b0f5494f583419e5061c32ea4e6180 (patch)
tree2cbd94d0013da839a038e30d362de25f2946e559 /CodeGen/CGExprAgg.cpp
parent546d94c77e4636a7dbce160c3c8e4157a2fe6d81 (diff)
A couple of minor fixes to aggregate codegen, to stop asserting on some
edge cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46944 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CGExprAgg.cpp')
-rw-r--r--CodeGen/CGExprAgg.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/CodeGen/CGExprAgg.cpp b/CodeGen/CGExprAgg.cpp
index 377e90df70..0b12647efd 100644
--- a/CodeGen/CGExprAgg.cpp
+++ b/CodeGen/CGExprAgg.cpp
@@ -142,8 +142,10 @@ void AggExprEmitter::VisitImplicitCastExpr(ImplicitCastExpr *E)
{
QualType STy = E->getSubExpr()->getType().getCanonicalType();
QualType Ty = E->getType().getCanonicalType();
-
- assert(STy.getUnqualifiedType() == Ty && "Implicit cast types must be equal");
+
+ assert(CGF.getContext().typesAreCompatible(
+ STy.getUnqualifiedType(), Ty.getUnqualifiedType())
+ && "Implicit cast types must be compatible");
Visit(E->getSubExpr());
}
@@ -184,17 +186,22 @@ void AggExprEmitter::VisitBinaryOperator(const BinaryOperator *E) {
}
void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
- assert(E->getLHS()->getType().getCanonicalType() ==
- E->getRHS()->getType().getCanonicalType() && "Invalid assignment");
+ // For an assignment to work, the value on the right has
+ // to be compatible with the value on the left.
+ assert(CGF.getContext().typesAreCompatible(
+ E->getLHS()->getType().getUnqualifiedType(),
+ E->getRHS()->getType().getUnqualifiedType())
+ && "Invalid assignment");
LValue LHS = CGF.EmitLValue(E->getLHS());
// Codegen the RHS so that it stores directly into the LHS.
CGF.EmitAggExpr(E->getRHS(), LHS.getAddress(), false /*FIXME: VOLATILE LHS*/);
+ if (DestPtr == 0)
+ return;
+
// If the result of the assignment is used, copy the RHS there also.
- if (DestPtr) {
- assert(0 && "FIXME: Chained agg assignment not implemented yet");
- }
+ EmitAggregateCopy(DestPtr, LHS.getAddress(), E->getType());
}
void AggExprEmitter::VisitConditionalOperator(const ConditionalOperator *E) {