2006-08-23 06:42:10 +00:00
|
|
|
//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file was developed by Chris Lattner and is distributed under
|
|
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file implements the Expr class and subclasses.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "clang/AST/Expr.h"
|
2006-08-24 04:40:38 +00:00
|
|
|
#include "clang/Lex/IdentifierTable.h"
|
2006-08-23 06:42:10 +00:00
|
|
|
#include <iostream>
|
|
|
|
using namespace llvm;
|
|
|
|
using namespace clang;
|
|
|
|
|
|
|
|
void Expr::dump() const {
|
2006-08-24 04:40:38 +00:00
|
|
|
if (this == 0) {
|
2006-08-23 06:42:10 +00:00
|
|
|
std::cerr << "<null expr>";
|
2006-08-24 04:40:38 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
std::cerr << "(";
|
|
|
|
dump_impl();
|
|
|
|
std::cerr << ")";
|
2006-08-23 06:42:10 +00:00
|
|
|
}
|
|
|
|
|
2006-08-24 04:56:27 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Primary Expressions.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2006-08-24 04:53:44 +00:00
|
|
|
void DeclExpr::dump_impl() const {
|
|
|
|
std::cerr << "x";
|
|
|
|
}
|
2006-08-23 06:42:10 +00:00
|
|
|
|
|
|
|
void IntegerConstant::dump_impl() const {
|
|
|
|
std::cerr << "1";
|
|
|
|
}
|
|
|
|
|
|
|
|
void FloatingConstant::dump_impl() const {
|
|
|
|
std::cerr << "1.0";
|
|
|
|
}
|
|
|
|
|
|
|
|
void ParenExpr::dump_impl() const {
|
|
|
|
std::cerr << "'('";
|
|
|
|
Val->dump();
|
|
|
|
std::cerr << "')'";
|
|
|
|
}
|
|
|
|
|
|
|
|
/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
|
|
|
|
/// corresponds to, e.g. "sizeof" or "[pre]++".
|
|
|
|
const char *UnaryOperator::getOpcodeStr(Opcode Op) {
|
|
|
|
switch (Op) {
|
|
|
|
default: assert(0 && "Unknown binary operator");
|
|
|
|
case PostInc: return "[post]++";
|
|
|
|
case PostDec: return "[post]--";
|
|
|
|
case PreInc: return "[pre]++";
|
|
|
|
case PreDec: return "[pre]--";
|
|
|
|
case AddrOf: return "&";
|
|
|
|
case Deref: return "*";
|
|
|
|
case Plus: return "+";
|
|
|
|
case Minus: return "-";
|
|
|
|
case Not: return "~";
|
|
|
|
case LNot: return "!";
|
|
|
|
case Real: return "__real";
|
|
|
|
case Imag: return "__imag";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void UnaryOperator::dump_impl() const {
|
2006-08-24 04:40:38 +00:00
|
|
|
std::cerr << getOpcodeStr(Opc);
|
2006-08-23 06:42:10 +00:00
|
|
|
Input->dump();
|
2006-08-24 04:40:38 +00:00
|
|
|
}
|
|
|
|
|
2006-08-24 04:56:27 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// Postfix Operators.
|
|
|
|
//===----------------------------------------------------------------------===//
|
2006-08-24 04:40:38 +00:00
|
|
|
|
|
|
|
void ArraySubscriptExpr::dump_impl() const {
|
|
|
|
Base->dump();
|
|
|
|
std::cerr << "[";
|
|
|
|
Idx->dump();
|
|
|
|
std::cerr << "]";
|
|
|
|
}
|
|
|
|
|
|
|
|
CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
|
|
|
|
: Fn(fn), NumArgs(numargs) {
|
|
|
|
Args = new Expr*[numargs];
|
|
|
|
for (unsigned i = 0; i != numargs; ++i)
|
|
|
|
Args[i] = args[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
void CallExpr::dump_impl() const {
|
|
|
|
Fn->dump();
|
|
|
|
std::cerr << "(";
|
|
|
|
for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
|
|
|
|
if (i) std::cerr << ", ";
|
|
|
|
getArg(i)->dump();
|
|
|
|
}
|
2006-08-23 06:42:10 +00:00
|
|
|
std::cerr << ")";
|
|
|
|
}
|
|
|
|
|
2006-08-24 04:40:38 +00:00
|
|
|
CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
|
|
|
|
unsigned NumArgs, SourceLocation *commalocs,
|
|
|
|
SourceLocation rparenloc)
|
|
|
|
: CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
|
|
|
|
unsigned NumCommas = getNumCommas();
|
|
|
|
if (NumCommas)
|
|
|
|
CommaLocs = new SourceLocation[NumCommas];
|
|
|
|
else
|
|
|
|
CommaLocs = 0;
|
|
|
|
|
|
|
|
for (unsigned i = 0; i != NumCommas; ++i)
|
|
|
|
CommaLocs[i] = commalocs[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MemberExpr::dump_impl() const {
|
|
|
|
Base->dump();
|
2006-08-24 05:19:28 +00:00
|
|
|
std::cerr << (isArrow ? "->" : ".");
|
|
|
|
|
|
|
|
if (MemberDecl)
|
|
|
|
/*TODO: Print MemberDecl*/;
|
|
|
|
std::cerr << "member";
|
2006-08-24 04:40:38 +00:00
|
|
|
}
|
|
|
|
|
2006-08-23 06:42:10 +00:00
|
|
|
/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
|
|
|
|
/// corresponds to, e.g. "<<=".
|
|
|
|
const char *BinaryOperator::getOpcodeStr(Opcode Op) {
|
|
|
|
switch (Op) {
|
|
|
|
default: assert(0 && "Unknown binary operator");
|
|
|
|
case Mul: return "*";
|
|
|
|
case Div: return "/";
|
|
|
|
case Rem: return "%";
|
|
|
|
case Add: return "+";
|
|
|
|
case Sub: return "-";
|
|
|
|
case Shl: return "<<";
|
|
|
|
case Shr: return ">>";
|
|
|
|
case LT: return "<";
|
|
|
|
case GT: return ">";
|
|
|
|
case LE: return "<=";
|
|
|
|
case GE: return ">=";
|
|
|
|
case EQ: return "==";
|
|
|
|
case NE: return "!=";
|
|
|
|
case And: return "&";
|
|
|
|
case Xor: return "^";
|
|
|
|
case Or: return "|";
|
|
|
|
case LAnd: return "&&";
|
|
|
|
case LOr: return "||";
|
|
|
|
case Assign: return "=";
|
|
|
|
case MulAssign: return "*=";
|
|
|
|
case DivAssign: return "/=";
|
|
|
|
case RemAssign: return "%=";
|
|
|
|
case AddAssign: return "+=";
|
|
|
|
case SubAssign: return "-=";
|
|
|
|
case ShlAssign: return "<<=";
|
|
|
|
case ShrAssign: return ">>=";
|
|
|
|
case AndAssign: return "&=";
|
|
|
|
case XorAssign: return "^=";
|
|
|
|
case OrAssign: return "|=";
|
|
|
|
case Comma: return ",";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void BinaryOperator::dump_impl() const {
|
|
|
|
LHS->dump();
|
|
|
|
std::cerr << " " << getOpcodeStr(Opc) << " ";
|
|
|
|
RHS->dump();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ConditionalOperator::dump_impl() const {
|
|
|
|
Cond->dump();
|
|
|
|
std::cerr << " ? ";
|
|
|
|
LHS->dump();
|
|
|
|
std::cerr << " : ";
|
|
|
|
RHS->dump();
|
|
|
|
}
|