summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-25 02:50:31 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-25 02:50:31 +0000
commit8d7524302923f95a57cc3735efb82a32dd6bceb6 (patch)
treec4ddff16396f22940f174a0852497e97d7bab793 /clang/lib
parent6caebb15ed6df3f32275279d6ad78cd2019083b9 (diff)
downloadbcm5719-llvm-8d7524302923f95a57cc3735efb82a32dd6bceb6.tar.gz
bcm5719-llvm-8d7524302923f95a57cc3735efb82a32dd6bceb6.zip
Expression statements undergo lvalue-to-rvalue conversion in C,
but not in C++, so don't emit aggregate loads of volatile references in null context in C++. Happens to have been caught by an assertion. We do not get the scalar case right. Volatiles are really broken. llvm-svn: 112019
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGExprAgg.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp
index 1b6254f1923..89fea398d33 100644
--- a/clang/lib/CodeGen/CGExprAgg.cpp
+++ b/clang/lib/CodeGen/CGExprAgg.cpp
@@ -192,10 +192,18 @@ void AggExprEmitter::EmitGCMove(const Expr *E, RValue Src) {
void AggExprEmitter::EmitFinalDestCopy(const Expr *E, RValue Src, bool Ignore) {
assert(Src.isAggregate() && "value must be aggregate value!");
- // If the result is ignored, don't copy from the value.
+ // If DestPtr is null, then we're evaluating an aggregate expression
+ // in a context (like an expression statement) that doesn't care
+ // about the result. C says that an lvalue-to-rvalue conversion is
+ // performed in these cases; C++ says that it is not. In either
+ // case, we don't actually need to do anything unless the value is
+ // volatile.
if (DestPtr == 0) {
- if (!Src.isVolatileQualified() || (IgnoreResult && Ignore))
+ if (!Src.isVolatileQualified() ||
+ CGF.CGM.getLangOptions().CPlusPlus ||
+ (IgnoreResult && Ignore))
return;
+
// If the source is volatile, we must read from it; to do that, we need
// some place to put it.
DestPtr = CGF.CreateMemTemp(E->getType(), "agg.tmp");
OpenPOWER on IntegriCloud