diff options
author | John McCall <rjmccall@apple.com> | 2010-12-05 02:00:02 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-12-05 02:00:02 +0000 |
commit | 2a41637a995affa1563f4d82a8b026e326a2faa0 (patch) | |
tree | 721f477e4c3c69354d9d4365bd5bc124b493c64c /lib/CodeGen/CGStmt.cpp | |
parent | 560bf12e97773ba19e55382c32f8b64cd8315315 (diff) |
Fix a bug in the emission of __real/__imag l-values on scalar operands.
Fix a bug in the emission of complex compound assignment l-values.
Introduce a method to emit an expression whose value isn't relevant.
Make that method evaluate its operand as an l-value if it is one.
Fixes our volatile compliance in C++.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120931 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGStmt.cpp')
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index c510213313..098fe7f422 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -69,13 +69,27 @@ void CodeGenFunction::EmitStmt(const Stmt *S) { EmitStopPoint(S); switch (S->getStmtClass()) { - default: - // Must be an expression in a stmt context. Emit the value (to get - // side-effects) and ignore the result. - if (!isa<Expr>(S)) - ErrorUnsupported(S, "statement"); - - EmitAnyExpr(cast<Expr>(S), AggValueSlot::ignored(), true); + case Stmt::NoStmtClass: + case Stmt::CXXCatchStmtClass: + case Stmt::SwitchCaseClass: + llvm_unreachable("invalid statement class to emit generically"); + case Stmt::NullStmtClass: + case Stmt::CompoundStmtClass: + case Stmt::DeclStmtClass: + case Stmt::LabelStmtClass: + case Stmt::GotoStmtClass: + case Stmt::BreakStmtClass: + case Stmt::ContinueStmtClass: + case Stmt::DefaultStmtClass: + case Stmt::CaseStmtClass: + llvm_unreachable("should have emitted these statements as simple"); + +#define STMT(Type, Base) +#define ABSTRACT_STMT(Op) +#define EXPR(Type, Base) \ + case Stmt::Type##Class: +#include "clang/AST/StmtNodes.inc" + EmitIgnoredExpr(cast<Expr>(S)); // Expression emitters don't handle unreachable blocks yet, so look for one // explicitly here. This handles the common case of a call to a noreturn @@ -87,6 +101,7 @@ void CodeGenFunction::EmitStmt(const Stmt *S) { } } break; + case Stmt::IndirectGotoStmtClass: EmitIndirectGotoStmt(cast<IndirectGotoStmt>(*S)); break; |