blob: 460515744912b4af7c28727dca19cfa528d206b3 [file] [log] [blame]
Chris Lattner1b926492006-08-23 06:42:10 +00001//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr class and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Expr.h"
Chris Lattnere165d942006-08-24 04:40:38 +000015#include "clang/Lex/IdentifierTable.h"
Chris Lattner1b926492006-08-23 06:42:10 +000016#include <iostream>
17using namespace llvm;
18using namespace clang;
19
20void Expr::dump() const {
Chris Lattnere165d942006-08-24 04:40:38 +000021 if (this == 0) {
Chris Lattner1b926492006-08-23 06:42:10 +000022 std::cerr << "<null expr>";
Chris Lattnere165d942006-08-24 04:40:38 +000023 return;
24 }
25 std::cerr << "(";
26 dump_impl();
27 std::cerr << ")";
Chris Lattner1b926492006-08-23 06:42:10 +000028}
29
Chris Lattner0eedafe2006-08-24 04:56:27 +000030//===----------------------------------------------------------------------===//
31// Primary Expressions.
32//===----------------------------------------------------------------------===//
33
Chris Lattner879b9ad2006-08-24 04:53:44 +000034void DeclExpr::dump_impl() const {
35 std::cerr << "x";
36}
Chris Lattner1b926492006-08-23 06:42:10 +000037
38void IntegerConstant::dump_impl() const {
39 std::cerr << "1";
40}
41
42void FloatingConstant::dump_impl() const {
43 std::cerr << "1.0";
44}
45
46void ParenExpr::dump_impl() const {
47 std::cerr << "'('";
48 Val->dump();
49 std::cerr << "')'";
50}
51
52/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
53/// corresponds to, e.g. "sizeof" or "[pre]++".
54const char *UnaryOperator::getOpcodeStr(Opcode Op) {
55 switch (Op) {
56 default: assert(0 && "Unknown binary operator");
57 case PostInc: return "[post]++";
58 case PostDec: return "[post]--";
59 case PreInc: return "[pre]++";
60 case PreDec: return "[pre]--";
61 case AddrOf: return "&";
62 case Deref: return "*";
63 case Plus: return "+";
64 case Minus: return "-";
65 case Not: return "~";
66 case LNot: return "!";
67 case Real: return "__real";
68 case Imag: return "__imag";
Chris Lattner26115ac2006-08-24 06:10:04 +000069 case SizeOf: return "sizeof";
70 case AlignOf: return "alignof";
Chris Lattner1b926492006-08-23 06:42:10 +000071 }
72}
73
74void UnaryOperator::dump_impl() const {
Chris Lattnere165d942006-08-24 04:40:38 +000075 std::cerr << getOpcodeStr(Opc);
Chris Lattner1b926492006-08-23 06:42:10 +000076 Input->dump();
Chris Lattnere165d942006-08-24 04:40:38 +000077}
78
Chris Lattner26da7302006-08-24 06:49:19 +000079void SizeOfAlignOfTypeExpr::dump_impl() const {
80 std::cerr << (isSizeof ? "sizeof(" : "alignof(");
81 // FIXME: print type.
82 std::cerr << "ty)";
83}
84
Chris Lattner0eedafe2006-08-24 04:56:27 +000085//===----------------------------------------------------------------------===//
86// Postfix Operators.
87//===----------------------------------------------------------------------===//
Chris Lattnere165d942006-08-24 04:40:38 +000088
89void ArraySubscriptExpr::dump_impl() const {
90 Base->dump();
91 std::cerr << "[";
92 Idx->dump();
93 std::cerr << "]";
94}
95
96CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs)
97 : Fn(fn), NumArgs(numargs) {
98 Args = new Expr*[numargs];
99 for (unsigned i = 0; i != numargs; ++i)
100 Args[i] = args[i];
101}
102
103void CallExpr::dump_impl() const {
104 Fn->dump();
105 std::cerr << "(";
106 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
107 if (i) std::cerr << ", ";
108 getArg(i)->dump();
109 }
Chris Lattner1b926492006-08-23 06:42:10 +0000110 std::cerr << ")";
111}
112
Chris Lattnere165d942006-08-24 04:40:38 +0000113CallExprLOC::CallExprLOC(Expr *Fn, SourceLocation lparenloc, Expr **Args,
114 unsigned NumArgs, SourceLocation *commalocs,
115 SourceLocation rparenloc)
116 : CallExpr(Fn, Args, NumArgs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
117 unsigned NumCommas = getNumCommas();
118 if (NumCommas)
119 CommaLocs = new SourceLocation[NumCommas];
120 else
121 CommaLocs = 0;
122
123 for (unsigned i = 0; i != NumCommas; ++i)
124 CommaLocs[i] = commalocs[i];
125}
126
127
128void MemberExpr::dump_impl() const {
129 Base->dump();
Chris Lattner6f3a1172006-08-24 05:19:28 +0000130 std::cerr << (isArrow ? "->" : ".");
131
132 if (MemberDecl)
133 /*TODO: Print MemberDecl*/;
134 std::cerr << "member";
Chris Lattnere165d942006-08-24 04:40:38 +0000135}
136
Chris Lattnere550a4e2006-08-24 06:37:51 +0000137
138void CastExpr::dump_impl() const {
139 std::cerr << "'('";
140 // TODO PRINT TYPE
141 std::cerr << "<type>";
142 std::cerr << "')'";
143 Op->dump();
144}
145
Chris Lattner1b926492006-08-23 06:42:10 +0000146/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
147/// corresponds to, e.g. "<<=".
148const char *BinaryOperator::getOpcodeStr(Opcode Op) {
149 switch (Op) {
150 default: assert(0 && "Unknown binary operator");
151 case Mul: return "*";
152 case Div: return "/";
153 case Rem: return "%";
154 case Add: return "+";
155 case Sub: return "-";
156 case Shl: return "<<";
157 case Shr: return ">>";
158 case LT: return "<";
159 case GT: return ">";
160 case LE: return "<=";
161 case GE: return ">=";
162 case EQ: return "==";
163 case NE: return "!=";
164 case And: return "&";
165 case Xor: return "^";
166 case Or: return "|";
167 case LAnd: return "&&";
168 case LOr: return "||";
169 case Assign: return "=";
170 case MulAssign: return "*=";
171 case DivAssign: return "/=";
172 case RemAssign: return "%=";
173 case AddAssign: return "+=";
174 case SubAssign: return "-=";
175 case ShlAssign: return "<<=";
176 case ShrAssign: return ">>=";
177 case AndAssign: return "&=";
178 case XorAssign: return "^=";
179 case OrAssign: return "|=";
180 case Comma: return ",";
181 }
182}
183
184void BinaryOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000185 LHS->dump();
186 std::cerr << " " << getOpcodeStr(Opc) << " ";
187 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000188}
189
190void ConditionalOperator::dump_impl() const {
Chris Lattner1b926492006-08-23 06:42:10 +0000191 Cond->dump();
192 std::cerr << " ? ";
193 LHS->dump();
194 std::cerr << " : ";
195 RHS->dump();
Chris Lattner1b926492006-08-23 06:42:10 +0000196}