forked from OSchip/llvm-project
Implement CodeGen support for the 'CXXConditionDeclExpr' expression node, which represents a 'condition' declaration, e.g: "if (int x=0) {...}".
llvm-svn: 56045
This commit is contained in:
parent
7620ee4550
commit
07052350f0
|
@ -121,6 +121,9 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
|
||||||
case Expr::StringLiteralClass:
|
case Expr::StringLiteralClass:
|
||||||
return EmitStringLiteralLValue(cast<StringLiteral>(E));
|
return EmitStringLiteralLValue(cast<StringLiteral>(E));
|
||||||
|
|
||||||
|
case Expr::CXXConditionDeclExprClass:
|
||||||
|
return EmitCXXConditionDeclLValue(cast<CXXConditionDeclExpr>(E));
|
||||||
|
|
||||||
case Expr::ObjCMessageExprClass:
|
case Expr::ObjCMessageExprClass:
|
||||||
return EmitObjCMessageExprLValue(cast<ObjCMessageExpr>(E));
|
return EmitObjCMessageExprLValue(cast<ObjCMessageExpr>(E));
|
||||||
case Expr::ObjCIvarRefExprClass:
|
case Expr::ObjCIvarRefExprClass:
|
||||||
|
@ -786,6 +789,12 @@ LValue CodeGenFunction::EmitCallExprLValue(const CallExpr *E) {
|
||||||
E->getType().getCVRQualifiers());
|
E->getType().getCVRQualifiers());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LValue
|
||||||
|
CodeGenFunction::EmitCXXConditionDeclLValue(const CXXConditionDeclExpr *E) {
|
||||||
|
EmitLocalBlockVarDecl(*E->getVarDecl());
|
||||||
|
return EmitDeclRefLValue(E);
|
||||||
|
}
|
||||||
|
|
||||||
LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) {
|
LValue CodeGenFunction::EmitObjCMessageExprLValue(const ObjCMessageExpr *E) {
|
||||||
// Can only get l-value for message expression returning aggregate type
|
// Can only get l-value for message expression returning aggregate type
|
||||||
RValue RV = EmitObjCMessageExpr(E);
|
RValue RV = EmitObjCMessageExpr(E);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/Support/IRBuilder.h"
|
#include "llvm/Support/IRBuilder.h"
|
||||||
#include "clang/AST/Expr.h"
|
#include "clang/AST/Expr.h"
|
||||||
|
#include "clang/AST/ExprCXX.h"
|
||||||
#include "clang/AST/ExprObjC.h"
|
#include "clang/AST/ExprObjC.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -333,6 +334,8 @@ public:
|
||||||
LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field,
|
LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field,
|
||||||
bool isUnion, unsigned CVRQualifiers);
|
bool isUnion, unsigned CVRQualifiers);
|
||||||
|
|
||||||
|
LValue EmitCXXConditionDeclLValue(const CXXConditionDeclExpr *E);
|
||||||
|
|
||||||
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E);
|
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E);
|
||||||
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E);
|
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E);
|
||||||
LValue EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E);
|
LValue EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E);
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// RUN: clang -emit-llvm %s -o %t
|
||||||
|
|
||||||
|
void f() {
|
||||||
|
int a;
|
||||||
|
if (int x=a) ++a; else a=x;
|
||||||
|
while (int x=a) ++a;
|
||||||
|
for (; int x=a; --a) ;
|
||||||
|
switch (int x=0) { }
|
||||||
|
}
|
Loading…
Reference in New Issue