Commit 8af5d87083a1ce8159b810165f8b210beeca9e2c
1 parent
7d1e9334f9
Exists in
master
Fix ++ and --
Showing 1 changed file with 20 additions and 9 deletions Side-by-side Diff
ast_expr.cc
View file @
8af5d87
... | ... | @@ -166,18 +166,29 @@ |
166 | 166 | } |
167 | 167 | |
168 | 168 | llvm::Value* CompoundExpr::Emit() { |
169 | - llvm::Value* l = left->Emit(); | |
170 | - llvm::Value* r = right->Emit(); | |
169 | + llvm::Value* l = left ? left->Emit() : NULL; | |
170 | + llvm::Value* r = right ? right->Emit() : NULL; | |
171 | 171 | llvm::BasicBlock* b = irgen.GetBasicBlock(); |
172 | 172 | //austins additional value |
173 | 173 | llvm::Value *val; |
174 | - if(!l) { | |
175 | - if(op->getToken() == "++") | |
176 | - val = llvm::ConstantInt::get(irgen.GetIntType(), 1); | |
177 | - return llvm::BinaryOperator::CreateAdd(l, val, "", irgen.GetBasicBlock()); | |
178 | - if(op->getToken() == "--") | |
179 | - val = llvm::ConstantInt::get(irgen.GetIntType(), 1); | |
180 | - return llvm::BinaryOperator::CreateSub(l, val, "", irgen.GetBasicBlock()); | |
174 | + if(!l || !r) { | |
175 | + VarExpr* ve = dynamic_cast<VarExpr*>(l ? left : right); | |
176 | + llvm::Value* ret; | |
177 | + llvm::Value* var = l ? l : r; | |
178 | + | |
179 | + if(var->getType()->isFPOrFPVectorTy()) val = llvm::ConstantFP::get(irgen.GetFloatType(), 1.0); | |
180 | + else val = llvm::ConstantInt::get(irgen.GetIntType(), 1); | |
181 | + | |
182 | + if(op->getToken() == "++") { | |
183 | + ret = llvm::BinaryOperator::CreateAdd(var, val, "", b); | |
184 | + } | |
185 | + else if(op->getToken() == "--") { | |
186 | + ret = llvm::BinaryOperator::CreateSub(var, val, "", b); | |
187 | + } | |
188 | + new llvm::StoreInst(ret, findSymbol(ve->GetIdentifier()->GetName()).second, false, b); | |
189 | + | |
190 | + if(!l) return ret; | |
191 | + else return var; | |
181 | 192 | } |
182 | 193 | if(l->getType()->isFPOrFPVectorTy()) { |
183 | 194 | if(op->getToken() == "+") |